QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6137|回复: 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发送多人邮件没有展示收件人问题的解决方法) I% k; b( ^( Q) H- t
    这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    5 x, q+ i3 W! I# r背景:8 Q' I* G7 z6 R$ N
    5 e! Y# M) n5 }6 t
    工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
    + S$ X2 [" \. ^! I: P
    # |) ~% y! n* a0 {7 {) K  m- R7 A问题:
    & r+ {( M" U3 f6 O- u" V2 v  |) e/ S8 y1 ]+ i! H
    使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
    , P2 \0 k6 d) ]  H0 z  v
    1 R# }5 k9 f! A, Z. |问题代码示例:9 ^1 l7 o) f( H' _
    # -*- coding:utf-8 -*-
      p! L+ L: ?0 ]: vimport smtplib
    5 G: f: t% m+ Q( Gfrom email.mime.multipart import MIMEMultipart
    6 i+ u2 v8 h; ^! U2 {from email.mime.text import MIMEText  h; I" n$ D, J. h4 U; ^
    ( a8 k/ u& u) D$ h" z5 [% K  L
    def send_email_to(fromAdd, toAdd, subject, html_text, filename):( Z  q! I4 J% d+ K& f. n4 R2 C
    server = 'mail.****.com'
    6 |! R$ A, D4 u" L user = '*****'4 {' m. t  i% w, g3 D9 W
    password = '********'# j; s$ h5 I  v1 s( M
    0 \/ L1 J) z2 t, Q' z4 @" h9 i
    strFrom = fromAdd- i$ M( s# N( O+ r9 @
    strTo = toAdd
    ; v" z  E" Z  u% I" o/ ~
    # t' d7 G) H$ N! B  }: ^' O0 b0 r msgRoot = MIMEMultipart('related')
    5 e+ K! a$ [, D6 h2 A msgRoot['Subject'] = subject
    $ ^* S8 C& t. q; C1 w( J. ?- J$ J msgRoot.preamble = 'This is a multi-part message in MIME format.'# \" Q0 X( @4 a3 @: F

    * E% h, y  ^. a msgAlternative = MIMEMultipart('alternative')
    ; @# ~% j% l5 W1 w$ t msgRoot.attach(msgAlternative)' W1 X* {3 o2 b4 W. v' f

      K/ d9 k( L1 F# U  f2 k msgText = MIMEText(html_text, 'html', 'utf-8')* s- q! |2 Z. w) m' _
    msgAlternative.attach(msgText)" X  I2 V, f0 \/ |) f% ^; A+ b4 `
    " Z, \, }( c7 N; n* H
    smtp = smtplib.SMTP()
    % M4 S! }- M$ Q- A* u smtp.connect(server)
      V0 [$ {& s0 f4 F: P$ O  Q smtp.login(user, passwd)
    4 V! R9 }2 \  `, M9 Q4 P2 j. T* L
    * o; i) i9 L: n# p" s4 g- w% u# ] att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
    8 m% `$ e9 `* @ att5["Content-Type"] = 'application/octet-stream'
    ( c: C' G+ D; \% ? att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
    ) v& v/ \6 V" p  V8 Y8 G msgRoot.attach(att5)/ U- Z, o& ]6 c# h# v1 E1 o& W% x
    % S7 e3 Y5 G0 V5 @- U+ ~
    smtp.sendmail(strFrom, strTo, msgRoot.as_string())
    : O8 {+ @) M2 F* \5 J smtp.quit()
    ; P1 O  D; h8 P4 H return  G$ {* Q7 ]* k  x

    , W8 m0 j! {" T" @0 _
    " G" D( l+ p% A成功代码:& q/ }0 M$ D4 \5 p
    #!/usr/bin/env python
    8 E- S9 u' d/ I# -*- coding: utf-8 -*-
    4 P0 E  o  u/ X# |6 _  |* X
    3 r: W# g/ U5 kimport smtplib
    $ b- K, w$ X: s7 c+ L4 Ufrom email.mime.multipart import MIMEMultipart# z5 s1 p( U% p) G0 B7 k0 C4 X
    from email.mime.text import MIMEText
    0 o9 _# }2 v0 s! I- Z/ tfrom email.utils import parseaddr
    7 g3 _' U3 \2 b; q2 D8 `# w0 A/ Rfrom email.utils import formataddr2 A7 A& s# \: k' {, ~5 q. \
    from email.header import Header
    6 q8 ?1 f# y0 [3 K: R! W# y" u) h9 k, I9 g7 C$ {7 O1 C

    . c5 B2 M* W8 [def __format_addr__(addr):# _0 q) K5 Z" `0 G; j8 u
    # 解析邮件地址,以保证邮有别名可以显示
    ; ]$ P0 y8 T5 f- @" A alias_name, addr = parseaddr(addr)0 c6 C  `/ }6 I. \* _
    # 防止中文问题,进行转码处理,并格式化为str返回7 J4 N  K/ t7 Z  ~0 u6 Y
    return formataddr((Header(alias_name,charset="utf-8").encode()," m  W5 ~* B& K) w3 u+ m
          addr.encode("uft-8") if isinstance(addr, unicode) else addr))
    . I/ N2 i$ @2 H. o( C1 y$ e
    % X0 v1 s+ J7 S! o8 u. v. [; O6 b
    5 u9 f  o8 J- a# E6 s6 c9 y# Zdef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):& g3 Z3 I0 H' u8 m9 c) z
    8 [' S3 G% N* u2 I7 n8 f+ @
    SERVER = 'mail.***.com'
    - F  {0 U" g' `  ~8 h# p$ c USER = '******'
    . x; ~# q, i( L$ i* d PASSWD = '***'
    , `4 ^% l: I, e/ C) _0 c
    1 I8 x8 l; w: _1 Q% N strFrom = __format_addr(fromAdd)$ _2 a* ^+ O: I. n/ s% D: U

    : h, n6 U* v8 ^1 y- o& R2 ? strTo = list()9 H3 [) J' ~. {& ~7 i1 _
    # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
    ) {$ [; I5 K; Y8 v try:* A* b( Z8 N4 G: r1 V, S
      for a in toAdd:
    9 i8 A/ j% G5 p3 F   strTo.append(__format_addr(a))3 _% S$ V- i1 I  r9 W& W
    except Exception as e:' ]6 H6 u1 ]$ h( g: ?
      # 没有对a和toadd进行type判断,出错就直接还原/ y0 x8 _$ S, N! t+ l, _; W
      strTo = toAdd3 B/ D+ T; s: ]% ^% h' U7 S7 e( }: Z
    # R3 W  C2 P6 ], R8 @6 d$ K3 S
    msgRoot = MIMEMultipart('related')
    0 @: X5 |4 N  A4 D% g4 p8 v5 l msgRoot.preamble = 'This is a multi-part message in MIME format.'- ~( [: X. Z/ m' ~4 ^
    $ x+ j' ]6 u) _' [) d
    msgAlternative = MIMEMultipart('alternative')
    ( {3 v9 o2 n2 x9 w msgRoot.attach(msgAlternative)% r* |( f# ^; E- `% o4 Q
    8 u& O0 ~) X) @) d# x$ e, h1 m
    # 邮件对象
    & t% @8 `. [+ }' v- M1 y msgText = MIMEText(html_text, 'html', 'utf-8')
    , T' I% n; _5 d; {. `! L9 f0 p msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
    ' I' l" ?$ l+ a& ]) P msgRoot['From'] = strFrom  # 发件人也是被格式化过的8 b; f$ T2 d( k/ s
    msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”4 q2 [& U2 C8 Z9 ?1 K
    msgAlternative.attach(msgText)& I. Y( Z2 a9 G6 S

    7 c8 T$ M( M' ?& C% T, C/ i smtp = smtplib.SMTP(SERVER, 11)' r; a$ ^3 M+ h6 L- S1 ~
    smtp.set_debuglevel(0)& \% P% r! L  a1 r4 J' ^+ x2 E/ M
    # smtp.connect(SERVER)3 b* p$ I: \# j3 ^3 v
    smtp.login(USER, PASSWD)3 G6 W# t! x! K& I8 L+ h$ N
    # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
    2 r$ l3 Z& X1 A smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
    $ |6 d5 n; k2 |0 z' ]5 `5 O* K smtp.quit()8 F  @% o- t- m6 O
    总结:
    : l3 `* Y( J; s( K0 g; v) _9 j/ J) C  R& l, B: q2 F
    看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo0 I! U. Y8 y8 s. ^( D
    9 d0 C* U, H# R3 p, m
    实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”6 |2 n  i' Q  m2 f2 u
    1 S4 ~) f  J& k
    同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型2 h% d( h+ D2 W6 F+ P& F/ D
    / m8 j/ A/ q5 E; J5 q5 W" H- Q( a
    还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
    ' U* t+ O9 \1 ^( V9 d最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
    " h' i9 \! n. v' _( W3 a  n0 C" i% l3 G
    ,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员% D% ]9 J: N$ \) s% j

    ; N. `% V' Z% x' ^5 z定时讲解Python技术,分享一些学习的方法和需要留意的小细节/ `% A5 \9 m- m: @; u$ ?
    ————————————————
    ! f" O  g; Y4 c8 {& s9 C* N原文链接:https://blog.csdn.net/haoxun12/article/details/105162947/ a( M+ H  H  V8 m! U+ K) I

    9 i8 \9 }! ?1 f3 j7 A+ D5 u4 O* H5 z) T  l! J! B  F; R. K# P/ B( ~

    7 Y0 {+ A( E* v/ h1 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-9-1 16:36 , Processed in 0.467921 second(s), 60 queries .

    回顶部