QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6082|回复: 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发送多人邮件没有展示收件人问题的解决方法) W, \5 ?- d! E& n! v: B2 r
    这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下- p& l- C6 A2 }$ L; T
    背景:
    ' W- U2 s  |4 p2 J$ x' ~2 x2 T4 b3 H8 C  v) v  ?. I4 I
    工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
    ( d$ C( k% G- p8 w& _% l7 }/ R
    & J; h% E! D6 A8 Y2 a$ L3 u, g问题:) V  F; E) w( w  ^0 x) ^
      p  A9 p& O: O) X0 j3 y, k9 G! h
    使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
    ! E2 p2 U+ [$ p; d* j4 H& S- b
    6 r9 b/ Y. @/ S6 X$ b  k( {问题代码示例:
    $ M% Q! {8 u- P9 T6 `& }# -*- coding:utf-8 -*-" K  t# W( _3 x
    import smtplib
    4 g/ |4 c% c7 m- @from email.mime.multipart import MIMEMultipart3 t& w. I3 O5 A2 k0 S  v4 [& F  d
    from email.mime.text import MIMEText
    5 K/ H5 F+ a! `# B( o5 ]' J
    " ~6 ~: a$ n' {* B  N2 `def send_email_to(fromAdd, toAdd, subject, html_text, filename):6 h( X8 w$ b( w6 c
    server = 'mail.****.com'/ s2 o3 o' g! ^0 G$ ^9 L! k0 V
    user = '*****'
    8 U# t, z& d% n% K) o password = '********'- _, w; L; @5 p2 I$ {
    9 x8 c$ t: C/ J- |" O
    strFrom = fromAdd7 R: H* i( b* r7 d- c
    strTo = toAdd
    9 i" ]1 C1 x( a
    1 W# ]6 N" d4 k1 L msgRoot = MIMEMultipart('related')
    1 s" w( f: c4 @& f: `- Z msgRoot['Subject'] = subject* w( Y2 j' c# o- ]: D
    msgRoot.preamble = 'This is a multi-part message in MIME format.', @2 X7 [$ l- N% Q
    2 G! R1 o; u+ v! o
    msgAlternative = MIMEMultipart('alternative')' M' e+ k1 ~; B. U, P
    msgRoot.attach(msgAlternative)$ P, k) A5 H4 T/ W' p: u& K
    * z  F- Z  L8 X  [' m, R6 l
    msgText = MIMEText(html_text, 'html', 'utf-8')
    $ d3 ?" |8 n3 t" D* L: f msgAlternative.attach(msgText)/ M: N: g: K2 \6 T0 r6 W
    / m6 f  ?+ F: @+ P
    smtp = smtplib.SMTP()
    0 q5 f- n" M  k( p smtp.connect(server)
    7 p& I5 B# V) [  N& `( M: P0 r9 u1 o smtp.login(user, passwd)
    * ~! H6 P8 `! f- ^7 E& O* u; u* n; S9 s, i: t; t. X
    att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8'): `% M; y4 s" |6 F: o& l
    att5["Content-Type"] = 'application/octet-stream'
    % d3 ?5 [% B9 }' @$ V att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
    : b5 R; Z. G" z1 u- ^9 D, k9 A msgRoot.attach(att5)
      D) V$ ^$ p7 v. L$ u# \/ |) ^; F, E9 H
    smtp.sendmail(strFrom, strTo, msgRoot.as_string())
    ! ?& I" R% r1 { smtp.quit()
    2 t4 A, n; ], C return
    3 e' F2 e; I" H6 r0 m+ q
    $ s4 `' `" W- {" q6 w) V8 j9 [9 W4 e4 m2 D
    成功代码:
    * q+ `, h" s! u( b3 E& p  w! D. [/ j#!/usr/bin/env python. c1 M1 @# ^9 [: l; i; |/ w
    # -*- coding: utf-8 -*-' [9 Q: Q- A2 P
    ( ?! d! N$ G+ N9 W
    import smtplib
    , G+ h  D5 g  ?2 i: T. @from email.mime.multipart import MIMEMultipart
    6 @- C, G; D* e. h+ |0 ffrom email.mime.text import MIMEText
    3 g1 n) j% d+ k  Lfrom email.utils import parseaddr
    - g( B7 E) W+ {, x! Nfrom email.utils import formataddr3 \# M5 q, [' e3 q
    from email.header import Header
    2 E( b  n) V! ?- W
    1 y  h/ g6 c% I
    % g7 W+ s# E0 M+ p8 e! gdef __format_addr__(addr):
    ; L3 |6 ~; t! ?# G1 @* {$ A # 解析邮件地址,以保证邮有别名可以显示0 Y7 Q7 ~( ~0 G
    alias_name, addr = parseaddr(addr), E! S( h( X& m
    # 防止中文问题,进行转码处理,并格式化为str返回
    - c' s2 v8 u0 a! v, g" \! Z return formataddr((Header(alias_name,charset="utf-8").encode(),% N( }% e' ^$ P
          addr.encode("uft-8") if isinstance(addr, unicode) else addr))
    2 ]3 x$ E! D$ A9 X5 Z' m5 F' O; z; E1 V# w; W/ G
      o& A: y0 Y" N. H+ X
    def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
    , ~' ^8 k' H. O# O" k
    : n( Q& ]; F: R' L5 q; ` SERVER = 'mail.***.com'* c2 @- R. Y6 X  q  L& Q
    USER = '******'
    ( h; K, Q1 A, N7 ?; O6 ~ PASSWD = '***'' x; F2 @7 {9 f" q; H- b7 h

    - q) W8 A: M6 v  H strFrom = __format_addr(fromAdd)* m7 H( [" o3 M! v( {& j! D! B# a

    : Y5 m0 ]4 A, m& }! e7 ? strTo = list()) e* Y8 s$ D5 N, m3 }  l. m% M5 i
    # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
    ) Y2 p  m5 I4 j+ q1 H- O% N2 b try:( ]+ [1 k. h; p2 q1 O+ x
      for a in toAdd:
    5 l; ~" m+ D% A( l8 ]   strTo.append(__format_addr(a))
    / ^7 W- l, p5 y6 q& r" c9 r, \ except Exception as e:
    9 N" o* X# m9 k# {9 Q  q  # 没有对a和toadd进行type判断,出错就直接还原
    ) V9 R5 v8 Q8 R/ J  strTo = toAdd0 J2 T) f' B3 W
    $ b; F5 a: }/ E% s! i0 {' b
    msgRoot = MIMEMultipart('related')' X  K3 s* c. N/ [
    msgRoot.preamble = 'This is a multi-part message in MIME format.'. A" m6 j& S2 j2 m, a& }
    # F, m2 v9 X6 s0 F! V) `4 N3 k+ ?
    msgAlternative = MIMEMultipart('alternative')$ N7 S5 V7 Y! E
    msgRoot.attach(msgAlternative)
    $ D" a& L2 w" A  f& w2 M0 f
    - P$ J; q6 t5 f # 邮件对象
    3 a, S; m+ X+ } msgText = MIMEText(html_text, 'html', 'utf-8')
      g; P2 i; I8 c: o3 F3 y/ K0 t( r( e msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
    * B: t" Z5 d& c# |: c9 R& e5 d msgRoot['From'] = strFrom  # 发件人也是被格式化过的! `, O; l* z  P6 S; @
    msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
    6 e: T+ p; m+ V+ p" B2 z3 J msgAlternative.attach(msgText)4 q3 N- n' m3 D$ [% i$ N% ?9 Y
    - h4 M: e+ h3 I: j2 {1 W# s7 Q! z
    smtp = smtplib.SMTP(SERVER, 11)+ }8 I- [( A% ], P. Q: f5 o2 c
    smtp.set_debuglevel(0)
    $ }. J: l% k" r # smtp.connect(SERVER). f+ r7 j3 {# O9 g, ~/ T5 N5 g! ^
    smtp.login(USER, PASSWD)& |& @& `6 X" V  B' Z5 s/ A/ ?
    # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
    7 Z9 Q$ w8 a4 S+ S5 r+ R smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
    9 ?5 f- Z  D& i8 G# z) O smtp.quit()7 b0 I, E5 S2 X. ]6 O; a
    总结:9 N- W) g& S; d
    & Z% Z6 ~) Q! l: S! {" v7 l
    看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo/ p( [4 l* V- Z8 R- E7 v

    4 z2 x# c+ _" i实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”+ m* a3 f3 ?4 N+ W- Y: |; ~  t

    : u8 B* T% K* p/ O$ D0 D同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型9 p+ L% R; s0 t5 L. E) l
    5 }" i3 T3 n( `! x. M( R
    还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。/ k$ S. K0 Z' m% Y
    最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
    : p, f' p0 Q  R7 y% {
      p9 k. t! S' m2 T,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员3 x' K+ Z- E' f/ |2 [, q

    7 S+ K2 Y& b5 {% B# [定时讲解Python技术,分享一些学习的方法和需要留意的小细节* i4 r- v) i7 z2 C
    ————————————————
    ! A/ u% |6 N4 v1 p原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
    * X* m7 `: _5 x/ t9 v8 G: }
    6 P& _( T3 E/ n% a4 m- j  t/ b/ X$ e& ^) f8 U$ X" P. ^6 l
    6 x! E; n/ t( S1 u5 m+ x
    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-4 05:52 , Processed in 0.468725 second(s), 61 queries .

    回顶部