QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6080|回复: 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发送多人邮件没有展示收件人问题的解决方法0 r$ T' L0 s. p+ t. ^7 I9 F
    这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    , b0 _5 a5 D% L: v  {3 P背景:
    & t  j8 I! ], q$ W! U. s0 u0 ^  O* o
    工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人- Q, Q7 T2 O9 `8 ]) D  j

    ; F3 E) o' Q0 G, I' `  |( A: j2 p问题:. n- J% M% N4 W2 L% q% x

    , |  `6 R) g9 u1 Q/ w7 `+ J使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容; ^! k( M; Z8 x9 h# x  z. \
      m" l3 ^; o: f9 N, S) {8 a7 V! v
    问题代码示例:
      ^& D8 j2 `$ E9 _7 ~% _2 I# -*- coding:utf-8 -*-
    $ g" o& Y+ p0 x' ~6 I" Ximport smtplib
    % x+ @; B( i+ \% V. B: \" f4 yfrom email.mime.multipart import MIMEMultipart+ o4 E+ b2 i3 v9 e3 T
    from email.mime.text import MIMEText
    ( z. f) j" D' F7 F& ~. N- s
    4 A/ n% m1 ^* t, G/ D5 fdef send_email_to(fromAdd, toAdd, subject, html_text, filename):
    2 M2 d4 @1 @; Z' N1 A4 {: I0 R server = 'mail.****.com'
    ' z8 z* f3 a  Q  ~# L user = '*****'
    ) P& e& x/ L: \5 Y: ?5 h4 f password = '********'( R- S& y. y; m- _- D- u5 M% C! h. Y

    / v' e" ~( ?9 b% I* W strFrom = fromAdd/ q3 x& a3 T5 L: J
    strTo = toAdd
    : P8 O: U# e* V7 P5 p0 N4 D- n
    8 M# K0 o/ P% b9 S  X msgRoot = MIMEMultipart('related')
    / A9 u( @) Q' A/ y7 c2 P msgRoot['Subject'] = subject
    ' L' Z/ u. r, `! Y! P% z msgRoot.preamble = 'This is a multi-part message in MIME format.'" f" D% A5 V7 }, G1 H- r/ h4 j

    ! y( ~  H9 r; f( @6 c$ b msgAlternative = MIMEMultipart('alternative')
    7 o' u" Q+ R2 m5 W* Y" ]" } msgRoot.attach(msgAlternative)% W5 E# t0 Z1 s  C: s
    1 U: b! H8 t- G( g
    msgText = MIMEText(html_text, 'html', 'utf-8')7 Y* z- z% G+ e! E' u% w) o. u
    msgAlternative.attach(msgText)
    . a% R7 `& r7 y/ s) W7 Z6 `4 w
    6 d, R% J  x6 r* ~$ B+ a smtp = smtplib.SMTP()5 j: A9 t7 Z8 u: n
    smtp.connect(server); @4 L% H0 S7 Y) D" i1 r
    smtp.login(user, passwd)
    - B0 \+ D3 s* _; T" ?$ e; q6 |" D3 H
    att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')# _& S- \) C# Q! d) z) j
    att5["Content-Type"] = 'application/octet-stream'
    ) Z0 A/ w& T: K; s) P4 L att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
    8 F. u/ R% f, }. @0 w7 M msgRoot.attach(att5)# `2 P3 z9 l7 k9 Y0 J3 y
    * i" |# S' X$ s
    smtp.sendmail(strFrom, strTo, msgRoot.as_string())# q, ?# @9 p: G( G2 G2 E' z/ T
    smtp.quit()
    ) }! k' r/ |5 D! F- F return' z. Z9 D$ t* J0 e+ O

    9 a8 y- w, e( `% Z: I: j5 b: ]! D. a& c1 e% e$ Q. H  y
    成功代码:9 T% C, r/ w$ ]- a) Q- U* T! k3 i  F
    #!/usr/bin/env python- I% N* s, t. E1 r/ t3 j
    # -*- coding: utf-8 -*-7 O# t3 }; P) G# c; `3 [; L

    % H4 t/ Q. `3 K. ]  V. s4 c0 G0 _( i6 limport smtplib
    1 ?/ O; W% _( |7 i* g+ q8 [from email.mime.multipart import MIMEMultipart6 P' c5 C. v; d& w' h* X! V/ J
    from email.mime.text import MIMEText
    4 o6 i; g) i# I7 }) e( bfrom email.utils import parseaddr
    . q3 _* {9 {! \3 \8 E# vfrom email.utils import formataddr. |8 H) n7 U, n. p* m9 I' ?" n( f- Q6 A
    from email.header import Header0 o; ~0 W6 N: x3 h
    % ?" m% }0 _6 P2 D5 r7 D4 E9 [

      l5 `$ C8 W9 c; t. O$ P! bdef __format_addr__(addr):
    " ?0 T9 P, M8 k8 ]- Z. ]- D # 解析邮件地址,以保证邮有别名可以显示
    ( V; u2 }/ ^' Q9 b4 e: x& ], {6 C alias_name, addr = parseaddr(addr)
    ! w+ @8 w+ V$ u5 @, O( f* Y' m # 防止中文问题,进行转码处理,并格式化为str返回, r% `( @4 e1 r5 x
    return formataddr((Header(alias_name,charset="utf-8").encode(),( E) Z( a, L) I
          addr.encode("uft-8") if isinstance(addr, unicode) else addr))
    9 I/ @% }4 q  R1 t6 V
    " G, }: k+ B1 ]  q( I% ]( P4 H/ \- a! R, V7 Y9 w
    def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
    0 f, ~' l6 d# {
    : }+ ~" h1 g+ r8 d- h* s. x9 e) C SERVER = 'mail.***.com'
    $ o% Z% @. n5 U4 m6 t USER = '******'
    ' W) q' N2 X* x  W) P- i3 k PASSWD = '***'
    5 M4 `5 {2 B5 Y$ r% x, a3 k# ^1 ^, e- G/ ]  K3 W7 e) ]) v  ?
    strFrom = __format_addr(fromAdd)
    6 j2 R' H4 }0 f' [0 ^* B" @7 ^2 U* n: P$ N. M
    strTo = list()
    $ F' A/ e" u- J+ ] # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
    ! X# H# X) _* M1 Y# i+ P try:
    9 |+ b: F! k) N9 D& s3 H  for a in toAdd:
    : j8 O) [  C# G  Z- `) M- x  G   strTo.append(__format_addr(a))/ c+ N/ F1 \4 t( r
    except Exception as e:; H! K/ u7 ^& j3 X/ w/ @3 h) q
      # 没有对a和toadd进行type判断,出错就直接还原
    - h$ P! @3 c2 I4 H  strTo = toAdd& I; @5 k0 Y. F3 `! Y
    . F7 R/ \7 F+ c3 A6 ^* T8 i" v% Z
    msgRoot = MIMEMultipart('related')
    2 K/ g  t  w6 f* \ msgRoot.preamble = 'This is a multi-part message in MIME format.'
    & H. v9 r" ~, _4 C, t
    . c5 E, C* W  s/ s msgAlternative = MIMEMultipart('alternative'), |) e3 F1 q9 \# l
    msgRoot.attach(msgAlternative)' F, L0 _  O' S. D1 \& \/ B$ u$ Y
    - U/ E7 T0 e6 N9 m: `
    # 邮件对象 ' U' X* N. N' A& A3 z3 Q8 ~) }/ ?) h" L
    msgText = MIMEText(html_text, 'html', 'utf-8')( o; ?# ~2 M0 c9 b' b! C2 t
    msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化: ^- b" T: z: n* B$ N$ F
    msgRoot['From'] = strFrom  # 发件人也是被格式化过的
    9 K, Y; c$ H- o* O' H& {0 X msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
    5 c8 a5 r" s' M3 o+ @3 O" j msgAlternative.attach(msgText)! d: }) j2 e% V" Z0 b2 P9 q
    ( n; S1 @' q) @, A
    smtp = smtplib.SMTP(SERVER, 11), B8 _/ T1 c* j+ C* \' D: e
    smtp.set_debuglevel(0)
    + J% e# `8 o  w. i2 o4 X # smtp.connect(SERVER)" X7 ?( a: Y7 ^8 H. z# ?. W
    smtp.login(USER, PASSWD): F9 B; z# Y1 k8 N7 l3 S: u9 c' q
    # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别7 k/ ^, G. q4 S! P! f$ y- O$ T9 O- }
    smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())5 T* m* M+ S/ v
    smtp.quit()
    9 ~. M# h7 T2 ~0 p8 K- N2 r总结:
    " b$ O! W: V5 U$ H, k) o: W& _, W! G' \( z5 K1 k+ ]6 v
    看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
    % v( _0 [( {! r+ Z! M% S: a7 b( e& Q! }7 T
    实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”
    # V* E3 w% d3 [+ G. t% y; E/ A( d# I1 i( q! [! N0 R+ E2 T
    同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
    , y7 n( e# N9 y( k$ `$ k
    / ~, M; W0 o: p; J( v还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。" f; \4 C/ V$ K6 N, H
    最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得, w* B  z- G0 S: @" G
    - o9 [2 T5 U! B# L
    ,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
    . w* q! O' E/ i* F7 p) c
    & ]8 g" e* e1 d定时讲解Python技术,分享一些学习的方法和需要留意的小细节
    $ ?7 c0 Y6 e2 R) O/ a% B————————————————
    2 g3 @  C6 D5 o原文链接:https://blog.csdn.net/haoxun12/article/details/1051629475 C8 F, O6 v2 l6 W7 V  ]
    5 k; Q1 ]% k. u0 s  r

    3 ?" q$ o) p' R8 O6 X# a8 L1 S% p. g. M# a  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-6-2 22:37 , Processed in 0.412121 second(s), 61 queries .

    回顶部