QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6111|回复: 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发送多人邮件没有展示收件人问题的解决方法- t" w5 @" y+ c' k) _4 C- a# r
    这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下8 z- {& f+ ~# m, r
    背景:
    9 Q' E6 l+ y4 M
    - s$ n* U: ~- t7 {# H, f' T工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
    8 Z3 Q6 g; L7 ]& J! W& \  W* x9 x0 C3 m% A8 f3 [
    问题:9 }; d7 a6 m0 `% L* K6 |
    & I( t1 E. h, `8 ?! ]
    使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容3 M* s! a. v$ E' z

    4 A3 Q# L* j; `" B. N问题代码示例:
    & N0 F0 }  E, S  M( [" e+ e! c. X# -*- coding:utf-8 -*-
    3 E8 l  f3 O( simport smtplib! h( a9 @$ I6 X: y: @) T- ^5 E
    from email.mime.multipart import MIMEMultipart
    " V, }* H% T& R9 m& q& |; ifrom email.mime.text import MIMEText( b$ g" D- d5 ~0 e  M
    0 v7 L& j7 T  s7 m
    def send_email_to(fromAdd, toAdd, subject, html_text, filename):3 K# O* Y/ K9 x. u5 g( w3 F
    server = 'mail.****.com'9 x1 i$ ?5 G. x4 O9 V
    user = '*****'6 K( ^+ H9 r/ J( l
    password = '********'/ M' I& N( q7 ^! |

    ! g3 e& E! Y0 Y" c* o5 k strFrom = fromAdd
    ) U! r1 ?; Y" A: X. b3 x strTo = toAdd
    8 ~% z/ W" P$ s
    + D3 c+ N3 L. P! i msgRoot = MIMEMultipart('related')* G9 u' v, T0 _- d2 w* ^' ]; y+ Z
    msgRoot['Subject'] = subject
    6 i, L' q# m% \- K/ p( }  H" U4 Y msgRoot.preamble = 'This is a multi-part message in MIME format.'
    - _( |& c' c1 R, A( V2 e# t+ i  D
    : B# Y' J$ r% r  n msgAlternative = MIMEMultipart('alternative')
    ; ^+ r) R' |; E  ?- r7 ^ msgRoot.attach(msgAlternative)
    + _) t: u2 c# E8 n1 y7 t% U$ _* m2 K* K$ r# r5 w; D$ q
    msgText = MIMEText(html_text, 'html', 'utf-8')
    & F3 [$ w. p8 r4 a msgAlternative.attach(msgText), H! ~; ?3 j5 G

    6 @: m6 y( ~! U, @# w+ V/ X smtp = smtplib.SMTP()
    6 j8 e1 V* K' n: t9 Q% e smtp.connect(server)
    9 ~) @* R# q1 _; `( h; V" d% }. [ smtp.login(user, passwd)7 p5 K3 H" w8 _; D

    ( L/ V, d8 S% k. E$ h4 w8 O1 m att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')& A# r* P8 q# g1 @) k& {
    att5["Content-Type"] = 'application/octet-stream'
    3 }, i! N/ C! z; Y# r  x) X att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
    8 y- m9 X0 X/ B& Y& w& \& ]$ z msgRoot.attach(att5)
    : j8 H" y1 V& ~4 }2 g5 ^: Q: B
    8 P$ U, E- M" P3 G* ]- U smtp.sendmail(strFrom, strTo, msgRoot.as_string())
    ! \) t8 c: n- v- B: u smtp.quit()
    1 F9 d7 }+ |. w# B& q4 ] return
    ; f) q# g( V8 F) @$ Q. u
    ( N+ Z( h7 d0 c7 T9 w- A
    / t9 P# ^5 X- a+ F9 ?; C8 d, H成功代码:
    / i7 W: a5 Y' ]4 p#!/usr/bin/env python
    8 C" h  A; E7 o; F+ y) f# -*- coding: utf-8 -*-3 A1 F; R4 _, n+ B) h8 |& p, N
    " }% m8 _" Z; {! B3 f, T$ s1 q
    import smtplib
      w9 A  P# t5 d  |8 efrom email.mime.multipart import MIMEMultipart. @# w$ V( T9 c6 e: C& h* ~; [" L
    from email.mime.text import MIMEText
    9 f; C; A+ ~! Q( |from email.utils import parseaddr
    ( d+ e2 C% s' S5 Y& Vfrom email.utils import formataddr7 A) i: h0 ^5 C9 \4 o* c2 U9 d& r6 d
    from email.header import Header' a" {9 \- D9 L
      Q6 Y) Q* J7 f8 ]
    ( E! y, h* i) o) m7 m
    def __format_addr__(addr):
    % G4 }" u2 Z& J7 [5 r9 ] # 解析邮件地址,以保证邮有别名可以显示! u! ]' D$ s& |; o
    alias_name, addr = parseaddr(addr)7 J) c% R+ a* `3 j3 s: N
    # 防止中文问题,进行转码处理,并格式化为str返回7 ~! f1 S* C) D7 y' i' H
    return formataddr((Header(alias_name,charset="utf-8").encode(),
    $ p$ J0 r8 f/ B6 Y3 ?      addr.encode("uft-8") if isinstance(addr, unicode) else addr))
    - e. I% U) K) m% S; r* S4 I: a/ X0 ^+ y
    0 X4 o1 g5 E/ V! I, {
    + b' g3 C; N& M' T) o) s# I& Xdef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
    ) Z! m7 `3 c, l; Y8 O2 }$ h- G- ?
    SERVER = 'mail.***.com'
    + T% u' {( W- w; o, P  B" W USER = '******'' `% R# i# C; B' e* {/ X+ W
    PASSWD = '***'
    9 t) Y% M8 X" F' F' T( F) t
    " D8 t  P8 B6 N7 g0 O6 z+ I strFrom = __format_addr(fromAdd)% Y  A* T4 `$ X) r1 }
    % J' s1 O% w! K! {& x4 h
    strTo = list()
    + F6 D  `5 F4 Z* G4 A # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
    : a1 H# E5 `3 W" k try:
    ; @1 W, W6 |! R: l  for a in toAdd:
      J$ }  F. X) m- L) Z% f4 R   strTo.append(__format_addr(a))  o) C) A* K6 G! g8 P, P7 [( A4 G
    except Exception as e:7 N  w$ i2 I$ c* d7 K6 _
      # 没有对a和toadd进行type判断,出错就直接还原
    1 r; |  z& e% k8 E  strTo = toAdd% |: g7 o3 J8 H- E

    * a/ v$ V  K  S7 y/ V' t msgRoot = MIMEMultipart('related')1 E4 N) }  N/ N
    msgRoot.preamble = 'This is a multi-part message in MIME format.'5 t8 H. v. s# j. T

    4 }8 ~2 A) q+ s/ o msgAlternative = MIMEMultipart('alternative')# E; X' Q9 Z" I% _& s  y$ _3 P3 ?( T
    msgRoot.attach(msgAlternative)" J! ^4 T4 u: k8 t
    . y6 l6 s) p5 Q* q. a, v
    # 邮件对象
    $ g# Q; c& y  X  c* w1 V- |+ ~ msgText = MIMEText(html_text, 'html', 'utf-8')
    & ~; I0 [1 h# q* k msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化% N7 }: t3 h( B+ V! B2 e- P
    msgRoot['From'] = strFrom  # 发件人也是被格式化过的
    1 n  p# E# ?1 d msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”6 ~1 c* B- y, ~3 y6 R. s* ~' L
    msgAlternative.attach(msgText)& s; Z9 O9 @4 L5 z
    5 u5 v; i; z2 p' ^
    smtp = smtplib.SMTP(SERVER, 11)1 N, g$ K6 E3 r6 |4 I  r
    smtp.set_debuglevel(0)
    ; G% U! ^3 B4 x/ @. r # smtp.connect(SERVER)
    + Y1 V. ~& b$ v2 h! U) j! J8 q7 U* z smtp.login(USER, PASSWD)4 S8 f; ~  g9 E  n
    # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别5 E. c+ F3 }  L9 @
    smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
    ( T/ x% U- U% o. {2 J) e5 P! W smtp.quit()
    * Q4 ]4 X# y/ Z$ r; o6 \总结:
    ) w8 M+ {1 @' v) ?& c/ b+ a2 E& n3 V; r* @" P2 O1 R
    看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
    , `4 _, N' f4 U* @
    ' v1 S% o$ N) d实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”
    ' l( q  ~' \* c' B# d
    1 L6 T' J  O) r7 N; c0 A; ]/ g* f同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型3 R# }1 R- \3 `& Y; ~2 a3 U  Q

    + B' j6 o9 j! F8 Q, d还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。! g: q# K- H* i4 d8 z$ F, ]
    最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得- F2 w# O0 y, l# f# Y
    # F$ g) x& i2 S) i4 a
    ,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员: `$ X6 e7 ~/ N9 L( A( y# m3 o8 t

    * N& R" V# [( k- D/ h2 C5 C6 `定时讲解Python技术,分享一些学习的方法和需要留意的小细节
    " x! ~+ N0 i7 v; j3 K. c% ]————————————————  X1 J8 c- Y. k/ c4 T3 w. `6 s8 P4 Z$ F
    原文链接:https://blog.csdn.net/haoxun12/article/details/105162947. ^/ p" D( d( n+ S$ Y- f
    7 ~$ E* C5 \: U( [/ N$ _. E

    % [1 U# R& o4 b% u
    . c- l/ |# b5 w
    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-7-18 11:10 , Processed in 0.452868 second(s), 60 queries .

    回顶部