QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6083|回复: 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发送多人邮件没有展示收件人问题的解决方法- t! N% `* J. m1 G5 V" b
    这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下- I: X- S7 e# Y/ y3 U9 b. D
    背景:  t1 W: ?3 S- X* n
    6 f( i8 L' M7 ~* g$ l; P
    工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人3 x: Y/ o: p  F; ?- |9 E. K

    $ B% D9 m8 Y- X! K; y* Y3 C/ Z$ f问题:
    2 O( }, c: C2 [3 h6 L
    2 C' o) |$ o) y1 ~5 n1 K使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容' ^% H) B$ P+ M7 M. [* n2 s  l7 ^
    * d7 W) K# w  l# E0 O3 O
    问题代码示例:. @* D; D* s1 T- J( W. F
    # -*- coding:utf-8 -*-" c& t1 t& n$ u# ~
    import smtplib
    : X  ]4 I( K6 Y: V$ Cfrom email.mime.multipart import MIMEMultipart
    5 {. I1 X; t+ A, ]from email.mime.text import MIMEText
    $ ~, t( N0 D) _6 V, A+ h+ q7 V: ~7 G4 t; P
    def send_email_to(fromAdd, toAdd, subject, html_text, filename):7 D! G' l5 @/ F: U' C# k8 g
    server = 'mail.****.com'
    ) R5 f" c7 R! q/ m5 r8 H; M5 ? user = '*****'4 F3 i6 r# e+ R7 |
    password = '********'2 n" O: l- ]: \- d7 e  \

    $ w/ t6 o$ G# p( p strFrom = fromAdd
    1 g3 {5 r  T6 @# D! M strTo = toAdd
    ' \) D7 T! s( |+ {. b( o/ R: U/ F; w+ G/ h- i! |9 F
    msgRoot = MIMEMultipart('related')
    9 `( T* {( J' X  x4 w3 o$ W msgRoot['Subject'] = subject
    - @9 [1 P7 Q& C5 k  J msgRoot.preamble = 'This is a multi-part message in MIME format.'; o- f, ?1 r; ]- s$ _: h+ ?- @
    * A- A5 u2 D- F) q+ N& p3 ^" ~# y
    msgAlternative = MIMEMultipart('alternative'): o& k7 A1 \9 J% r& v
    msgRoot.attach(msgAlternative)" i- d* X; N5 ~
    9 W/ o) Y, t$ H: j, C# d
    msgText = MIMEText(html_text, 'html', 'utf-8')+ L3 W+ M0 @. P( p: M$ ^# D# u
    msgAlternative.attach(msgText)1 d; V; S; b' \

    2 i( n" C( t; s0 a1 h' o, H* s  X smtp = smtplib.SMTP()/ ^$ j1 C4 b; E) [
    smtp.connect(server)5 ]4 V1 Z' K+ r# j' H
    smtp.login(user, passwd)/ c7 u  u( B2 I; l' [5 b. {/ S
    * D% ]8 i: J  W
    att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
    ; o8 B; x6 U0 Q) ^3 M* ~+ X* ~ att5["Content-Type"] = 'application/octet-stream'$ `7 g9 D9 |* s
    att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
    0 `- C/ M& l9 Z6 j# n4 V msgRoot.attach(att5)
    8 c2 L9 u: ]% H5 M- ^4 J
    # a7 p$ l, h6 W/ R$ k2 Y smtp.sendmail(strFrom, strTo, msgRoot.as_string())
    ( K3 _3 K) q7 h( E smtp.quit()
    / c8 @& V; B2 N. L. `: `. t/ f1 h; Q; X return
    4 x+ c5 `+ q8 r6 s: b. I6 C6 F0 u, q# s: [" _& e

    ' @1 x; F+ \7 T8 w成功代码:+ M) d, @8 P" a) G8 d. `' n$ S
    #!/usr/bin/env python
    * B0 Q6 t1 p% W- Z# -*- coding: utf-8 -*-
    $ S, J( q7 H# ~) z3 B" i; m8 I! S/ @# g; w; a6 U. }
    import smtplib- H" g' q+ C* h- q9 H
    from email.mime.multipart import MIMEMultipart$ R3 d6 p4 n. F) l0 r5 v
    from email.mime.text import MIMEText
      t+ O; |9 b  B  ~, Mfrom email.utils import parseaddr/ b4 A- Y2 m4 J$ O
    from email.utils import formataddr! e6 a* @7 T; J9 }- p( c
    from email.header import Header7 w. l' C7 S+ k) k: D8 s  o* o! o
    # s- ?2 R! X0 ]) o" s. W3 W

    ) O5 v/ }- j! D4 [+ r. ~# Rdef __format_addr__(addr):) ~. i7 g1 A8 U% |+ {4 d( I) O
    # 解析邮件地址,以保证邮有别名可以显示3 G7 O0 f. p0 p4 b5 ?1 [
    alias_name, addr = parseaddr(addr)
    , M0 {. }+ ~' R" U7 e" \ # 防止中文问题,进行转码处理,并格式化为str返回+ A9 k1 b, c6 k' w1 K
    return formataddr((Header(alias_name,charset="utf-8").encode(),+ y+ ]" \, C; A% i; c% n! p
          addr.encode("uft-8") if isinstance(addr, unicode) else addr))
    , p" S/ s  l5 m
    ; K! C4 T# d% }2 S# X- e/ x* q
    9 `" q% T$ {) n# p+ c0 A  Ydef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):' \% n$ d% F6 h+ Z, \  `4 |

    7 ]4 B- ]4 k) b) a! u$ `0 N# u6 i SERVER = 'mail.***.com'
    / N& U, R; T2 ] USER = '******'& h4 d3 U& N( Z9 m! p: J0 X. s% ?
    PASSWD = '***'9 w  y2 ]! ^" c1 r) h1 p

    - q1 G; q& `, T% e1 \ strFrom = __format_addr(fromAdd)
    , R* V" X4 r. O' a/ L- i" `/ z8 S- b" F+ o
    strTo = list()$ A* S, h1 M& r) F# D6 _& S
    # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化- j5 h( N- T4 g" P' T2 \' t
    try:
    * k' h% z: {0 R: a0 ~$ L1 R6 M  for a in toAdd:
    & g. {% c2 f5 R) Q% M! j, o# P( a& y   strTo.append(__format_addr(a)): [5 a" E( Z1 [+ |
    except Exception as e:  g7 C" c+ u/ F1 z) f
      # 没有对a和toadd进行type判断,出错就直接还原
    # T' V+ \6 c- l  strTo = toAdd8 l( ^+ H9 e% T1 C3 P. z

    , Q2 x1 L+ ^. v! h msgRoot = MIMEMultipart('related')
    , r! D2 \! t7 n% B8 ^ msgRoot.preamble = 'This is a multi-part message in MIME format.'
    7 h: l/ r" `. c& l4 O
    . k( m  m9 ]# I- r% B msgAlternative = MIMEMultipart('alternative')5 W5 g/ V5 F8 r0 o2 Z
    msgRoot.attach(msgAlternative)
    . `9 q" B0 k2 H8 q" y4 o4 r4 C: Q: G% ]% J2 R
    # 邮件对象
    # Q+ q; }/ ]+ p' v7 j msgText = MIMEText(html_text, 'html', 'utf-8')
    " X0 I7 e( G0 \& |9 a, F( ~4 f msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化( e4 W( g& |+ t: P% G$ v7 C
    msgRoot['From'] = strFrom  # 发件人也是被格式化过的7 r; X7 h; U+ @0 H
    msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”2 d# h; r3 p5 _7 {
    msgAlternative.attach(msgText)
    : F6 y" |1 p. m3 c+ S
    5 d& c2 }0 X; }, D: F smtp = smtplib.SMTP(SERVER, 11)
    . `8 b% r0 {( g8 E- z# [ smtp.set_debuglevel(0). L- ]  p) R, K. U  @' T
    # smtp.connect(SERVER)& V# x) X  R5 @" o5 h
    smtp.login(USER, PASSWD)2 [" K0 L8 w+ A% r# c
    # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
    % @0 q, T5 S# N3 P. }# K6 v; p, X smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
    ( t: t. m3 C- Q3 G# T smtp.quit()0 x, U" p  Z4 Q8 u; D
    总结:
    7 J+ a0 i, A0 o# E, @3 ]5 C4 p; V7 ~, G* F/ E2 @) V  N- j2 M
    看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo/ j+ x9 r* o; k  L% ~

    * ?  Q7 y& X6 u: w( S7 r- Y& {实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”
    ! C1 a# {2 @; [' u7 a: Q
    , L+ j- X5 y% S* E同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
    ( E1 z9 Z2 ?; g. K% z- K9 }. X7 P; w3 d. W& S% R5 t& G
    还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。' x0 ^( _1 B+ V" P0 o9 v
    最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得+ P0 V, s8 Q3 }
    $ u: E  U- m7 T
    ,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员- G. X+ E: j6 _- u* F, U5 Q7 b+ }

    ! q% H0 X: p4 J+ I8 R6 C定时讲解Python技术,分享一些学习的方法和需要留意的小细节
    , i6 v& g+ H0 X2 `+ Z————————————————5 n& I$ h1 C" ^  W6 S
    原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
    8 m% Q, m  Y% I
    % ~2 h3 t5 N5 j) a: y$ k' M; M$ ]* d, D$ ?7 }. I; ~; B
    ' D; R# s8 x( O6 t
    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-6-4 07:07 , Processed in 0.472010 second(s), 61 queries .

    回顶部