QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6142|回复: 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发送多人邮件没有展示收件人问题的解决方法
    ( H# {# f% M/ a0 k$ _这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    / ^* z1 c: U4 A) n( z# R  B% C背景:6 A, _% j' R4 t7 \" `( x+ `

    $ P7 y$ |/ H6 C4 n8 Z- ?工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
    4 `/ p. F& ~8 [  l3 j* `, I3 w* {# D- A* H& z
    问题:7 N. r6 ^1 B; R9 V# z, a
    1 Z6 q- ~  E, H: ?& \, j, R' a0 [7 O
    使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容8 ]1 f7 O) |  x6 d' x) u

    8 L; C' {0 H, ]0 i+ ^问题代码示例:: C: C: ?" Q. L; G3 S5 O, E& h; D
    # -*- coding:utf-8 -*-. N7 f9 b% L& ]  w
    import smtplib
    ' R: D$ u4 g; ^$ F2 rfrom email.mime.multipart import MIMEMultipart1 h1 `' k! `8 D3 G- Q) |* q- `4 o
    from email.mime.text import MIMEText
    5 Z% s6 [) f9 x. [
    / F# G/ x$ L! y4 n! Vdef send_email_to(fromAdd, toAdd, subject, html_text, filename):
    ' M& ^5 y; N, m; N( T' o) D server = 'mail.****.com'
    4 I  o3 l2 A$ Y user = '*****'* |  H0 _& C3 t  P6 L
    password = '********'% w& v* y  a. _7 s% Y* d" D5 n

    ( J) |5 f3 j5 h$ k# m; L strFrom = fromAdd; I: {* h; E/ b0 u; C
    strTo = toAdd! M) w$ t7 D" ?+ p" K! K

    ( y" s' l7 C) d/ K5 E/ y: H msgRoot = MIMEMultipart('related')4 ?, j2 z% R: `/ p
    msgRoot['Subject'] = subject
    + s2 Y5 {0 p0 | msgRoot.preamble = 'This is a multi-part message in MIME format.'$ B. W* A* z, E3 H2 q
    7 |5 O- s/ i5 |; O, P- \
    msgAlternative = MIMEMultipart('alternative')
    3 t! ~5 q1 r2 v msgRoot.attach(msgAlternative)+ Z! d' B6 ]. F) f

    % V( L: c% _- N& ^$ f! \ msgText = MIMEText(html_text, 'html', 'utf-8')  [  C+ L+ G0 Q. O: |8 |2 y  I
    msgAlternative.attach(msgText)% }& M' @' y  `+ l/ r& d. c9 F
    . r0 t7 p, s6 C* B7 I( }
    smtp = smtplib.SMTP()4 e4 c; E4 ^5 _% _1 |$ |. |- R0 p
    smtp.connect(server)* S  ]' Y, ~7 k
    smtp.login(user, passwd)- s: s1 v2 n: s5 W
    " C. I) r; T1 c+ Q
    att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
    * K2 h: s0 Z$ I9 x! t$ A8 l att5["Content-Type"] = 'application/octet-stream'! t: c' A. o& T; r! Z% c# Y5 V
    att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
    * Q: j8 U) m4 d* V) }: ~1 \/ N2 `1 ~ msgRoot.attach(att5)
    ) m* c& v" e1 [4 _+ o4 Z* |$ l) J$ m* k6 {- q# g/ Y( a
    smtp.sendmail(strFrom, strTo, msgRoot.as_string())* Y+ L7 f# J4 _* _3 f, }
    smtp.quit()8 k/ g& N# _& n) u
    return; v! H0 i0 x" J, a* H5 ?
    ' e1 |; U& Q. a/ P( a
    1 x5 o; D2 G4 P% d! I3 A
    成功代码:8 [0 ~( [( b* V7 |$ L3 w; }
    #!/usr/bin/env python' w$ O$ L; A; l" i9 k- {! x
    # -*- coding: utf-8 -*-
    , |8 f8 L3 v  g3 {8 Q, j0 R
    # D# u$ Y$ U. I" `/ C- kimport smtplib% \; O4 d$ c, Q( o* Y- W
    from email.mime.multipart import MIMEMultipart
    8 C  j9 F" y/ a" ]from email.mime.text import MIMEText! S' @1 i) C1 J
    from email.utils import parseaddr
    3 v8 s) ]0 K( ]; J9 y& c# ^% Bfrom email.utils import formataddr
    0 U  X8 f  u# i; nfrom email.header import Header8 u3 Z* l  Y3 L7 M/ r4 t' D3 P
    5 x- Y; N4 ?- h: ]: K

    : Z6 I3 c; b% F$ Adef __format_addr__(addr):
    ' R: q% S" _( E; q # 解析邮件地址,以保证邮有别名可以显示
    % o% q4 ]0 ~( r4 ?- J alias_name, addr = parseaddr(addr)
    & M* m, S1 ^, N; @- ^& U& a # 防止中文问题,进行转码处理,并格式化为str返回
    7 u5 p3 E6 x4 A0 G return formataddr((Header(alias_name,charset="utf-8").encode(),
    7 S  g3 {7 C$ y- |* c6 E( v      addr.encode("uft-8") if isinstance(addr, unicode) else addr))
    4 k9 W, E, v- x5 ]9 p' Z' T) k
    + S/ w0 R4 U, h" [5 U
    ' R. N* S7 o* a8 j- V$ e. Kdef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
    2 F, ]8 f! `8 x, W& i$ x* r' Y
    1 @' G8 f- k6 r0 m SERVER = 'mail.***.com'
    # d! S- b, U/ `0 | USER = '******'9 [* P/ M& K8 |  L, ~
    PASSWD = '***'
    ! G7 F/ Y5 b. k5 C4 c' }; `
    3 M3 m; m% d" w1 O; R$ p strFrom = __format_addr(fromAdd)
    1 b' K+ f; m8 {8 v, `; k. ]/ b" {) B& _8 o8 w  S
    strTo = list()$ g4 @- E+ P2 @. k5 B3 T
    # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
    5 _. N2 U- G0 M2 q& |# S5 C- E/ `' n try:# E  j6 ~5 H; [) t! @
      for a in toAdd:7 L5 }3 T. `; I
       strTo.append(__format_addr(a))' q4 x# j- v) Y% ]3 r- z
    except Exception as e:2 X: `4 l( }& F3 t7 @/ R$ X7 S
      # 没有对a和toadd进行type判断,出错就直接还原7 n, e8 f" t" R" ?, |; Z
      strTo = toAdd
    3 }) s  }3 `% J
    9 [2 ?9 s, A) ? msgRoot = MIMEMultipart('related')
    : Z, G0 ^' Y, M" a/ K8 k1 K msgRoot.preamble = 'This is a multi-part message in MIME format.'/ W; Q  v0 X  W6 U8 t  i: S9 m

    9 T: Z+ C8 b$ d" _8 B+ i. | msgAlternative = MIMEMultipart('alternative')
    ; V4 z* f+ p: x, A msgRoot.attach(msgAlternative)& ?0 E4 c$ t7 Q, l! G* l3 A

    $ B4 A4 G# C+ O7 _  x5 U # 邮件对象 , ?* E2 c) |/ j& z
    msgText = MIMEText(html_text, 'html', 'utf-8')
      h1 C( @4 E) {8 {5 { msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化2 c: h3 R$ O6 S/ k1 ]2 N0 H
    msgRoot['From'] = strFrom  # 发件人也是被格式化过的
    & b; f( @  o, C. f msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
    ' }4 N9 k1 t  ]! n* S msgAlternative.attach(msgText)5 r4 e! b! _  M- i2 h2 X; W

    ' _# ]2 h8 L; h% J2 |* b  j8 |$ Y! X smtp = smtplib.SMTP(SERVER, 11)- q8 {+ B* }/ r( ]( [) b$ n6 N1 S1 i
    smtp.set_debuglevel(0): P$ \% X# n8 a% ?% u9 ]- ]
    # smtp.connect(SERVER)
    # b: D, n7 S2 [* ] smtp.login(USER, PASSWD)
    # A/ k; Q% W3 Z  i/ t$ v' E2 t # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别# T% J- p6 ?/ B4 C0 C
    smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())9 T/ @  q! l0 @) }
    smtp.quit()! m, r2 E. j2 F9 _( k
    总结:$ w+ P+ b: G- G2 p% ?
    # n2 ?. k1 y- s$ E' n. V
    看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo7 a2 }% i. z7 m* Y! `
    : B9 p; [" _- G* d3 z- G1 f" D
    实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”' K6 [% _- x) A$ E2 D  y
    0 B$ c4 J; y' I' e! h1 F' L
    同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型! }5 f7 [7 {% }7 c; F& l: I+ U

    + `6 w4 P1 z4 R& k  q还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
    0 c6 }" R; O6 ~3 ^* M+ D, F  ?; O最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得& ^- ^( _! r; g5 H
    & {4 J) D6 [; k- p% D
    ,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
    ! D5 W5 @' _. b; y* ^0 H
    " K) k/ ^' T! v$ `% Z7 L( E. R定时讲解Python技术,分享一些学习的方法和需要留意的小细节
    : ~2 ^( B. F- }1 `  ?4 x————————————————
    8 B7 }! }; r6 [* Z# p原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
    % X2 n* h4 ~& C9 ]
    8 w8 E; @; m& U) i; K0 W
    " W! h  r/ o$ U" f# \# o8 g2 c& `
    . R( G* R3 _  E# m; e
    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-2 09:22 , Processed in 0.275197 second(s), 61 queries .

    回顶部