QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6065|回复: 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发送多人邮件没有展示收件人问题的解决方法
      b- F! r' C" U& n这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下( V1 I" \1 I- _4 r7 G" f8 q1 p
    背景:
    / |# R4 [/ q1 Q2 e& k% a) H- S( S2 ?3 a& }' {( q1 p! K* T
    工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
    * U0 u8 D0 i4 G4 n7 L& \- O; L5 O$ _9 K7 M( v' L. F! F
    问题:
    2 O8 t, j2 N! [% \6 C8 c' I" b( w  }2 v( a
    使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容' o3 H) w/ s2 R+ q6 O

    5 Q, I' F; Y5 `* O0 E问题代码示例:
    * b& a; L" A; f" _# -*- coding:utf-8 -*-0 B3 z6 I2 }3 u- K/ }
    import smtplib
    & W1 \. {0 A; K. ^$ c2 ]1 [9 hfrom email.mime.multipart import MIMEMultipart# r: }. b/ W- a# @
    from email.mime.text import MIMEText
    + a+ ^" B8 W: O, L1 \. Y1 x, w* ]; }5 l- D/ U+ D, R% h
    def send_email_to(fromAdd, toAdd, subject, html_text, filename):
    ( g2 i5 F' E" o/ N server = 'mail.****.com'
    3 \# G! S9 m" |. t. X, h5 } user = '*****'
    ' B' P7 x; x7 d4 S- K/ P  W( F2 J, x7 K password = '********'
    & b$ r5 `' ?8 G2 M, r
    0 f0 y- d& j0 ?0 F strFrom = fromAdd
    8 A9 q& U2 q: J4 x" q! S strTo = toAdd
      L1 g& S3 s* I2 P% V# U8 j) V/ K; t) s; f
    msgRoot = MIMEMultipart('related')
    . \4 \. f. r0 X2 y msgRoot['Subject'] = subject
    4 v* r9 `; B/ p$ l; a$ B( L$ W: i) v msgRoot.preamble = 'This is a multi-part message in MIME format.'5 w7 `/ L4 B9 T
    3 i- ]9 n& x4 W. V5 L- t* G: v9 t
    msgAlternative = MIMEMultipart('alternative')
    3 A6 z% C' b$ b  L; o0 b" G msgRoot.attach(msgAlternative)  J0 ]6 V; V( P; ]( F; g9 @3 X; s
    5 e/ [% T9 A* h& n0 q' a
    msgText = MIMEText(html_text, 'html', 'utf-8')
    + K/ X: t% r% R1 Z$ ^5 E, V" C8 o' _ msgAlternative.attach(msgText)) B  G; i% d( v, g, F
    2 T' d! K4 x5 A+ n& u$ L# W  u
    smtp = smtplib.SMTP()
    ! n1 \+ I) ^9 L" h8 b9 L1 E smtp.connect(server)# A7 L9 F# M, O
    smtp.login(user, passwd)
    # t: q2 t% i1 P4 N& v0 L' m
    + e* w2 K6 Q2 B' v' l: m att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')9 ]. [0 E  u% G. a
    att5["Content-Type"] = 'application/octet-stream') f& L9 p7 |& ~: z% W, ]
    att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
    0 o* i9 W' |: T9 S' z msgRoot.attach(att5)
    2 v: [; v. J3 z' ?7 _
    # i; F' {( O6 f! M* {# _* {7 L smtp.sendmail(strFrom, strTo, msgRoot.as_string())
    9 {( _! G  V9 v! U( i smtp.quit()3 v; g8 V. ~+ u2 C5 Z3 K& w
    return
    & o' x3 S  G- b: k# e9 O# ~& a& u6 @
    6 w, Y) [5 h  V8 r& W( A8 z0 _
    成功代码:3 X: h9 ?) \# Z! L. i+ U- O/ f
    #!/usr/bin/env python3 a6 d6 Q0 c, M" n3 v
    # -*- coding: utf-8 -*-3 C: K3 m2 @# E# p! H  ]& j" |
    $ j- q0 _% a+ ]. a4 @/ O
    import smtplib# `* o+ O/ q, W  a, _5 [3 I
    from email.mime.multipart import MIMEMultipart
    2 h" y& Y' b- P: m* cfrom email.mime.text import MIMEText' s/ K, }# t2 C+ W4 S
    from email.utils import parseaddr
    * Z! t5 R/ T( Zfrom email.utils import formataddr4 {& I  r$ g4 ^% i0 q' h
    from email.header import Header
    7 u9 B2 O1 y; u& `4 H: L1 G+ X7 H3 H' c6 \0 G- m
    1 D8 U9 d' }# a1 C$ f5 P5 ^
    def __format_addr__(addr):
    % W, ?9 J7 X& o3 C3 S; _ # 解析邮件地址,以保证邮有别名可以显示2 e- s% U7 p0 F" Z. ]( A3 o
    alias_name, addr = parseaddr(addr); A: S: N, C1 B3 p
    # 防止中文问题,进行转码处理,并格式化为str返回1 e+ l2 a$ `  k  J, k2 `* r# M6 x
    return formataddr((Header(alias_name,charset="utf-8").encode(),/ m4 n1 ]( P* I- Z+ C( K
          addr.encode("uft-8") if isinstance(addr, unicode) else addr))
    5 [8 V9 O3 k/ l8 m& j- ~
    : V+ B  O6 {) b& l  X3 a$ @6 b! S
    : \2 f) m7 Y. l' U# Sdef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):* L- \+ P0 Y: m% L0 Q/ b' U7 p
    , o7 h+ i" u: l" T& p; m
    SERVER = 'mail.***.com'" Z+ Z) k' p3 E
    USER = '******'
    3 {, C. r5 h" v# L+ D PASSWD = '***'
    * E: s! L3 S7 u: }: S$ b3 Q% W( U- u' j7 D
    strFrom = __format_addr(fromAdd)
    + x/ v! G* b1 B( w* a) B) n2 v
    % Z! |" b  f2 m& X+ d% T; E* i strTo = list()
    9 x9 F  S' `4 N # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
    + w  E5 g! h7 V5 [- g1 D& T try:
    7 o) n/ l$ }/ _( ]9 ]7 E  for a in toAdd:' \8 P  `" I- C( e4 X$ y
       strTo.append(__format_addr(a))
    7 E9 O) V, Y1 h7 R* u! v& M! Q except Exception as e:
    ; l- |" O  o* }5 V5 u4 y  # 没有对a和toadd进行type判断,出错就直接还原
    ) b2 N5 t! q8 M+ g$ N) ~  strTo = toAdd
    . F: E5 C0 X; S7 y+ z. z8 B7 g- {/ I9 L& w$ t$ r' E* X. x! n
    msgRoot = MIMEMultipart('related')6 }# L* C0 E# g& h  W. l
    msgRoot.preamble = 'This is a multi-part message in MIME format.'" H, D1 P# T$ G% l' D4 \% t

    $ Q& N: p8 c" E) D  u  _. d0 c% j msgAlternative = MIMEMultipart('alternative')
    9 X) m3 Q2 o& b9 c  N msgRoot.attach(msgAlternative)! s" G: d; U9 L1 b1 D; C% S" ~
    : @/ q& G9 K! e1 _4 O
    # 邮件对象 ' q$ H' i6 ]# q( M+ |8 w
    msgText = MIMEText(html_text, 'html', 'utf-8')8 U0 k% {! Y" c  s$ O- Z, ?5 K
    msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
    : A. I. Q* T/ t+ _* \  D3 B0 m2 z msgRoot['From'] = strFrom  # 发件人也是被格式化过的8 n; n0 g9 {2 P# M3 [
    msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”- Z& b  ]# m5 t
    msgAlternative.attach(msgText)
    5 K4 j( Q' k, w8 z
    + Z0 l& ~, G6 ?0 l8 U smtp = smtplib.SMTP(SERVER, 11), {) U! }! f' Y# K! }- |
    smtp.set_debuglevel(0)
    # R- C5 w6 e/ s8 I! V # smtp.connect(SERVER)$ p' w. C! G) u
    smtp.login(USER, PASSWD)
    / ?  V1 V1 [6 a # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别% a% L, ~' o! U
    smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())' U- l$ q5 v8 ~$ ~
    smtp.quit()" P! Y: o1 q! [7 O6 g
    总结:
    . e. b8 T  z% Y
    8 P/ \5 R9 ?& Z6 ^) C% a/ o+ i看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
    " E9 j5 k) z/ D1 ]6 z/ I, m0 |$ `1 U5 t/ v" `
    实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”- g3 f$ U: q+ n' H& {
    5 G' [$ X7 C& I8 ]2 U( `
    同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
    : J3 R9 t. K$ M  t6 \, `1 p9 X; A. Z) d2 H$ l/ `! R7 Y: ?) g
    还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。6 \. J- h1 v; I
    最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
    . ?7 \, V1 f6 Q, C- X4 d( Q, s4 V8 t6 p6 i" ^5 x* [; m4 }3 P+ e* n( A$ f
    ,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员2 R0 w, r2 F% P

    ; s& g% t; f" X6 R7 }1 X  A1 |定时讲解Python技术,分享一些学习的方法和需要留意的小细节: a5 l1 ?+ U% T8 M. F" m/ f
    ————————————————
      X! Q* Y! G+ z( Y2 r  J+ d. `原文链接:https://blog.csdn.net/haoxun12/article/details/1051629479 @6 M! h  ^+ i) o

    " z: ?$ a8 U% _6 n' D/ I; j( z  Y) s: a- k, h
    & O( z- B# }5 n
    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-20 18:03 , Processed in 0.365596 second(s), 60 queries .

    回顶部