QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5389|回复: 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发送多人邮件没有展示收件人问题的解决方法6 w3 W! P. a; m4 g/ U, S
    这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    6 ]" E. A; B- V- M背景:
    % M, E; h# T2 i9 @1 ~4 @" ]( g
    工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人& l1 o; f: R' ^4 O# z

    8 |. a2 [8 ^( Y* H: c8 i7 s问题:0 Q/ J( X, R& w% u+ O; q2 ]4 e
    / Y! |6 `# ^7 V# ]# r8 R! G
    使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
    5 ?# H2 f* k1 n/ G4 r. i
    8 G* \% V0 {6 b4 N$ h9 _5 j  y9 p问题代码示例:
    % ^+ k2 b; g% g  ?( F# -*- coding:utf-8 -*-* E. |8 L1 o$ [% B+ r9 D
    import smtplib: f" c3 v! O* h
    from email.mime.multipart import MIMEMultipart$ N$ C9 ?/ E5 O2 H
    from email.mime.text import MIMEText
    ) R6 \2 x7 x* e9 Z7 S  R2 T& |8 H9 Z1 D+ b2 [2 }
    def send_email_to(fromAdd, toAdd, subject, html_text, filename):- K. @' U- }2 c& T
    server = 'mail.****.com'' d) b. @* V' R& L3 I- M9 _
    user = '*****': O7 [% f+ @; t
    password = '********'; u; J; m( e% K4 T
    & d! V. k* f5 _2 e  |
    strFrom = fromAdd3 `2 |: x; b$ X6 X0 g
    strTo = toAdd* p3 d; H+ F# e& l  O

    0 Z2 K1 h: g3 ~  w& {4 ~$ R9 U1 y msgRoot = MIMEMultipart('related')
    % F9 W2 y& C7 K# _5 T msgRoot['Subject'] = subject
    ( O" d  \% A9 I7 d9 B: V msgRoot.preamble = 'This is a multi-part message in MIME format.'2 c( [% l6 |# Z+ v; K! H

    + ?4 U9 A$ F$ ?9 o+ u msgAlternative = MIMEMultipart('alternative')
    ! Q( ^5 I3 e5 r msgRoot.attach(msgAlternative)/ A& P2 D9 Q( p* }1 a" L. M
    5 z- l% H- a1 v3 S: ^8 X$ h$ @
    msgText = MIMEText(html_text, 'html', 'utf-8')
    . I! w- K  p9 o. Z msgAlternative.attach(msgText)* s  D5 Y7 W8 I3 L
    4 g/ y/ M* n9 E4 v. D
    smtp = smtplib.SMTP()
    " S* I3 c6 o. a6 e2 o smtp.connect(server)
    $ L% w$ h' R4 A+ c* A7 S' | smtp.login(user, passwd)
    ! d4 i' y1 e! K/ }9 l' D* c
    / l6 Z/ R# H, m# Q att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')3 v( L4 E) g1 b
    att5["Content-Type"] = 'application/octet-stream'
    $ u" i. X- X/ y. P att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
    ) k" w* K' q3 C/ p) _" G msgRoot.attach(att5)
    6 `+ B( e4 d0 W& H! i4 ]6 I
    4 Z, A, Y$ e6 z1 s0 h7 F! y smtp.sendmail(strFrom, strTo, msgRoot.as_string())
    & Q' [/ h* G; i! y) d* h$ ? smtp.quit()
    : y; j) c9 ~2 f% i- Q$ J return, q. i! @7 S0 V7 A* }( u
    6 f# {0 f' V0 q2 p' E. Y2 q

    6 O' L% v9 s3 c成功代码:& R. b/ l' n$ H# b$ {0 O
    #!/usr/bin/env python
    8 k4 S: h3 e. G( L# -*- coding: utf-8 -*-
    . J3 u7 z: y. l2 D# n0 w. @" s" Q4 G1 L' {+ m, `
    import smtplib' b7 u) ^( \, ?3 }
    from email.mime.multipart import MIMEMultipart
    . u: R& E5 f: v' i5 G6 Yfrom email.mime.text import MIMEText% Z# _  `% z! V3 s; r
    from email.utils import parseaddr  ~. p( B+ v4 J  M, f1 h3 X+ O
    from email.utils import formataddr+ n* G, Z1 D5 S+ n
    from email.header import Header
    , W. y: y5 C/ I
    - _6 n! q$ y8 M7 @: p  h: Q, a" e7 g! U2 w' d) L0 b; [3 Z5 j' y1 [1 |; a
    def __format_addr__(addr):( i9 L0 l. {. {* y0 Q; w  W
    # 解析邮件地址,以保证邮有别名可以显示/ [/ c! ?$ @- i- U  u" {
    alias_name, addr = parseaddr(addr)3 O. [3 |3 _' m4 T9 W3 c- ]
    # 防止中文问题,进行转码处理,并格式化为str返回7 Y6 m6 G- C7 l$ B' d2 L* W
    return formataddr((Header(alias_name,charset="utf-8").encode(),
    ( j) `0 ]0 a4 _7 d& d2 j0 ]      addr.encode("uft-8") if isinstance(addr, unicode) else addr))
    ; E) t1 ^) c4 _8 ?4 d7 G1 L* [% F. Q3 R0 f7 ?! m
    ' ^7 C; P! L# q0 L3 B
    def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):. d- J8 m$ u! e# A$ M! F$ o
    1 c% [$ T6 ^1 T3 \
    SERVER = 'mail.***.com'
    + s; C  W' a2 O' k& e8 y USER = '******'1 |& x! a$ @% ]1 `2 O' @- t! b
    PASSWD = '***'/ D" z5 c+ }' e* r; w7 D9 B" D0 s

    * `5 U; h: \. z; K& n strFrom = __format_addr(fromAdd)6 u+ }) d  `7 s- C1 ?; x
    $ @' \+ U/ `& x7 d! n$ t
    strTo = list()
    ' G5 m4 K$ D+ |6 L2 D4 w # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
    1 E2 k! [3 f! J9 n7 |9 _- a# U/ ` try:
    4 P/ o% i& x% c) k. w9 |# L+ o% k. p  for a in toAdd:
      F9 H! c( V- f" m. ~( F$ t   strTo.append(__format_addr(a))
    ( c" o% Y5 i' j& }9 ~ except Exception as e:
    * N' D+ K1 F4 _  # 没有对a和toadd进行type判断,出错就直接还原+ x" t0 q, ?' O/ r; N5 I
      strTo = toAdd& ?8 w5 l2 @7 P) P  i

    / \8 s8 c5 ^5 ~7 x8 X8 v msgRoot = MIMEMultipart('related')* ]/ H5 V8 Q9 d; e0 Z
    msgRoot.preamble = 'This is a multi-part message in MIME format.'
    ) ^$ R1 k  A) m. {3 K0 a! a* ^
    : s, i. s8 Y* {/ C: S8 P2 K msgAlternative = MIMEMultipart('alternative')
    2 p3 I6 @; B- y& u$ c$ D1 E7 @ msgRoot.attach(msgAlternative)
    9 u6 C/ J5 s( w* K  S, o4 x8 w9 `7 g- S& U
    # 邮件对象 7 O9 X& e; F  R& q
    msgText = MIMEText(html_text, 'html', 'utf-8')
    / l3 ?6 r' D! k, z msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
    9 ~+ `& Y9 u2 U* ^ msgRoot['From'] = strFrom  # 发件人也是被格式化过的
    5 N  y! g* A. m! p+ j8 X$ [ msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”; {. ]- q0 g3 _: @
    msgAlternative.attach(msgText)7 T4 h6 ^' n8 A3 k

    ! m7 Q) K3 D  | smtp = smtplib.SMTP(SERVER, 11), E5 C# b' ?4 p; M
    smtp.set_debuglevel(0)
    ' K% L) Z  v7 K% L5 ] # smtp.connect(SERVER)  N* B) |0 j6 L
    smtp.login(USER, PASSWD)
    * u9 h9 |9 L% G9 B% g, {" q0 k # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
    8 B) U6 ?! J, ]5 u smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())- @  L3 d4 x0 F) f5 `2 a5 S
    smtp.quit(): g8 a6 o8 [/ y1 ^& K6 Z- h/ Q( q
    总结:
    4 l0 w- e" g5 ?. D
    # |) e# _- B( ^/ P看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
    4 |9 T. e4 ]9 j; [' ?2 V# U5 w, b; \$ g8 C. c- T7 ]
    实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”- g" l" N2 p. d2 L9 y7 g
    9 s7 r% f9 n/ b* o: ~
    同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
    3 e# Y! X6 e7 q$ I3 m- n
    ; X5 \4 n6 p/ T/ Y5 Y还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。3 i) A  D/ a1 K1 v5 M& v, D
    最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得! r4 M4 n1 ~" N1 I  h4 L; ?  I

    3 ^0 z$ c) Y. C& w,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员3 Z, k& B$ A( a6 r! y- N

    6 U! `# S& Y2 P0 \1 K定时讲解Python技术,分享一些学习的方法和需要留意的小细节, A! |9 x% U2 P! q6 _" x
    ————————————————
    & b7 a" A, o. d$ [原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
    . \! l- ?9 Q5 _9 t1 C1 d$ W4 R4 Q
    . r. N) j' j3 d

    4 Z( {! e; o1 ?
    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, 2025-8-18 07:13 , Processed in 0.880474 second(s), 60 queries .

    回顶部