QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6062|回复: 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发送多人邮件没有展示收件人问题的解决方法4 ^2 c! ^& F7 I
    这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下; ?4 M5 I+ a0 x. l9 q  f' l
    背景:5 J) ^/ L, g  t' l. w

    , ?4 m% y1 ^% W9 o8 X工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人8 a: N$ k+ V6 _; [1 j* M2 {) X

    / @- v% G2 I. `% H, _2 U5 \问题:
    : o& F( ^, Y& ^& l2 i+ x/ t  @& a8 J9 v1 T. q4 s
    使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
    " B. i$ s- i; x7 o  I6 G+ i3 Q
    2 {0 I! E4 a0 q! z1 J* `问题代码示例:4 r9 ^3 H3 G, s8 U. {: ?
    # -*- coding:utf-8 -*-/ P1 [! d& E+ U2 ]/ h" X+ {% h
    import smtplib* z" i( d* s- @, d% `
    from email.mime.multipart import MIMEMultipart
    : f1 Y7 k; g2 Y, N" A8 ?from email.mime.text import MIMEText
    - E9 s0 z" [! M8 @; e
    4 I% J9 I/ X/ v- J% e/ l, ?def send_email_to(fromAdd, toAdd, subject, html_text, filename):
    " Y2 g9 s: y0 p2 F, T+ R server = 'mail.****.com'" U8 s/ b: C$ ?7 n
    user = '*****'+ q" P4 z; S9 B' I: F0 w% d0 f  J6 k
    password = '********'+ e: B. `" H+ d1 r/ n% t
    4 m# P( a' t% T0 Q/ h) z% n
    strFrom = fromAdd* b4 Z7 t  E0 K
    strTo = toAdd
    . _& D! _' @$ t& m0 n% v
    2 f2 i6 C3 G: v- a. \ msgRoot = MIMEMultipart('related')8 c5 f+ D3 N) |6 s# [
    msgRoot['Subject'] = subject
    ' |. ^; E# J; k4 v" U9 M% J msgRoot.preamble = 'This is a multi-part message in MIME format.'/ H% T3 d0 N+ _/ H/ O. K
    # g) I* l: b" G* D( Y( c* B" T" b
    msgAlternative = MIMEMultipart('alternative')
    . [0 z' p- {0 S msgRoot.attach(msgAlternative)' `! _6 f6 c7 m: V5 E

    7 i% B, k7 a! M' R$ O4 | msgText = MIMEText(html_text, 'html', 'utf-8')
    ( @& C# O5 O$ G1 _( X$ Y3 j msgAlternative.attach(msgText)
    * P- u& A) i! i7 x# @; q1 b+ N' A+ |& W6 H6 c8 P
    smtp = smtplib.SMTP()
    / Y9 m% D9 P& u smtp.connect(server)
    0 P: j9 S+ j" u8 H2 K- N smtp.login(user, passwd)
    : O0 O, |: R1 ]9 ?
    $ n" t  q9 z/ P, X att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')6 T1 H9 c/ X1 {; l4 l/ {  h. ~
    att5["Content-Type"] = 'application/octet-stream'
    ; J4 W9 g: ]6 E$ e) V' l att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
    ( N+ N- F, N0 o# z' o/ y msgRoot.attach(att5)1 v; Z% x' n* M' W% P

    8 r/ u  s! A2 P5 l* [" }6 I smtp.sendmail(strFrom, strTo, msgRoot.as_string())2 k, h' C1 _6 h# T1 ]
    smtp.quit()
    & V1 _5 a$ _0 u  D return  z0 l7 N6 y% t9 Z2 }! d# \

    3 o1 F9 m: n/ ?( M" W1 q
    + e  W0 c7 L& E" Z3 W8 q3 l+ x成功代码:5 Q9 R! b6 F+ O* D6 i2 }3 A! k* _5 b
    #!/usr/bin/env python. W& a% \0 S; S, Q1 U2 ~
    # -*- coding: utf-8 -*-
    3 r: P) p$ k% k/ K; g2 e1 y* }" ^
    & a4 D1 E7 ]4 }" @+ oimport smtplib4 [" O8 z' S- }+ N
    from email.mime.multipart import MIMEMultipart
    3 ]& C' R: k3 S/ I1 b4 efrom email.mime.text import MIMEText
    3 `3 ^- S8 u0 }0 Ufrom email.utils import parseaddr
    3 i# @4 [6 m, pfrom email.utils import formataddr" b) A% w) l' F' W! I) L
    from email.header import Header6 E1 ~" {/ ~$ l# L. m

    * {, w& O- J7 d0 z7 u
    ) q& g; x3 G7 ^; u  x6 l$ m; h; Hdef __format_addr__(addr):
    1 Y' w9 R) T+ e # 解析邮件地址,以保证邮有别名可以显示7 y0 m2 v! g! g* _( J, N
    alias_name, addr = parseaddr(addr)
    0 u, J4 I+ \+ h, V! b: t7 I6 Z # 防止中文问题,进行转码处理,并格式化为str返回( Z; r7 Q% a" G! G4 d% b! m
    return formataddr((Header(alias_name,charset="utf-8").encode(),1 ~+ ]. I. Z1 q. G& K
          addr.encode("uft-8") if isinstance(addr, unicode) else addr))
    : X+ _/ \& P1 r( m& e4 Z3 X& j+ l8 i  N/ l, Y3 s
    5 R( r$ v( s( @6 d1 a/ ]
    def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):  ~, u3 b: M. y6 v/ ^. R. n) M0 T' j
    4 A* s& w3 g: p* J9 A1 X
    SERVER = 'mail.***.com'
    ' J* k2 C3 n5 U. v" C; _ USER = '******'
    + P9 ]; L* j1 c9 a, S$ e& G9 g PASSWD = '***'
    , U/ }. U: R9 G; [. j& W5 f3 }
    & u( l" b9 D7 S0 b  u/ L, ? strFrom = __format_addr(fromAdd)
    5 |. C* ~9 t' O# F; L6 f; I9 s* a0 r3 v- a+ W* a' L' S, @
    strTo = list()# ^; F' t# |* N6 I
    # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化9 k2 O+ j4 P( h" R' I+ t
    try:7 Z3 ], I- \% _2 j. g9 W. u
      for a in toAdd:
    ( w) D1 t& \% y) m   strTo.append(__format_addr(a)); b6 K: ^# ~# d4 M: i4 B- P. C4 _
    except Exception as e:! v' @: n+ ?1 Z3 [- A4 r& ]
      # 没有对a和toadd进行type判断,出错就直接还原
      E" j. D) l/ A3 E4 i; v( x  strTo = toAdd
    ' V' {& M1 w- r# x& }/ W/ C( Y/ H+ z: C
    msgRoot = MIMEMultipart('related')
    7 L$ q" N( o" u9 l1 `  m8 c  C) x  ?3 }  u; x msgRoot.preamble = 'This is a multi-part message in MIME format.'
    ) u7 G6 k  R- |9 U& \7 p- V/ s6 U
    / Q' j4 D, s$ w& r( }; W msgAlternative = MIMEMultipart('alternative')$ N6 g2 `- O3 |! ~& n1 J
    msgRoot.attach(msgAlternative)
    : d& D! d6 k8 I' \( @9 o: `& [9 A6 V
    # 邮件对象 - t1 m0 ~; x2 A$ f
    msgText = MIMEText(html_text, 'html', 'utf-8')
    1 L: S9 x* R+ {8 C; G msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化/ k- M4 O- f' ^$ r. a
    msgRoot['From'] = strFrom  # 发件人也是被格式化过的) p& D; N7 a; E% ?+ n' n
    msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”, o& {8 u# A) Q
    msgAlternative.attach(msgText)
    5 r6 D* P9 L* P4 Z, [8 g: g9 r" J& ]8 a; ~
    smtp = smtplib.SMTP(SERVER, 11): v. g% f7 y8 Q% E6 l, B9 z: d! \7 O
    smtp.set_debuglevel(0)
    " q0 y$ I+ m  y* d # smtp.connect(SERVER)
    5 p: [8 [. i0 u2 q. E  c9 | smtp.login(USER, PASSWD)
    . C% F7 Y! T2 {* w& [ # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
    , \9 }) u: J/ y: X0 H- S+ ~; I' s smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
    4 u3 N2 Y& _9 p6 L3 Q) B smtp.quit()/ W( l& V) b  h+ w! o! l, w: Q
    总结:
    , e$ p# w, k" S0 I' A' w* M5 r5 U/ t
    # g* ^- w: S9 C1 w看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
    & s' a, m' h  o% v0 A, n, q4 J8 B# Z+ U6 o
    实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”
    ! y1 n" v0 W" E! P# h
      F  G4 B+ L7 z% V! e# V; V/ m同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型  {" G+ N" g" }9 Q

    & \0 `$ J: l' q; U; e  @还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
    & ~2 ^1 T6 H+ Q" H2 x3 ~% F最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得, g" n; ]8 V' {. T, w+ z/ A" U
    + g/ {$ z5 G9 g3 ]* B
    ,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员" Q/ x" }6 i" K" J8 Z. Z% u0 h! |: H
    / e, n9 a: o$ G
    定时讲解Python技术,分享一些学习的方法和需要留意的小细节
    & P- K  y: \0 `$ d9 [————————————————( G* L2 J% ~% ~/ i
    原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
    ! W2 V3 W' f( @. r$ A. {
    * T% t" \9 e$ L6 g& l
    . _3 q. R7 i& H; s& s9 h& k, [; Q% z1 _! P; S
    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-19 12:48 , Processed in 0.463618 second(s), 61 queries .

    回顶部