QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5412|回复: 2
打印 上一主题 下一主题

python发送多人邮件没有展示收件人问题的解决方法

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-3-30 11:14 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    python发送多人邮件没有展示收件人问题的解决方法
    / }4 j6 ]- P& L' Y7 v这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    ( A8 U8 f  G+ l背景:; e+ i0 V) ^7 T' F8 E/ y
    $ g- W6 B5 q4 K" v- Q
    工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
    : P# A: c1 C3 |3 z% a- ^! g5 E0 d0 p
    问题:
    + `, ^4 G, e' W
    & @4 U" S6 \8 @6 c  O/ a6 P$ R使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容# z+ z0 O" \+ c/ Z
    6 \8 p- u  m' M2 G( e- Q
    问题代码示例:" {1 u3 \) ^* c
    # -*- coding:utf-8 -*-
    : H1 v( N0 W5 [9 C/ himport smtplib2 y. ], h) y' ^
    from email.mime.multipart import MIMEMultipart( z# N+ q" f0 {! A$ a# Y
    from email.mime.text import MIMEText' u+ W6 X8 A4 g, ~/ @4 M( q
    0 u0 ~! L0 f0 \4 w* K
    def send_email_to(fromAdd, toAdd, subject, html_text, filename):% D. a7 K8 G8 {  M
    server = 'mail.****.com'
    + C3 q; `7 h5 r9 r6 \ user = '*****'
    4 g) a) \' {1 ?8 {- Z6 A1 j8 _( n% x" Y password = '********'$ q- T3 h, l* R

    - Z& R6 E5 ?: H, v8 S/ i strFrom = fromAdd
    & r& E0 k' `& I5 D strTo = toAdd
    , L% l. s  [" p* I/ s3 R6 m- S  q6 C- R' W2 v$ }
    msgRoot = MIMEMultipart('related')" E1 ?; F" F# K: J
    msgRoot['Subject'] = subject
    9 `0 O) X+ L+ n/ |; r! ~1 X8 {1 m1 j msgRoot.preamble = 'This is a multi-part message in MIME format.'8 \" B7 j, w% \+ ^

    0 q' V  F0 x( ]: ?  w7 h msgAlternative = MIMEMultipart('alternative')
    2 X3 @! t4 z3 b msgRoot.attach(msgAlternative)# f/ q3 h( }9 i* D, d$ \+ G

    . d/ O# v4 a# z% c6 L3 u' w) }9 B, b msgText = MIMEText(html_text, 'html', 'utf-8')1 z: F: ?0 o3 }( V: U8 s
    msgAlternative.attach(msgText)
    3 F% X- s, W- T! M1 ?0 E* X+ N# p
    smtp = smtplib.SMTP()
    # m& |  Q& O  y smtp.connect(server)1 w: L; F6 u" h9 ]
    smtp.login(user, passwd)
    . H/ Y! t/ g6 @5 `4 x& h; H/ U, A2 [( r6 M
    att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
    7 |( c# f, u! i! ^: C att5["Content-Type"] = 'application/octet-stream'
    % @' n2 t8 Q6 Z: H7 Y att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
    $ Q& w2 K) W6 T9 h1 _6 V msgRoot.attach(att5)
    " o7 D! r. e# [/ I  Q( i) p! u; @3 w5 p/ C1 z
    smtp.sendmail(strFrom, strTo, msgRoot.as_string())  E2 c' X" v' C! _
    smtp.quit()* }: K7 A" r" `- g9 M' _
    return
    ! x; K% r. R. U2 N( x: a0 R2 @/ L5 K* ^3 F/ S+ V- O" r

    ' i  a$ `# {& Q9 w7 E- d成功代码:
    7 q7 D" B- C, y1 w* O#!/usr/bin/env python
    ! g& j) j) J* u, i5 l6 ], ^# -*- coding: utf-8 -*-8 e5 f: E; u9 I' D) A
    6 L% M! I. x2 w& y& i& E# Z
    import smtplib
    & P2 M9 ^* S# j3 o, e7 h& O: Pfrom email.mime.multipart import MIMEMultipart
    0 T! C% p+ S9 v) Ufrom email.mime.text import MIMEText! C7 Y% T; \9 Y8 a; n  w
    from email.utils import parseaddr8 `( o. _! {8 I
    from email.utils import formataddr! `( f. L; t8 I8 L8 ~( Z& H1 A2 ^
    from email.header import Header1 }5 N' Z0 T0 ~) V: f
    # c9 L9 L$ Z; c6 r, ?: F/ _9 e
    " \) T& L2 P. a8 o* k) X
    def __format_addr__(addr):
    $ p7 \2 z! R1 k6 h  j: d/ R$ D # 解析邮件地址,以保证邮有别名可以显示/ z2 S5 e' L0 `2 J1 n+ A7 u3 e+ I
    alias_name, addr = parseaddr(addr)
    5 c/ P. _% g* f3 C& A8 k # 防止中文问题,进行转码处理,并格式化为str返回% R4 s/ j0 I0 F) Z9 K& Q
    return formataddr((Header(alias_name,charset="utf-8").encode(),
    / O7 _: O* T9 x      addr.encode("uft-8") if isinstance(addr, unicode) else addr)). M9 J7 x1 [" U4 q$ f

    : g2 Y8 A# ~' z  }+ Z) g% y
    ) l' X+ C; d' A. |) Q+ r( Idef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):1 Q8 n% B" o: R$ u$ h
    / J$ ?1 V# d2 ~
    SERVER = 'mail.***.com'
    0 S" ^$ F5 t. w; R7 k USER = '******': @8 k1 @! k& s. u+ `
    PASSWD = '***'; M2 Q0 D" [: p6 W' Q
    7 g% `0 g9 Q8 h. ^$ U
    strFrom = __format_addr(fromAdd)
    ; h3 D! Q3 H+ k( x  Z+ g& x' ?4 R9 m  X7 i% s/ w
    strTo = list()
    : f* _; T* i- e1 g, g0 H # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化0 D6 K' K% v) F5 f3 R0 A9 @2 `
    try:( Z2 o1 F, {) t0 {" U
      for a in toAdd:
    ! a6 Z& i5 x9 D1 A2 D! u1 w8 ]   strTo.append(__format_addr(a)), e* d* L3 T. d" Z
    except Exception as e:
    ! Z$ d: F/ e9 @9 P/ X  A* o  # 没有对a和toadd进行type判断,出错就直接还原
    9 }. _+ b* Y2 `  u0 J- S9 x# @  strTo = toAdd
    2 d& Q2 [# H; c: |" [* ~& l
    5 d, P( j& n. W( K msgRoot = MIMEMultipart('related')) F8 \% Z1 {- @
    msgRoot.preamble = 'This is a multi-part message in MIME format.'
    ' g: ]+ n! m& N
    ( q7 _' ]! |$ |) X7 C2 z7 M msgAlternative = MIMEMultipart('alternative'); G& Z4 Q9 R$ x
    msgRoot.attach(msgAlternative)+ d7 K0 e3 I/ E* \3 v1 |9 I
      ~3 J7 G( K9 }( ~3 T& @
    # 邮件对象
    " K4 X4 b6 `5 g4 ]" ^# b% F1 ] msgText = MIMEText(html_text, 'html', 'utf-8')) b9 H' Z" i; s% H
    msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化6 O% y$ W- ?; y+ _
    msgRoot['From'] = strFrom  # 发件人也是被格式化过的% ^5 |$ u8 x* n* s4 ^& P% c
    msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
      T" J& }3 S* Z8 J' ]  B! R/ M msgAlternative.attach(msgText)
    * r$ \; @) a0 ]8 P: Z5 ~1 ?, ^0 @" V& I/ l1 @$ D2 @# e
    smtp = smtplib.SMTP(SERVER, 11)
    # h0 g9 Z* @8 i4 \$ X9 @( w% m$ L4 ~6 p smtp.set_debuglevel(0)
    * U4 n) c; ~# j% H8 `1 l9 D # smtp.connect(SERVER)
    " `8 ], M' ~- V% @ smtp.login(USER, PASSWD)
    + C: w6 `. [8 u! U6 H, W; j& | # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别8 o; X- k7 W- f* g2 |! c& u) c5 f* l
    smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
    ; D. Y3 Q% r4 l, _6 G& g smtp.quit()5 N& V* R3 n: D* v9 k5 Q, z
    总结:
    " s: Q9 a% u& K: c8 L: R' q0 K) }4 U, H- @6 I1 r, a/ z8 d
    看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo# b; d+ y6 E2 U; T" z' v

    , h( z& j" {1 t- ~2 `- @; F实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”
    " ?- q- D( b' F; o+ p$ U: l4 G( p
    同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
    4 X% z& C. e, M9 T( j0 T$ V4 ^/ h
    - {" B7 H5 V" p2 K; X( g还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
      d+ T+ t9 }' `, ~+ l* I最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得9 M6 k9 F' f+ j1 f4 I, X

    . b' b; ^7 j' }7 `! Y; `5 A,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员$ r! V, a# \6 f0 o- g

    8 ?8 M, i) G: E% U定时讲解Python技术,分享一些学习的方法和需要留意的小细节
    , k/ v- Y. G9 t0 y' T9 ]# y% e————————————————
    + A( I" j, B; r" z1 X原文链接:https://blog.csdn.net/haoxun12/article/details/105162947" W1 E2 m+ H5 {' c0 A( U) m

    8 q# X  A; l, P/ e5 p7 K) e8 T* P5 _% G; _, h; d  ?

    7 _* g  N+ A! Y$ b* ^
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

    0

    主题

    3

    听众

    92

    积分

    升级  91.58%

  • TA的每日心情
    慵懒
    2020-5-25 19:07
  • 签到天数: 2 天

    [LV.1]初来乍到

    群组2019美赛冲刺课程

    回复

    使用道具 举报

    0

    主题

    3

    听众

    92

    积分

    升级  91.58%

  • TA的每日心情
    慵懒
    2020-5-25 19:07
  • 签到天数: 2 天

    [LV.1]初来乍到

    群组2019美赛冲刺课程

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-8-24 07:49 , Processed in 0.661809 second(s), 60 queries .

    回顶部