请选择 进入手机版 | 继续访问电脑版

QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3612|回复: 2

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

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

5250

主题

81

听众

16万

积分

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

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

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

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    发表于 2020-3-30 11:14 |显示全部楼层
    |招呼Ta 关注Ta
    python发送多人邮件没有展示收件人问题的解决方法7 P( t& U; H0 D' P- U! C/ b
    这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    ( f+ g5 J- L$ v+ u1 O! Y9 w背景:
    % E+ u& K' d9 I, o$ h4 \" |4 p/ ^! u: y/ s0 c
    工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
    ; _7 b- d4 Y7 p7 o
    8 D, }2 x( l0 l, @3 z问题:! M' c9 b1 Z, A0 Y$ v! U- w
    7 @/ I: y- t/ I5 u3 {
    使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
    & ]4 s5 ^1 N1 P, M1 b6 d6 o3 g5 P/ L) E
    问题代码示例:4 l. |0 V( E% R6 t
    # -*- coding:utf-8 -*-& F' U5 J" h2 ^! N- K  ~3 S
    import smtplib
    # I. [  d! m) R' |4 pfrom email.mime.multipart import MIMEMultipart
    8 {! c) `; N, ]! U* c! }/ x; K4 m' N3 Qfrom email.mime.text import MIMEText
    / t  c) D( ?2 R* b+ x+ C9 \
    9 \/ L* r. h# d9 C& |) i- Xdef send_email_to(fromAdd, toAdd, subject, html_text, filename):
    3 `' E' m- F' X6 C server = 'mail.****.com'
    1 u! {9 |/ w  I& p3 S' | user = '*****'% w  o4 n: F6 s  \/ P, Y
    password = '********'8 c5 B" m) Q2 Y8 ]+ p7 s+ j$ k: Y
    & S+ e- D3 _' H) g* y
    strFrom = fromAdd1 m6 A1 O9 j8 p. K
    strTo = toAdd6 P/ `* A. C/ g3 N7 k8 P

    0 d# M  j/ ], a msgRoot = MIMEMultipart('related')2 [% l$ O7 r6 e) }7 y
    msgRoot['Subject'] = subject
    ; l$ `; A& T2 ~( T/ v" E" ^2 G msgRoot.preamble = 'This is a multi-part message in MIME format.'
    5 {- ]# H! l2 |1 p/ C" t% U# t+ A
    msgAlternative = MIMEMultipart('alternative')
      I. r) ]- ~$ u: ]; n7 H+ } msgRoot.attach(msgAlternative)
    + u/ I; D8 q4 Z$ o
    * d, d7 E7 f5 Z- F& H msgText = MIMEText(html_text, 'html', 'utf-8')3 r6 U  v: @- r2 @
    msgAlternative.attach(msgText)
    - O# W9 t  _: ]# ~
    * h' d0 p5 N8 T8 d# D" D/ ] smtp = smtplib.SMTP()& r% I; o5 o2 _1 X5 i% S
    smtp.connect(server)' _& q+ a/ o. C3 R& H
    smtp.login(user, passwd)
    % e3 _1 U8 K8 |* e! s' p2 m- k$ X$ y2 _
    att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
    " q  ~! i% m9 u: ^, n& Z6 V att5["Content-Type"] = 'application/octet-stream'
    2 v3 f7 O: _/ U att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
    1 h4 `- r, P% A2 V) { msgRoot.attach(att5)
    6 h4 h0 G) O# b! k+ o3 o6 d$ n/ m7 _3 w" ^7 W
    smtp.sendmail(strFrom, strTo, msgRoot.as_string())# v* `# e- @' C+ O+ w. W
    smtp.quit()
    . M8 ]/ Y3 Q- F return2 D4 E0 t! |$ N$ X9 V

    9 E1 L1 B# B# p" G2 T! \- s1 ]7 K
    - _) c( }* h3 R成功代码:
    & B) f" s4 Q% ]+ c6 a' ^1 O#!/usr/bin/env python6 }' z2 M6 m5 ~. f
    # -*- coding: utf-8 -*-$ U" e  w+ M  {5 p
    1 a4 C2 w+ N4 q2 q9 @% W
    import smtplib
    + f% a1 q8 |& ]1 `from email.mime.multipart import MIMEMultipart
    ! H$ U* T: m4 K9 K9 e( wfrom email.mime.text import MIMEText4 U- d% s: W1 z/ e. l6 |* u$ v
    from email.utils import parseaddr
    , Z5 t* b9 P! S( vfrom email.utils import formataddr
    ' Z3 h% L. {2 ]* Afrom email.header import Header) G. Y4 P8 }! {! H* V( `. q2 o
    + l$ Y2 ^: E2 ^# L
    ' S! a4 @5 x' S* F& M! l. I
    def __format_addr__(addr):
    5 H  [1 N( U& W& E2 F, B # 解析邮件地址,以保证邮有别名可以显示0 l. r+ ]+ T8 ^* Y
    alias_name, addr = parseaddr(addr)
    & E5 s3 n0 \1 B- J2 X" w # 防止中文问题,进行转码处理,并格式化为str返回
    ; |; ]- p, _2 E1 d return formataddr((Header(alias_name,charset="utf-8").encode(),# M0 }6 W; T& t$ N- k- p& z3 i
          addr.encode("uft-8") if isinstance(addr, unicode) else addr))
    9 M3 r! |& R4 i9 a5 E1 {  B0 W/ x# W8 ~* s  D
    1 P7 Z8 {  M; B1 A7 l# _3 y
    def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):5 R) p9 |& ~# [9 X7 E2 i9 t

    % l, y# S5 T3 \( T2 B2 \ SERVER = 'mail.***.com'6 F9 P9 ]) m. K* c" |
    USER = '******'
    5 m1 w7 T3 r# P& i. S5 n; W PASSWD = '***'# G" [2 i- h5 Y; A' K) a3 w2 }; j

    - V" y* _9 u4 r0 R7 @0 y0 S$ u9 b strFrom = __format_addr(fromAdd)2 N8 m6 X5 N9 J; @8 r

    ( \: u. {' b" Z# m+ b0 K strTo = list()
    5 _& k& ?7 f- Z # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
    4 G8 i2 m  j7 j" L1 U try:0 b, q) p. K3 A/ E) `
      for a in toAdd:
    : v  D" N# r' r4 j* r   strTo.append(__format_addr(a))
    & I7 [& |2 t: ^. K* _& V except Exception as e:
    " j7 o  ]3 N+ H; T+ d: H. n  # 没有对a和toadd进行type判断,出错就直接还原
    ; {' ]4 Q9 b2 G. A  V  strTo = toAdd5 D+ a- ^" H! F6 C1 j8 b3 x0 T# |

    - \, j4 |: C+ N, u! j msgRoot = MIMEMultipart('related')
    $ K  |( m1 R9 ^& `8 Y4 h msgRoot.preamble = 'This is a multi-part message in MIME format.': @) ~  O- y+ y3 I4 ?

    $ X- G, W, N8 w msgAlternative = MIMEMultipart('alternative')4 J# L% z# [5 J
    msgRoot.attach(msgAlternative)  j8 t- J3 m8 r1 D

    : {+ z) k6 y9 B# v # 邮件对象
    , J1 M4 @% J7 K8 k0 u# q7 t msgText = MIMEText(html_text, 'html', 'utf-8')/ L( N* m5 i/ K) v! g) w3 b
    msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
    + _  s3 M& e9 Z; w) ? msgRoot['From'] = strFrom  # 发件人也是被格式化过的# g$ f0 J6 _9 I  g
    msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”- {* Q2 J6 e$ F' s5 e! I' h6 ^& i6 C
    msgAlternative.attach(msgText)' j/ l7 H5 L: v( O  N3 F

    3 X; h% Z" a" [0 M6 m$ c smtp = smtplib.SMTP(SERVER, 11)2 _+ Q6 e: e1 H1 h
    smtp.set_debuglevel(0)! Q1 B0 c- y' k9 v  }
    # smtp.connect(SERVER)( P7 J. K6 U4 q1 y; n
    smtp.login(USER, PASSWD): t( q5 l6 p, d: |- ?# q0 P0 U
    # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
    7 Y* }; k. P( C- a. x7 u6 } smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
    , w  X8 h1 K2 F smtp.quit(), q1 C4 ?* e" I: W2 M
    总结:. n& P& W' j' |: P4 r- k9 B
    % F/ x3 t2 j$ x7 O+ o* W; O' v
    看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo/ J% N$ o1 n% R3 B
    . e# I" f& r: o( ^' o$ W
    实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”
    - H" `& ^) F/ `  E7 T- x/ @4 }! m/ A% y1 \
    ' O5 K( e9 C& n/ f1 V! B" T同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型& A5 T. c$ @; [, j

    ( P) z- l1 [( {( r还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。9 N( {$ ]# J' x6 R
    最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
    0 P8 \7 w, d3 b5 ~. ?% r3 H1 `1 j4 p: b+ N+ O) Y9 h
    ,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
    ; {7 Z' u3 g0 \4 k" v
    " j2 h: o% e: I4 D* p定时讲解Python技术,分享一些学习的方法和需要留意的小细节
    7 a6 Q/ G" ^( ^& T0 ^) G————————————————
    ' |0 w; e* \2 Q# x原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
    ( @, a0 X* D  X) Y+ M6 h, c' S1 ~
    + p: o/ n3 w2 b, Q3 P
    : q6 n+ e7 S3 ^$ O, D
    2 T' B0 A, e: b$ q
    zan

    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, 2024-3-29 16:36 , Processed in 0.344711 second(s), 61 queries .

    回顶部