QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6055|回复: 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发送多人邮件没有展示收件人问题的解决方法6 t% G" ]( b9 D! k+ ]
    这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下/ q" z' Z! w  Q. g0 c& f
    背景:
    & C8 U* U. e, ^+ \5 l: Y9 [, z" O6 a
    工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人6 D- L$ w0 Q' p3 s4 i  P8 ^% u
    9 g$ L& O" X6 |  H, e
    问题:' ~$ o9 w7 h1 u; A

    , |6 C  ?* n) f3 q3 {/ z2 W使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
    " \8 o0 j& u2 `2 K1 J# r6 }" b. y0 U- _3 u: V' `9 I0 Y
    问题代码示例:6 }+ e. F, m4 E
    # -*- coding:utf-8 -*-
    : }: y* @( z* r& S" C. zimport smtplib
    9 i' ?6 T1 r& J4 f3 Lfrom email.mime.multipart import MIMEMultipart5 A0 ?9 P8 x* [+ o* x
    from email.mime.text import MIMEText
    1 L- l! y- g2 S/ W. \
    / g. j' e  V) j- y* E: `- `def send_email_to(fromAdd, toAdd, subject, html_text, filename):
    $ B$ P  z' J, Z+ t* W& k server = 'mail.****.com'; V3 d* c  D( t/ N. J3 I0 ?. w
    user = '*****'" I4 l  r4 Z! c
    password = '********'( H" u. z9 p0 T  N, y; O' [# w
    0 t5 [- \* ^6 S
    strFrom = fromAdd
    * x. V5 R1 w0 R  G: S/ K% C strTo = toAdd- m. f1 |$ n( c$ g9 d4 H
    % b3 G4 E0 \- k+ _7 l( \/ D. I
    msgRoot = MIMEMultipart('related')
    ( B0 T" D/ G, ?* L# L4 \ msgRoot['Subject'] = subject
    5 ^& ^1 n& l$ f msgRoot.preamble = 'This is a multi-part message in MIME format.'* [8 S( t3 Q7 a2 l5 T' O5 t
    . {8 ]- G% c8 X* f1 t' ~) V
    msgAlternative = MIMEMultipart('alternative'), K* X4 Z, X9 N
    msgRoot.attach(msgAlternative)
    " d, `$ e4 P% G7 m
    4 U. c6 p6 L( q9 I& g& @6 c msgText = MIMEText(html_text, 'html', 'utf-8')& q( E* K9 E7 Y/ h6 w
    msgAlternative.attach(msgText)
    0 J  A7 w5 Q: h/ M* B) F* b3 O# c
    : ]9 p% _! n# a: S. b) j smtp = smtplib.SMTP(): ~8 Z5 v! E8 N  [& L) n
    smtp.connect(server)# n/ x6 F' U! o7 F" w/ S
    smtp.login(user, passwd)+ z9 T7 r; U% ]* R. z; M
    ( r% U, {8 h# \8 \
    att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')- s4 h% {5 x- u! }" y0 u
    att5["Content-Type"] = 'application/octet-stream'2 S% `3 a) t5 W4 P5 K
    att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'! I3 }% e" t" U+ q
    msgRoot.attach(att5)& k& n' Z* I4 |) s5 W: P
    # q  k' \" g" E9 [+ @: M5 ]! X
    smtp.sendmail(strFrom, strTo, msgRoot.as_string())  f6 M) @4 a( i' x' d: ^
    smtp.quit()+ G- v  m' ^* t1 C
    return; C6 R! n7 G1 S! j& K2 b) L% G

    3 ]3 u: W; S, s, J' @. P5 t2 O8 \- q6 `3 e# O! V0 W
    成功代码:0 T6 L  ^4 Z+ i( Z5 _4 {* B
    #!/usr/bin/env python
    3 F* C+ N5 x) u  ]( w' x/ p# -*- coding: utf-8 -*-
    0 I: z* V; c7 D2 E6 t0 l" X1 x  h1 z% `% ~# W4 O7 L
    import smtplib
    3 o, J2 Q6 f$ Ufrom email.mime.multipart import MIMEMultipart( _$ ^6 Y3 F  J8 l9 ?
    from email.mime.text import MIMEText
      T! H) f6 D4 G6 ?from email.utils import parseaddr( i* F: M; A+ {, i
    from email.utils import formataddr
    ' |2 s( A* c* \) Vfrom email.header import Header  n. `9 h. _+ @/ f7 y7 y

    / p) K! d: I8 k8 N8 ]0 O2 T0 c" W, V! d( ?
    def __format_addr__(addr):4 M' r, w$ k; ]. A( M% Y
    # 解析邮件地址,以保证邮有别名可以显示  h5 f9 ^, }- E: q. ~9 |
    alias_name, addr = parseaddr(addr)9 k% Z# b' c9 v- H7 h6 `
    # 防止中文问题,进行转码处理,并格式化为str返回
    ' Z! i% |" S4 ]; f return formataddr((Header(alias_name,charset="utf-8").encode(),) A- |2 G- L% i) n/ I" {5 ]! u# r
          addr.encode("uft-8") if isinstance(addr, unicode) else addr))( i& A- x9 X: C; q. B7 O! O$ r: U
    . u- F  q+ R' f& ~+ N

    ( P1 X. ^: W2 u8 I1 ]def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
    % @! z9 H6 p# s8 `+ F7 O, R& q
    4 R/ J. X, v6 q) j4 S SERVER = 'mail.***.com'
    $ H+ k- l$ Q! g5 ]+ | USER = '******'
    7 b+ a" a  o% U, {% F2 S( p0 ? PASSWD = '***'* m- S" j2 Z- G- N+ T/ w

    ; H& Q) W- W) {) c( r  N7 b+ R( S5 z strFrom = __format_addr(fromAdd)  a! w3 A; L+ f$ W% m5 t

    & Z" G5 f9 M( ^8 Z/ Y- r" q strTo = list()
    ) ~, z& W, a) C # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化' j; b  W  @- Q* O3 R2 Y6 A/ i. q
    try:. o3 z: f* _& ^2 t+ b' p# Z; ?/ k
      for a in toAdd:3 R$ [) X, c$ {& T; m' y" U
       strTo.append(__format_addr(a))$ e3 z  I; k+ y' L, D
    except Exception as e:
    8 {& o8 _0 j  x) I2 u; s3 p# Q8 X- \0 P/ U  # 没有对a和toadd进行type判断,出错就直接还原
    2 s" {% a  u6 Q+ G! u6 |  strTo = toAdd
    " q* j+ T4 l2 }9 n3 d8 L3 S8 F
    " H7 Q2 D0 {/ ~1 p9 E  t) u msgRoot = MIMEMultipart('related')( G9 q% q- J& z5 W( A* ?+ s
    msgRoot.preamble = 'This is a multi-part message in MIME format.') D- h5 }6 W( K8 W# k8 Y, V& g5 u2 V

    : S0 F$ ^) n+ Y9 e msgAlternative = MIMEMultipart('alternative')
      p; i/ q% G$ x* y; {' W% e3 { msgRoot.attach(msgAlternative)
    & q: y8 c' r7 ]8 j" m: [5 ]* n6 O5 P5 \. v
    # 邮件对象   ~4 `# h7 R' c2 M0 F" J+ ^: p
    msgText = MIMEText(html_text, 'html', 'utf-8')
      q% P& V- m2 m msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
    9 u4 ?7 y, g  J; `- o8 D% S6 Q msgRoot['From'] = strFrom  # 发件人也是被格式化过的3 T1 a, _' _$ s3 H* U
    msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
    : Q. r1 D' G; K5 T. o* { msgAlternative.attach(msgText)
    4 P3 L7 N7 o8 w% [/ ?; d
    ! G2 v& T- R7 V+ [- L* _1 } smtp = smtplib.SMTP(SERVER, 11)6 W/ x- y( M+ y% ?
    smtp.set_debuglevel(0)6 y; I  |8 m2 X6 T* D) d
    # smtp.connect(SERVER)
      @3 T8 g& y& U- Z/ |1 U' H- R smtp.login(USER, PASSWD)
    * G9 o8 F- z2 M. {( w7 ~- V # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别0 k$ s) |4 d% U% Z2 S$ ?
    smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
    ! j+ W8 o( B- x9 X! Q smtp.quit()
    / R  k# t, q* o8 J. [总结:; T1 @% q. H' t  H; K
    1 ?; P/ C7 Q" t' I$ f
    看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
    " B) N# ]9 b4 n; q+ L  S; g
    $ u; k. y5 H/ D* o$ L  C/ S. u实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”6 N0 H$ z2 S0 T/ {0 T

    7 u' u& q8 |$ E同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型- r4 I. }1 ~9 K  X5 |: o

    $ g  X: v8 {6 ~6 b; e4 V3 T还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。; u+ q& t2 P+ I# Y) L" m+ X, o+ T! A- W
    最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得! g. M7 W! h8 ~
    : m* A* T  D: M3 n- e) a* j( F  ]' s/ S
    ,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
    1 ?5 E# A7 b! u* ^
    : A+ J. c4 u! _# i* Y: J" p定时讲解Python技术,分享一些学习的方法和需要留意的小细节
    $ q7 t1 g/ q. E# m) I1 X————————————————* }, L% |( x3 X  f: H$ x( F
    原文链接:https://blog.csdn.net/haoxun12/article/details/1051629475 i" ^: B7 P6 N0 q7 H

      G! P2 q) F' |! S- }/ a6 Z: A6 Y1 `
    $ Y3 E3 R0 r( m% Y$ u* A
    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, 2026-4-18 12:05 , Processed in 0.540548 second(s), 61 queries .

    回顶部