QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6107|回复: 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发送多人邮件没有展示收件人问题的解决方法
    ! p# X% m! c3 M. }5 Z这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下1 {5 c7 S- ?# ?; K( R  N8 F
    背景:
    9 S, C0 J: E4 s9 B( w  C) l
    0 h- |+ s; K, p( s: O! u工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人& G( `4 m9 c- ~3 y: O: T
    9 L2 \3 }7 P& K0 }! d
    问题:
    ' }( W/ Q, b" b8 K, Z
    6 ^- K0 b8 O% w1 O1 ^使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
    1 R0 \3 D# T7 v5 Y8 ~/ m5 W+ O+ Z; u( _- \! h
    问题代码示例:0 J" V1 |. Z  O- A2 g' z8 f3 D
    # -*- coding:utf-8 -*-
    3 _+ m6 c. F; l0 [8 Iimport smtplib5 y% J9 u1 E3 W( v5 l# `- b8 g( D
    from email.mime.multipart import MIMEMultipart
    $ ^; W& g3 v3 s2 U! _from email.mime.text import MIMEText! z+ I. N8 J4 F! s
    . l; L2 _1 Y" n7 N/ d
    def send_email_to(fromAdd, toAdd, subject, html_text, filename):
    ; U% G# y, b0 [8 ]# d server = 'mail.****.com', ?* b/ ^7 Z: x! O/ ?* A- ]) I
    user = '*****'
    + ]6 v" n: V0 d! v3 Y password = '********'
    0 m# N- g9 Y& g  i# y5 E0 Q. m5 t7 P1 u  {# P0 ~$ d) V8 m& q
    strFrom = fromAdd* F; B! S7 J# M% u
    strTo = toAdd
    3 x+ O  M: b2 T$ X1 Z0 i
    + P0 Y% X2 t" B8 l8 K9 ]7 x msgRoot = MIMEMultipart('related')9 n5 l0 n, x. n: Q; s
    msgRoot['Subject'] = subject
    8 f) g* \4 `" C# K msgRoot.preamble = 'This is a multi-part message in MIME format.'% a) y/ s( [% ]) \

    7 m6 p6 t: F4 G: S' ^" O  e# g! z msgAlternative = MIMEMultipart('alternative')* l$ r7 U& l, U
    msgRoot.attach(msgAlternative)
    8 A6 Z5 c8 T2 W7 T
    ; P! n- d" Q% x* o msgText = MIMEText(html_text, 'html', 'utf-8')
    . `6 N# e4 z+ a/ K+ j( w- j msgAlternative.attach(msgText)3 V* Y( i9 K0 v: B

    # O4 F, R# J. w5 d  \- o2 ?4 H smtp = smtplib.SMTP()
    3 f8 D' f5 ^3 Y9 e smtp.connect(server)  C6 D6 [! z; W
    smtp.login(user, passwd)6 a: l2 l# s& K0 J% D( @

    + T* Y% X2 k: ~, u' ~' F9 [2 r att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')" O' G! z3 H" W9 A( K# M6 F
    att5["Content-Type"] = 'application/octet-stream'9 h9 R" [5 U: c1 o# j
    att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
    9 ^: M7 u) z* r msgRoot.attach(att5)! }1 ^" D( f8 l% j& r: b
    + M5 J; c2 I2 t5 W; ], x$ Z
    smtp.sendmail(strFrom, strTo, msgRoot.as_string())/ L% x; U# f8 N# ]
    smtp.quit()
    / M! X: N: v4 ^- {6 G( R) A0 H  _- k return+ ^3 i% b3 ~5 g& e1 s

    9 Q, x. w/ R2 r+ J  t+ m: w( p4 V
    ) M& ]3 f& ?- ?5 C: ~成功代码:- y0 _& U8 Z& ^3 M! L4 O3 `1 v
    #!/usr/bin/env python
    # w0 J! [! O8 E& A8 x' y/ z# -*- coding: utf-8 -*-
    $ Y* g4 j" S6 G% x$ b( N* S4 B/ c; `9 n" S  l6 n2 F) [: y
    import smtplib, N; h0 \4 q7 a
    from email.mime.multipart import MIMEMultipart
    7 U* w0 q8 I5 `3 \( f. ^from email.mime.text import MIMEText1 M# F3 \: u3 B$ u  s, ?+ ?9 ]
    from email.utils import parseaddr
    4 |1 G5 F; |: ]5 j  ^from email.utils import formataddr
      r/ {; b# d. T4 z4 |from email.header import Header
    ; P# O5 t# }" Y( G6 p- H4 E$ z. E1 P) a3 z6 ]

    . A5 ?7 Q5 K  x8 J; @def __format_addr__(addr):- J2 Q7 t( j! \& \, D
    # 解析邮件地址,以保证邮有别名可以显示0 ~5 K+ z+ Q% i! t7 O
    alias_name, addr = parseaddr(addr)
    " X1 m$ G( v' {/ e7 @* { # 防止中文问题,进行转码处理,并格式化为str返回
    1 O3 _0 T8 C! Y5 D- Q3 Y return formataddr((Header(alias_name,charset="utf-8").encode(),
    + v6 a2 E$ W1 g0 d, I- }& ^      addr.encode("uft-8") if isinstance(addr, unicode) else addr)), P. _" |7 y. \. I/ K$ i$ }3 e; X

    & T/ b1 O  y( i4 q+ f1 h/ Y( v5 Y& P& R" q$ P/ W- Z
    def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
    6 F' n# n" S8 V0 f; S& w9 h
    4 h! W( N. N2 k' ]- G' J  |5 K SERVER = 'mail.***.com'
    " @& _, m* `2 a$ |/ l5 \9 q USER = '******'3 P6 H6 }; G% J: m2 v
    PASSWD = '***'. l' `8 _( t8 }* g. m( w

      M% h$ P6 u; V6 m' H! c strFrom = __format_addr(fromAdd)
    1 C  g5 D0 U( G* y
    3 d+ s+ L/ r7 N strTo = list()8 w- X6 ?# z) v5 t3 ^  d
    # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
    - U6 s4 p7 u- m/ H$ b$ K5 A try:
    * i% p3 u( o9 h2 D. ~& c  for a in toAdd:
    5 X# p1 `0 W  f$ N) d$ |   strTo.append(__format_addr(a))
    # N- V6 X. Y$ p6 N4 n except Exception as e:7 C& m, }$ _. Q# d
      # 没有对a和toadd进行type判断,出错就直接还原
    * `' e% i& I; J+ x! l5 p' _* J  strTo = toAdd
    2 y0 M4 Z- H0 M
    6 R& b5 f% s4 a7 s7 O6 |& {3 }$ m- M msgRoot = MIMEMultipart('related')0 {7 o- r0 {" Y0 m
    msgRoot.preamble = 'This is a multi-part message in MIME format.'
    3 P* B" r3 B9 ^* h, M  r* e  X( ^" o5 p2 ?6 i! W! t, A' y/ B
    msgAlternative = MIMEMultipart('alternative')4 w  Q7 ^+ _) \# i+ u
    msgRoot.attach(msgAlternative)% A+ c/ V# i" x3 W% o  J1 R7 `' [

    9 q, W9 E# B, D: G( h # 邮件对象
    3 y# L4 D( d/ e! O1 \ msgText = MIMEText(html_text, 'html', 'utf-8')
    0 H, }9 P  E% [' L9 Q0 }& _# j msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化6 g$ B& r) h/ e$ z
    msgRoot['From'] = strFrom  # 发件人也是被格式化过的5 \" n: Q1 V! }" M8 ?$ \# b2 \6 |
    msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”) Q3 C; [# d/ Z6 D$ A
    msgAlternative.attach(msgText)
    % y& K' Z5 ]# E0 U0 N4 U, F8 S- ~* b6 d* W: l! W# E# V2 ~
    smtp = smtplib.SMTP(SERVER, 11)( _3 p4 E/ I( W
    smtp.set_debuglevel(0)" T2 |% F0 L" T& u; G  c
    # smtp.connect(SERVER)+ q0 @( X" x. T. ^0 C. P
    smtp.login(USER, PASSWD)  r. }5 r% a$ P( V8 d/ i
    # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
    : {5 O4 r5 N4 u( P smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
    $ D9 o3 l# h' v% W! `+ ? smtp.quit()0 ?( X4 p$ L8 {) @1 `9 n3 }  H
    总结:
    " F0 K: z0 N2 [" b1 |4 U9 G
      F3 A( @& T9 J5 u/ n看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo! m" K! A6 H# f3 s
    + ]0 l$ M' _: ]; Y( E
    实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”" y8 O: i  O9 h1 ^) V6 }

    0 o8 F, q* ?0 S& \+ Y. t- Y1 d同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
    8 b' h( J+ E5 ?6 v5 z* \$ a7 \; u1 I( Q4 X1 s
    还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。9 }6 G8 V0 N7 D0 B7 x6 v6 y
    最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
    4 s7 F. }/ F- A6 |! S
    4 {; |& }# _2 g8 u) X,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员4 g* R, k$ d9 V0 s
    & Q: w- h& d, i/ ?/ i  k1 s6 N  q
    定时讲解Python技术,分享一些学习的方法和需要留意的小细节
    ( J% D# `( ^8 h# ?' g8 N, G' M————————————————' g9 o) X3 W5 X7 z* y6 p1 o: X# m
    原文链接:https://blog.csdn.net/haoxun12/article/details/105162947+ N! _% i# _) G7 {' J0 }6 \

    $ a) N: h) I% v! }
    $ H! j. U( M7 P- H  d
    ) [' Z$ K( L) X5 Z
    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-7-18 07:26 , Processed in 0.437680 second(s), 61 queries .

    回顶部