python发送多人邮件没有展示收件人问题的解决方法0 r$ T' L0 s. p+ t. ^7 I9 F
这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 , b0 _5 a5 D% L: v {3 P背景: & t j8 I! ], q$ W! U. s0 u0 ^ O* o
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人- Q, Q7 T2 O9 `8 ]) D j
; F3 E) o' Q0 G, I' ` |( A: j2 p问题:. n- J% M% N4 W2 L% q% x
, | `6 R) g9 u1 Q/ w7 `+ J使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容; ^! k( M; Z8 x9 h# x z. \
m" l3 ^; o: f9 N, S) {8 a7 V! v
问题代码示例: ^& D8 j2 `$ E9 _7 ~% _2 I# -*- coding:utf-8 -*- $ g" o& Y+ p0 x' ~6 I" Ximport smtplib % x+ @; B( i+ \% V. B: \" f4 yfrom email.mime.multipart import MIMEMultipart+ o4 E+ b2 i3 v9 e3 T
from email.mime.text import MIMEText ( z. f) j" D' F7 F& ~. N- s 4 A/ n% m1 ^* t, G/ D5 fdef send_email_to(fromAdd, toAdd, subject, html_text, filename): 2 M2 d4 @1 @; Z' N1 A4 {: I0 R server = 'mail.****.com' ' z8 z* f3 a Q ~# L user = '*****' ) P& e& x/ L: \5 Y: ?5 h4 f password = '********'( R- S& y. y; m- _- D- u5 M% C! h. Y
/ v' e" ~( ?9 b% I* W strFrom = fromAdd/ q3 x& a3 T5 L: J
strTo = toAdd : P8 O: U# e* V7 P5 p0 N4 D- n 8 M# K0 o/ P% b9 S X msgRoot = MIMEMultipart('related') / A9 u( @) Q' A/ y7 c2 P msgRoot['Subject'] = subject ' L' Z/ u. r, `! Y! P% z msgRoot.preamble = 'This is a multi-part message in MIME format.'" f" D% A5 V7 }, G1 H- r/ h4 j
! y( ~ H9 r; f( @6 c$ b msgAlternative = MIMEMultipart('alternative') 7 o' u" Q+ R2 m5 W* Y" ]" } msgRoot.attach(msgAlternative)% W5 E# t0 Z1 s C: s
1 U: b! H8 t- G( g
msgText = MIMEText(html_text, 'html', 'utf-8')7 Y* z- z% G+ e! E' u% w) o. u
msgAlternative.attach(msgText) . a% R7 `& r7 y/ s) W7 Z6 `4 w 6 d, R% J x6 r* ~$ B+ a smtp = smtplib.SMTP()5 j: A9 t7 Z8 u: n
smtp.connect(server); @4 L% H0 S7 Y) D" i1 r
smtp.login(user, passwd) - B0 \+ D3 s* _; T" ?$ e; q6 |" D3 H
att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')# _& S- \) C# Q! d) z) j
att5["Content-Type"] = 'application/octet-stream' ) Z0 A/ w& T: K; s) P4 L att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"' 8 F. u/ R% f, }. @0 w7 M msgRoot.attach(att5)# `2 P3 z9 l7 k9 Y0 J3 y
* i" |# S' X$ s
smtp.sendmail(strFrom, strTo, msgRoot.as_string())# q, ?# @9 p: G( G2 G2 E' z/ T
smtp.quit() ) }! k' r/ |5 D! F- F return' z. Z9 D$ t* J0 e+ O
9 a8 y- w, e( `% Z: I: j5 b: ]! D. a& c1 e% e$ Q. H y
成功代码:9 T% C, r/ w$ ]- a) Q- U* T! k3 i F
#!/usr/bin/env python- I% N* s, t. E1 r/ t3 j
# -*- coding: utf-8 -*-7 O# t3 }; P) G# c; `3 [; L
% H4 t/ Q. `3 K. ] V. s4 c0 G0 _( i6 limport smtplib 1 ?/ O; W% _( |7 i* g+ q8 [from email.mime.multipart import MIMEMultipart6 P' c5 C. v; d& w' h* X! V/ J
from email.mime.text import MIMEText 4 o6 i; g) i# I7 }) e( bfrom email.utils import parseaddr . q3 _* {9 {! \3 \8 E# vfrom email.utils import formataddr. |8 H) n7 U, n. p* m9 I' ?" n( f- Q6 A
from email.header import Header0 o; ~0 W6 N: x3 h
% ?" m% }0 _6 P2 D5 r7 D4 E9 [
l5 `$ C8 W9 c; t. O$ P! bdef __format_addr__(addr): " ?0 T9 P, M8 k8 ]- Z. ]- D # 解析邮件地址,以保证邮有别名可以显示 ( V; u2 }/ ^' Q9 b4 e: x& ], {6 C alias_name, addr = parseaddr(addr) ! w+ @8 w+ V$ u5 @, O( f* Y' m # 防止中文问题,进行转码处理,并格式化为str返回, r% `( @4 e1 r5 x
return formataddr((Header(alias_name,charset="utf-8").encode(),( E) Z( a, L) I
addr.encode("uft-8") if isinstance(addr, unicode) else addr)) 9 I/ @% }4 q R1 t6 V " G, }: k+ B1 ] q( I% ]( P4 H/ \- a! R, V7 Y9 w
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None): 0 f, ~' l6 d# { : }+ ~" h1 g+ r8 d- h* s. x9 e) C SERVER = 'mail.***.com' $ o% Z% @. n5 U4 m6 t USER = '******' ' W) q' N2 X* x W) P- i3 k PASSWD = '***' 5 M4 `5 {2 B5 Y$ r% x, a3 k# ^1 ^, e- G/ ] K3 W7 e) ]) v ?
strFrom = __format_addr(fromAdd) 6 j2 R' H4 }0 f' [0 ^* B" @7 ^2 U* n: P$ N. M
strTo = list() $ F' A/ e" u- J+ ] # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化 ! X# H# X) _* M1 Y# i+ P try: 9 |+ b: F! k) N9 D& s3 H for a in toAdd: : j8 O) [ C# G Z- `) M- x G strTo.append(__format_addr(a))/ c+ N/ F1 \4 t( r
except Exception as e:; H! K/ u7 ^& j3 X/ w/ @3 h) q
# 没有对a和toadd进行type判断,出错就直接还原 - h$ P! @3 c2 I4 H strTo = toAdd& I; @5 k0 Y. F3 `! Y
. F7 R/ \7 F+ c3 A6 ^* T8 i" v% Z
msgRoot = MIMEMultipart('related') 2 K/ g t w6 f* \ msgRoot.preamble = 'This is a multi-part message in MIME format.' & H. v9 r" ~, _4 C, t . c5 E, C* W s/ s msgAlternative = MIMEMultipart('alternative'), |) e3 F1 q9 \# l
msgRoot.attach(msgAlternative)' F, L0 _ O' S. D1 \& \/ B$ u$ Y
- U/ E7 T0 e6 N9 m: `
# 邮件对象 ' U' X* N. N' A& A3 z3 Q8 ~) }/ ?) h" L
msgText = MIMEText(html_text, 'html', 'utf-8')( o; ?# ~2 M0 c9 b' b! C2 t
msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化: ^- b" T: z: n* B$ N$ F
msgRoot['From'] = strFrom # 发件人也是被格式化过的 9 K, Y; c$ H- o* O' H& {0 X msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'” 5 c8 a5 r" s' M3 o+ @3 O" j msgAlternative.attach(msgText)! d: }) j2 e% V" Z0 b2 P9 q
( n; S1 @' q) @, A
smtp = smtplib.SMTP(SERVER, 11), B8 _/ T1 c* j+ C* \' D: e
smtp.set_debuglevel(0) + J% e# `8 o w. i2 o4 X # smtp.connect(SERVER)" X7 ?( a: Y7 ^8 H. z# ?. W
smtp.login(USER, PASSWD): F9 B; z# Y1 k8 N7 l3 S: u9 c' q
# 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别7 k/ ^, G. q4 S! P! f$ y- O$ T9 O- }
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())5 T* m* M+ S/ v
smtp.quit() 9 ~. M# h7 T2 ~0 p8 K- N2 r总结: " b$ O! W: V5 U$ H, k) o: W& _, W! G' \( z5 K1 k+ ]6 v
看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo % v( _0 [( {! r+ Z! M% S: a7 b( e& Q! }7 T
实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’” # V* E3 w% d3 [+ G. t% y; E/ A( d# I1 i( q! [! N0 R+ E2 T
同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型 , y7 n( e# N9 y( k$ `$ k / ~, M; W0 o: p; J( v还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。" f; \4 C/ V$ K6 N, H
最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得, w* B z- G0 S: @" G
- o9 [2 T5 U! B# L
,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员 . w* q! O' E/ i* F7 p) c & ]8 g" e* e1 d定时讲解Python技术,分享一些学习的方法和需要留意的小细节 $ ?7 c0 Y6 e2 R) O/ a% B———————————————— 2 g3 @ C6 D5 o原文链接:https://blog.csdn.net/haoxun12/article/details/1051629475 C8 F, O6 v2 l6 W7 V ]
5 k; Q1 ]% k. u0 s r
3 ?" q$ o) p' R8 O6 X# a8 L1 S% p. g. M# a P* |% s