- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563372 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174234
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python发送多人邮件没有展示收件人问题的解决方法 r% b0 T4 h. X( W, N
这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
* e) W# V9 o+ l2 o背景:) P+ x3 W5 s4 \. F2 _
/ x+ t/ X" B9 ?% s4 z* v
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人% X/ h7 `7 [; ? W
4 M7 S& k# L c/ ~5 V# Y
问题:
. v, a$ t' |1 N$ O* k9 S1 G) V7 m4 @) F
使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
1 @! B3 q: F& V( S
+ i3 Z& H$ r/ Q; q# @5 F问题代码示例:% z f" ]; c: e' f1 h
# -*- coding:utf-8 -*-" q; F5 F* T5 M2 \+ y; ?
import smtplib) |- n! G- y! o5 R: v; s
from email.mime.multipart import MIMEMultipart
. p# ?) E" F0 R1 R* g4 N! cfrom email.mime.text import MIMEText
. h# ^0 ^2 d) k7 G/ K3 p1 }; }
def send_email_to(fromAdd, toAdd, subject, html_text, filename):- Q5 k1 w9 e4 G# b5 K2 R7 y6 D
server = 'mail.****.com'
8 G; M2 Y$ {) r* ~* p0 j& h5 J9 P user = '*****'
8 v% p0 n1 J- C6 e password = '********'
' N- Y! g% W1 E$ G0 t. m0 R a& r2 i0 _. Y
strFrom = fromAdd5 k K9 E4 L! |& L
strTo = toAdd- ~7 ]( B7 a9 t: g4 {3 s" r
6 d: q- b( s$ B3 {
msgRoot = MIMEMultipart('related')
7 s7 C% P% P; Q8 p. d4 N) r msgRoot['Subject'] = subject
6 [( P1 f: B6 F6 A) p msgRoot.preamble = 'This is a multi-part message in MIME format.'! I+ O. I3 E8 ]1 |! s: X
' I0 V. O5 a9 p" c! n1 k; F msgAlternative = MIMEMultipart('alternative'); Z5 H7 N& k( d8 A+ B
msgRoot.attach(msgAlternative)) M; {! \6 }2 B7 ~- y1 \% ?) _
0 }. O) M) f' \. E" Z( K( m msgText = MIMEText(html_text, 'html', 'utf-8')
3 y [# F5 }5 [7 B% | msgAlternative.attach(msgText)6 e; E3 C: t) A+ i0 l& R
3 Y0 e3 V( Z! y0 U5 j2 }; t smtp = smtplib.SMTP()
; [4 g% q) e6 N' P smtp.connect(server)
) d0 t6 c, g( e% v; t$ {/ y3 t smtp.login(user, passwd)) Z- P9 Q/ s4 Q8 g( n- g
' N' U+ ~. h9 L' L a/ f* i! u2 b att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')1 N+ s1 D1 I! |' q6 @( k0 g
att5["Content-Type"] = 'application/octet-stream'
0 {! z+ ] n) s& i4 L% U/ x+ l att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'+ R8 g) |& t# L% W7 Z
msgRoot.attach(att5)& r7 R3 f4 |' e! J. N9 W& p
6 K( n4 R. N8 w, Q) U
smtp.sendmail(strFrom, strTo, msgRoot.as_string())2 [+ X/ {) C1 z4 P+ s) j0 U
smtp.quit()
% E4 w- _% ^0 S9 u( w% k5 Z return
8 k6 d; a3 [8 D0 u0 B: o9 g; I" W8 Q0 y! g( Z3 ~
_- H p9 m' |
成功代码: a* ~7 T9 g c0 l1 Q
#!/usr/bin/env python
5 y5 h8 Y4 E+ S5 F f J# -*- coding: utf-8 -*-+ A+ @* [# p/ |
F; H# Z5 P' I& I+ I
import smtplib
! o, ~# x- z: r" X& Tfrom email.mime.multipart import MIMEMultipart
& t% `% E& p1 G: u$ g% I5 {8 \from email.mime.text import MIMEText, R+ @$ j: P3 V9 ?
from email.utils import parseaddr: `. K9 |( s I; S
from email.utils import formataddr
1 N* Y. Z. ]9 L# F6 Q0 Afrom email.header import Header/ n+ P6 u8 E2 y" F' X
& k# W' {3 R" K8 |
9 P4 D6 a/ {; W+ Q9 Mdef __format_addr__(addr):
$ ^. a5 ]4 O$ z9 @4 t$ Y # 解析邮件地址,以保证邮有别名可以显示4 R5 z- I6 \7 D8 k$ l
alias_name, addr = parseaddr(addr)5 p+ D+ h' G* f% E) m
# 防止中文问题,进行转码处理,并格式化为str返回
+ O9 Z( I3 |! A return formataddr((Header(alias_name,charset="utf-8").encode(),# I* w I# X: A2 Q o
addr.encode("uft-8") if isinstance(addr, unicode) else addr))
- x# w* \) L0 x2 G/ q: E5 [
/ V5 i$ k* e0 j# E4 |0 I
0 I) B$ Y/ `+ q; ~ ?& k! ?1 ^" ^def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
2 C' f6 M5 n( P5 z
& D8 y( y* y2 e2 [1 \& M% s SERVER = 'mail.***.com'& q8 V- G! b" f0 u
USER = '******'
3 o- s" }- ?, ? d+ x PASSWD = '***'" o B, }9 U' T! X% q* a
6 x* t! t' L. I3 U
strFrom = __format_addr(fromAdd)
6 r1 i8 ~3 J. V
8 T1 Z2 B% c0 W; J. A$ \: |! ?; x strTo = list()$ f, q$ _4 O0 B" w0 h' Q3 c
# 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化; Y3 L* j, E' [1 k; t8 B+ T
try:
' ^& U6 f; ?5 Y/ t) Z- q7 p& x: j for a in toAdd:
& b7 [7 d) e) ?- w strTo.append(__format_addr(a))* A6 M9 s% l; {2 V; e- T3 G
except Exception as e:/ t. r' R2 Y: D' v& Z" Z
# 没有对a和toadd进行type判断,出错就直接还原8 D/ E }; O; l# X9 C$ o, }" T
strTo = toAdd, }' j2 A! y2 v0 N' r5 ]
$ C* O7 X+ w- s0 s- n+ I
msgRoot = MIMEMultipart('related')
1 {: C: P4 G; L; P2 H5 N) Y0 P8 M msgRoot.preamble = 'This is a multi-part message in MIME format.'2 [7 Y0 w# D3 j' R' m9 v* I: z
/ ~; W" m+ z; I2 X
msgAlternative = MIMEMultipart('alternative')9 k9 F/ N3 O) ^4 G
msgRoot.attach(msgAlternative)
4 y. n S! @) @; p. I5 y: c
; w; t% y g" [4 R* X2 H) c # 邮件对象 ( n1 n( t+ a( Q, d2 y* h. D+ |
msgText = MIMEText(html_text, 'html', 'utf-8')2 J) c& J2 B$ q. G0 e
msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化- M" P7 c. b$ {. r) y
msgRoot['From'] = strFrom # 发件人也是被格式化过的' h7 X% p8 B7 L' J% ^, {: _
msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”; k! S. C/ }( W# x# G; x3 Q
msgAlternative.attach(msgText)
' ~! ^0 W' q' g! E0 \7 L% h& r! w7 w3 z
smtp = smtplib.SMTP(SERVER, 11)
$ h0 z6 B( p6 U$ _ smtp.set_debuglevel(0)
1 @! g( B% g0 G) @ # smtp.connect(SERVER)
7 W0 B: F Z# |0 l" W/ y( n smtp.login(USER, PASSWD)
5 q2 U6 z g0 ^1 C4 ` # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别0 b7 ^& j, Q& {& {" m1 t! Y
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
3 A; r/ r3 K; l& G. x smtp.quit()/ s% a9 u' r7 O0 _
总结:9 P# G3 L- B6 [/ {' k, Q
9 G) `6 l/ T% \+ A& z9 a; g0 f9 I: ^- e
看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
5 o$ X$ w Z i3 O+ G# x) Z
& k L/ z: d9 b实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”& e Q5 A" [% J) J
- Q0 w' p+ I' R* h3 J同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
3 q5 S) p' f$ D" q: z8 o& {! H9 E% R% o# f# z2 s: E
还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。0 {2 u9 ]7 \, Z D9 t# j! ?3 j6 l
最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
9 W" p8 o/ R! v
: M# Z3 l( W$ W& N,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
; P& y$ `1 l7 U4 j7 {# L9 f
9 k0 B5 J8 [0 t$ d' [( i. x定时讲解Python技术,分享一些学习的方法和需要留意的小细节% W" `2 m! w. D1 [5 b
————————————————, {9 t' Q4 \- S, b: ~1 \
原文链接:https://blog.csdn.net/haoxun12/article/details/1051629470 G# C' m( T6 N3 v( ]
9 q" \+ G- b, ~; S6 W( w
, x$ X* e" _. U8 j/ A
6 J% ~) o6 X/ R |
zan
|