QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6061|回复: 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发送多人邮件没有展示收件人问题的解决方法
    * q8 h6 Q7 S# A这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    / w, ~1 b+ T( x" \! O" ?背景:9 t* P8 ]" ~* h7 T" x
    ' ~$ n! x1 _9 P- D% \/ }" N, O
    工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
    - a7 Z. n; t  N2 \" P% {, [$ e5 `8 i; i/ ]: `! C
    问题:: M8 S! R0 K. T. R( |

    0 t' O0 b$ H8 t0 z使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容4 ]+ P/ U. u% f, }* B

    & E$ U4 ]% D. O: H问题代码示例:1 J3 I0 u! Q+ U( @
    # -*- coding:utf-8 -*-* b) k! h) W/ p4 G. p8 x( {0 A7 c
    import smtplib
      e; X) i3 ]% L9 \$ O( ?from email.mime.multipart import MIMEMultipart
    3 c) Z1 c7 `8 O7 t& vfrom email.mime.text import MIMEText& d1 c$ h. X: X- J, u
    7 L+ {& e: j  n6 t0 _7 i6 _# ~
    def send_email_to(fromAdd, toAdd, subject, html_text, filename):
    : i( v3 o9 P; j/ j6 m server = 'mail.****.com'( `! D. s1 [& o& d& V( w
    user = '*****'9 O! x% P, w4 S' }& G; F0 H
    password = '********'
    ! T9 g) b( q: j- C: t# o+ m
    ; O1 a" C6 p5 j' d+ l- D strFrom = fromAdd$ O5 E$ V, d: S1 t
    strTo = toAdd
    $ I# o9 J0 E! w, x
    2 [% A4 g% N" p7 o" n msgRoot = MIMEMultipart('related')
    $ e. Y. r6 f! D) l; d% U msgRoot['Subject'] = subject% M0 Y: h3 N7 @/ P8 i* A& O
    msgRoot.preamble = 'This is a multi-part message in MIME format.': v# b& f) V1 @7 J6 j! b  m

    % a/ Y" |1 `5 j$ a0 N' ^ msgAlternative = MIMEMultipart('alternative')
    " [% Z" \" P3 c: Q# @ msgRoot.attach(msgAlternative); T/ g1 X. E% G- b5 @7 S

    & m2 B% Q/ I/ ?9 d7 o& v& C7 ~ msgText = MIMEText(html_text, 'html', 'utf-8')
    5 i. M+ f8 r) X/ V msgAlternative.attach(msgText)4 a$ @! l) r& C+ P- K8 E

    . F* C6 G( `/ C0 I  _ smtp = smtplib.SMTP()( l4 b4 M8 D/ N' }
    smtp.connect(server)" [  N' u7 v3 n) ]; Q2 C# _: c
    smtp.login(user, passwd)
    ! w3 v" s+ }: @$ t
    5 [5 V5 e# `; T. [' k2 M att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
    ( k/ f9 T$ ^( \4 [ att5["Content-Type"] = 'application/octet-stream'
    / @4 A  B2 @7 E, ^3 X$ r; ~ att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
    : n: v- T" m: m5 |# w7 a msgRoot.attach(att5)7 L$ E7 l2 m1 H& u6 Z

    1 v5 A  ~! C# U, r+ z% E$ e0 W smtp.sendmail(strFrom, strTo, msgRoot.as_string())' n/ F4 o2 l  a) T. `) i( q
    smtp.quit()
    $ A7 Q! f# G* R' [ return, _1 s6 L! X+ B7 y) F7 d2 J

    7 d6 ~% G) A1 k! S" [" Z! d: x0 W% H$ U
    成功代码:
    ! I( l; M+ g2 z, I- z8 }& e#!/usr/bin/env python
    ' B: {# l! C: {; k: l) r6 I* s1 P# -*- coding: utf-8 -*-# k% Q4 g5 E2 S& J' D' N! h9 x

    * t( G* ~5 H3 `( {( l, v  p& limport smtplib9 z) {4 \* w: W
    from email.mime.multipart import MIMEMultipart  e3 o3 `, j* n% Z% O
    from email.mime.text import MIMEText
    ( I  y. l) @) C, D8 ]  S% A7 Nfrom email.utils import parseaddr, M6 A4 A) n" k% F4 L7 N! A8 E
    from email.utils import formataddr: Y9 B/ a/ t  _  Q1 g- ?: `6 c
    from email.header import Header" V8 H- T1 ~8 N% O6 s5 s8 o/ P. `7 d: T
    ' J8 k1 e; g# E6 a  v9 ^) [8 ~3 O

    7 P4 u# d  h5 `2 V8 Q. P4 {* L: |def __format_addr__(addr):
    ; ^& F/ k8 k$ p+ n% k: d, @9 _ # 解析邮件地址,以保证邮有别名可以显示
    % p2 V9 ?" s3 G alias_name, addr = parseaddr(addr)
    8 V8 h0 {* S( X* y  ~ # 防止中文问题,进行转码处理,并格式化为str返回- {7 n4 c" r0 I! Z! ]5 E" S" {
    return formataddr((Header(alias_name,charset="utf-8").encode(),& M: w0 f9 D, Z3 f
          addr.encode("uft-8") if isinstance(addr, unicode) else addr))
    ' L( ~7 N/ T/ O) L+ C* e! |% M, T
    & H$ O$ Z0 ^, a: u' t
    ' a$ r: F, s* ?: B/ K0 ?1 Bdef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
    7 H+ f8 M# K# D' M. y3 p! d  C/ [5 D8 L! M' c: ^" B# a
    SERVER = 'mail.***.com'
    + }+ y0 N9 G/ J% U0 ?! O4 J/ @ USER = '******'/ F0 \4 Y' X# {
    PASSWD = '***'
    - s7 ?) O, d! }6 Z6 U5 q! g$ m, Q/ K1 T; }
    strFrom = __format_addr(fromAdd)
      y/ V/ j3 o5 _: f1 }; m; e
    3 v9 P9 g4 n! Y; @- j3 {" O/ M strTo = list()2 X7 P- I; N+ F$ X7 ^
    # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化* ^+ S" t1 S/ _% C+ M: p$ \
    try:
    - ~: y. ]9 _* @6 B2 o5 D  for a in toAdd:) g; U$ U' r; Q9 I3 ]+ c
       strTo.append(__format_addr(a))
    % O# j8 S( O( n5 P except Exception as e:
    ! l9 E5 H5 H, B& y  # 没有对a和toadd进行type判断,出错就直接还原
    9 e2 A; B+ C, O; n$ d4 c! Y$ n  strTo = toAdd
    * L: E3 r. |) i3 q. Q2 m6 f, m
    1 X2 u5 n7 N9 F# _: [1 l9 \- C msgRoot = MIMEMultipart('related')
    4 `6 X5 _# ^' w8 {7 E: \3 b! Z msgRoot.preamble = 'This is a multi-part message in MIME format.'
    2 V" r( J* L1 I  H- ]$ [- U9 r, o) g/ R2 C
    msgAlternative = MIMEMultipart('alternative')" g# ~' G+ j5 [/ C5 q8 U9 X
    msgRoot.attach(msgAlternative)
    7 V) i5 \* G: g4 H, P
    ; e3 F) _3 R4 c9 W0 N& t # 邮件对象
    " P) T1 J# T% I msgText = MIMEText(html_text, 'html', 'utf-8')2 @' l! K3 y6 S
    msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
    2 F+ @$ s& |6 ]4 L msgRoot['From'] = strFrom  # 发件人也是被格式化过的) T7 B. O, F: f  z# G' H8 x
    msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
    5 K. t1 y. `$ ], T7 ^ msgAlternative.attach(msgText)$ K' V) w# ?6 U9 m0 l6 x

    + E! f3 L5 v* S  P3 X" a8 }) ?0 O smtp = smtplib.SMTP(SERVER, 11)/ n+ }5 W5 o5 Y; }, i* N: Q; n4 g
    smtp.set_debuglevel(0); @( [2 n$ k# @4 H5 k9 ^
    # smtp.connect(SERVER)) |# A1 A  S7 c2 n3 [5 Y- t
    smtp.login(USER, PASSWD)
    ! k5 c7 i7 Z/ c  S. A$ e& [+ J # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
      \# T1 @, {% b, V9 F7 v smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())# t( X7 T1 @" S
    smtp.quit()
    / n* v9 D2 B- ~6 T& o1 R4 @/ E总结:
    7 G/ d* P4 ?5 c8 Z4 _' L7 r5 r3 H6 q2 C+ M2 f! T7 w
    看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
    3 q" I) W3 s* m+ [3 u1 q4 b8 D8 U5 [2 Z; g
    实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”
    ! s& ?1 q8 @: p  c' ?: q8 W* Y, T$ ~3 E$ G* v9 P
    同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型2 v! }$ w& H! `) X3 U
    & a) g& m0 a* k+ V
    还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
      J+ t+ F) K" i9 F4 J. d最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
    5 P, F; |- `9 U+ B& n) f" G/ R; S3 v1 U, d& H! l4 w" C
    ,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员3 \+ m$ w' s, `' B9 P

    . w7 t: I; A+ y8 u8 w* W7 W定时讲解Python技术,分享一些学习的方法和需要留意的小细节
    % Q& C5 n  \! B2 e6 _————————————————5 M5 R& p( y+ {8 J$ G" P
    原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
    1 _0 w5 K0 f( {0 v% P6 [7 R- o9 m" f/ ~9 w
    : p' s- Q- U; g/ m) ?

    $ }3 H. A& v( F# N* T
    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 05:51 , Processed in 0.427383 second(s), 60 queries .

    回顶部