- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563371 点
- 威望
- 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发送多人邮件没有展示收件人问题的解决方法6 t% G" ]( b9 D! k+ ]
这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下/ q" z' Z! w Q. g0 c& f
背景:
& C8 U* U. e, ^+ \5 l: Y9 [, z" O6 a
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人6 D- L$ w0 Q' p3 s4 i P8 ^% u
9 g$ L& O" X6 | H, e
问题:' ~$ o9 w7 h1 u; A
, |6 C ?* n) f3 q3 {/ z2 W使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
" \8 o0 j& u2 `2 K1 J# r6 }" b. y0 U- _3 u: V' `9 I0 Y
问题代码示例:6 }+ e. F, m4 E
# -*- coding:utf-8 -*-
: }: y* @( z* r& S" C. zimport smtplib
9 i' ?6 T1 r& J4 f3 Lfrom email.mime.multipart import MIMEMultipart5 A0 ?9 P8 x* [+ o* x
from email.mime.text import MIMEText
1 L- l! y- g2 S/ W. \
/ g. j' e V) j- y* E: `- `def send_email_to(fromAdd, toAdd, subject, html_text, filename):
$ B$ P z' J, Z+ t* W& k server = 'mail.****.com'; V3 d* c D( t/ N. J3 I0 ?. w
user = '*****'" I4 l r4 Z! c
password = '********'( H" u. z9 p0 T N, y; O' [# w
0 t5 [- \* ^6 S
strFrom = fromAdd
* x. V5 R1 w0 R G: S/ K% C strTo = toAdd- m. f1 |$ n( c$ g9 d4 H
% b3 G4 E0 \- k+ _7 l( \/ D. I
msgRoot = MIMEMultipart('related')
( B0 T" D/ G, ?* L# L4 \ msgRoot['Subject'] = subject
5 ^& ^1 n& l$ f msgRoot.preamble = 'This is a multi-part message in MIME format.'* [8 S( t3 Q7 a2 l5 T' O5 t
. {8 ]- G% c8 X* f1 t' ~) V
msgAlternative = MIMEMultipart('alternative'), K* X4 Z, X9 N
msgRoot.attach(msgAlternative)
" d, `$ e4 P% G7 m
4 U. c6 p6 L( q9 I& g& @6 c msgText = MIMEText(html_text, 'html', 'utf-8')& q( E* K9 E7 Y/ h6 w
msgAlternative.attach(msgText)
0 J A7 w5 Q: h/ M* B) F* b3 O# c
: ]9 p% _! n# a: S. b) j smtp = smtplib.SMTP(): ~8 Z5 v! E8 N [& L) n
smtp.connect(server)# n/ x6 F' U! o7 F" w/ S
smtp.login(user, passwd)+ z9 T7 r; U% ]* R. z; M
( r% U, {8 h# \8 \
att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')- s4 h% {5 x- u! }" y0 u
att5["Content-Type"] = 'application/octet-stream'2 S% `3 a) t5 W4 P5 K
att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'! I3 }% e" t" U+ q
msgRoot.attach(att5)& k& n' Z* I4 |) s5 W: P
# q k' \" g" E9 [+ @: M5 ]! X
smtp.sendmail(strFrom, strTo, msgRoot.as_string()) f6 M) @4 a( i' x' d: ^
smtp.quit()+ G- v m' ^* t1 C
return; C6 R! n7 G1 S! j& K2 b) L% G
3 ]3 u: W; S, s, J' @. P5 t2 O8 \- q6 `3 e# O! V0 W
成功代码:0 T6 L ^4 Z+ i( Z5 _4 {* B
#!/usr/bin/env python
3 F* C+ N5 x) u ]( w' x/ p# -*- coding: utf-8 -*-
0 I: z* V; c7 D2 E6 t0 l" X1 x h1 z% `% ~# W4 O7 L
import smtplib
3 o, J2 Q6 f$ Ufrom email.mime.multipart import MIMEMultipart( _$ ^6 Y3 F J8 l9 ?
from email.mime.text import MIMEText
T! H) f6 D4 G6 ?from email.utils import parseaddr( i* F: M; A+ {, i
from email.utils import formataddr
' |2 s( A* c* \) Vfrom email.header import Header n. `9 h. _+ @/ f7 y7 y
/ p) K! d: I8 k8 N8 ]0 O2 T0 c" W, V! d( ?
def __format_addr__(addr):4 M' r, w$ k; ]. A( M% Y
# 解析邮件地址,以保证邮有别名可以显示 h5 f9 ^, }- E: q. ~9 |
alias_name, addr = parseaddr(addr)9 k% Z# b' c9 v- H7 h6 `
# 防止中文问题,进行转码处理,并格式化为str返回
' Z! i% |" S4 ]; f return formataddr((Header(alias_name,charset="utf-8").encode(),) A- |2 G- L% i) n/ I" {5 ]! u# r
addr.encode("uft-8") if isinstance(addr, unicode) else addr))( i& A- x9 X: C; q. B7 O! O$ r: U
. u- F q+ R' f& ~+ N
( P1 X. ^: W2 u8 I1 ]def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
% @! z9 H6 p# s8 `+ F7 O, R& q
4 R/ J. X, v6 q) j4 S SERVER = 'mail.***.com'
$ H+ k- l$ Q! g5 ]+ | USER = '******'
7 b+ a" a o% U, {% F2 S( p0 ? PASSWD = '***'* m- S" j2 Z- G- N+ T/ w
; H& Q) W- W) {) c( r N7 b+ R( S5 z strFrom = __format_addr(fromAdd) a! w3 A; L+ f$ W% m5 t
& Z" G5 f9 M( ^8 Z/ Y- r" q strTo = list()
) ~, z& W, a) C # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化' j; b W @- Q* O3 R2 Y6 A/ i. q
try:. o3 z: f* _& ^2 t+ b' p# Z; ?/ k
for a in toAdd:3 R$ [) X, c$ {& T; m' y" U
strTo.append(__format_addr(a))$ e3 z I; k+ y' L, D
except Exception as e:
8 {& o8 _0 j x) I2 u; s3 p# Q8 X- \0 P/ U # 没有对a和toadd进行type判断,出错就直接还原
2 s" {% a u6 Q+ G! u6 | strTo = toAdd
" q* j+ T4 l2 }9 n3 d8 L3 S8 F
" H7 Q2 D0 {/ ~1 p9 E t) u msgRoot = MIMEMultipart('related')( G9 q% q- J& z5 W( A* ?+ s
msgRoot.preamble = 'This is a multi-part message in MIME format.') D- h5 }6 W( K8 W# k8 Y, V& g5 u2 V
: S0 F$ ^) n+ Y9 e msgAlternative = MIMEMultipart('alternative')
p; i/ q% G$ x* y; {' W% e3 { msgRoot.attach(msgAlternative)
& q: y8 c' r7 ]8 j" m: [5 ]* n6 O5 P5 \. v
# 邮件对象 ~4 `# h7 R' c2 M0 F" J+ ^: p
msgText = MIMEText(html_text, 'html', 'utf-8')
q% P& V- m2 m msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
9 u4 ?7 y, g J; `- o8 D% S6 Q msgRoot['From'] = strFrom # 发件人也是被格式化过的3 T1 a, _' _$ s3 H* U
msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
: Q. r1 D' G; K5 T. o* { msgAlternative.attach(msgText)
4 P3 L7 N7 o8 w% [/ ?; d
! G2 v& T- R7 V+ [- L* _1 } smtp = smtplib.SMTP(SERVER, 11)6 W/ x- y( M+ y% ?
smtp.set_debuglevel(0)6 y; I |8 m2 X6 T* D) d
# smtp.connect(SERVER)
@3 T8 g& y& U- Z/ |1 U' H- R smtp.login(USER, PASSWD)
* G9 o8 F- z2 M. {( w7 ~- V # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别0 k$ s) |4 d% U% Z2 S$ ?
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
! j+ W8 o( B- x9 X! Q smtp.quit()
/ R k# t, q* o8 J. [总结:; T1 @% q. H' t H; K
1 ?; P/ C7 Q" t' I$ f
看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
" B) N# ]9 b4 n; q+ L S; g
$ u; k. y5 H/ D* o$ L C/ S. u实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”6 N0 H$ z2 S0 T/ {0 T
7 u' u& q8 |$ E同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型- r4 I. }1 ~9 K X5 |: o
$ g X: v8 {6 ~6 b; e4 V3 T还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。; u+ q& t2 P+ I# Y) L" m+ X, o+ T! A- W
最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得! g. M7 W! h8 ~
: m* A* T D: M3 n- e) a* j( F ]' s/ S
,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
1 ?5 E# A7 b! u* ^
: A+ J. c4 u! _# i* Y: J" p定时讲解Python技术,分享一些学习的方法和需要留意的小细节
$ q7 t1 g/ q. E# m) I1 X————————————————* }, L% |( x3 X f: H$ x( F
原文链接:https://blog.csdn.net/haoxun12/article/details/1051629475 i" ^: B7 P6 N0 q7 H
G! P2 q) F' |! S- }/ a6 Z: A6 Y1 `
$ Y3 E3 R0 r( m% Y$ u* A
|
zan
|