- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 558501 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172923
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python发送多人邮件没有展示收件人问题的解决方法
$ g* L" v+ p4 j5 S* ~ o这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
) i" X( l& \' G+ }2 V) _% e背景:
0 u4 g9 `0 v$ S1 D# B+ k
5 m; X% _/ y8 v1 o; L* ^. @6 F& Z) T4 U工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
, A" S, M2 q* d# U& _9 E; x. `# h* {4 o3 v/ h6 y
问题:
& Q5 A2 R" \0 d6 S/ k) `6 J9 @/ ~. ~: Y5 |2 A
使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容 R5 E8 y8 P- z9 B8 O" }
0 M2 Q( Y+ d, K, y
问题代码示例:
: H5 v. g1 ^: p7 o# -*- coding:utf-8 -*-: a' u3 p# S Y, _5 E+ V
import smtplib8 b9 i1 U* Y; s& t5 o8 k: s( y
from email.mime.multipart import MIMEMultipart4 O) D/ r" b# l. r# W) J
from email.mime.text import MIMEText' i$ [" [( P: T* S! E1 i
: [( y9 X) A" c( z- M. K' @8 S2 cdef send_email_to(fromAdd, toAdd, subject, html_text, filename):
+ Z+ H. }) E2 _! c! m server = 'mail.****.com'* l1 r# G- K4 J0 ]4 s2 R
user = '*****'3 t* _3 n% g8 y7 I) m
password = '********'7 L+ o5 G/ H3 U W6 k9 y
; p0 j6 S' L# j( {$ f0 C strFrom = fromAdd
& e- J9 Y5 C& J* i) H, U strTo = toAdd( W# G4 i+ D8 m' k% V G
1 d# i# ~+ q7 A \% l* j
msgRoot = MIMEMultipart('related')
# m+ Q& U6 S/ M2 W$ h3 K# I msgRoot['Subject'] = subject
& z0 R, y8 ? J+ }& m msgRoot.preamble = 'This is a multi-part message in MIME format.'; z) s: y ]! _0 v" Y
+ [" u1 N4 k* b8 Q2 D msgAlternative = MIMEMultipart('alternative')6 L' V/ ?' b4 m; Z" J4 @ C
msgRoot.attach(msgAlternative)
5 Y l, Z }/ q2 k2 k2 m: [; B7 J8 k- ^+ }. J8 j
msgText = MIMEText(html_text, 'html', 'utf-8')
: Y# R- ?; A4 u1 e msgAlternative.attach(msgText)
8 g% p* `# C, A; }5 [
6 c9 D( H6 g5 E- R smtp = smtplib.SMTP()0 @/ p4 [1 I4 h# N
smtp.connect(server)
- W- b5 Y1 t, \ smtp.login(user, passwd)/ _6 k$ d/ @ g+ p2 w* K8 D
0 i/ `* G$ N6 o3 M0 j9 H
att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')6 Z V3 p: d7 d# G' @
att5["Content-Type"] = 'application/octet-stream'8 z3 m/ t% O1 g7 {' n
att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
- d/ a- u" m" K3 ^" b; j msgRoot.attach(att5)
) l" F: s) Z" f9 a# B6 j3 Z
( V* q7 q( ^7 F# }9 p0 q" I* N smtp.sendmail(strFrom, strTo, msgRoot.as_string())* G' e/ E8 [/ b/ R5 z
smtp.quit()
$ e8 c) {6 t c return6 n' R8 M0 l# v; T
& K5 h+ h- E# Z1 h4 y* N! e3 n& y
2 }8 @! W4 x5 o6 e5 R成功代码:! |9 M& {' J4 W* Q W
#!/usr/bin/env python+ }3 o* j9 \ ?. c% F) |3 c
# -*- coding: utf-8 -*-# A" V3 L9 ]+ Q6 S$ K
/ M' `/ x/ T( j: K1 a% g5 F1 O7 |
import smtplib1 ~9 F% X2 k! H% Z5 C
from email.mime.multipart import MIMEMultipart
& o) V" ]) B0 m, v% Dfrom email.mime.text import MIMEText
$ f; q7 @% j. K! q$ \. Cfrom email.utils import parseaddr! Y4 e! e+ W6 }6 J2 ~& S5 r; X
from email.utils import formataddr
' X; [. ^# H1 G2 c# A! ~from email.header import Header
4 A1 N* R$ B% t+ ]" d: g# U" V2 l9 k) w6 ~9 @( M
/ r' [) F( P6 z) b. G l. P; B. h! L
def __format_addr__(addr):
# O. j' `% U9 d! s, G1 H # 解析邮件地址,以保证邮有别名可以显示4 g$ \4 U, ^5 {6 }5 \; Y
alias_name, addr = parseaddr(addr)9 L' k9 g+ W5 d H, J
# 防止中文问题,进行转码处理,并格式化为str返回6 w7 C$ K+ A6 f* _4 K! L
return formataddr((Header(alias_name,charset="utf-8").encode(),
9 ~& E. b- P* D" C7 S, I! C addr.encode("uft-8") if isinstance(addr, unicode) else addr))& d# p* j# f2 Y, O* c
* K3 l6 Q6 Q8 z/ q$ h* s
" X% k: m6 L/ v, Cdef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
' e3 ?+ N3 P/ [. p1 n3 y/ {( H1 ?8 i r+ M& M" K) }; n; K, w0 C% E% Z
SERVER = 'mail.***.com'
, ^# V" y+ ]/ Q( o" [/ q' D- y USER = '******'% k4 t# W- ]% e; J$ p# L! u
PASSWD = '***'$ V/ j+ [- l5 R% b8 J- y7 T
0 D0 f. |+ i! q5 b
strFrom = __format_addr(fromAdd)
/ [- o" S: ~9 S: j: y- W$ Y! D! W2 S* X. l& N) J
strTo = list()
, i! @8 R8 K% N+ D+ r- w. T) D% M # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化; K s, D4 x4 x1 r7 @7 O" s
try:* n" s5 O6 Z+ J4 m
for a in toAdd:+ f1 V$ G z" u; O. {. o. Q
strTo.append(__format_addr(a))1 h+ d" }3 p' l. q; O
except Exception as e:3 Q4 z) B1 E# r
# 没有对a和toadd进行type判断,出错就直接还原
, G1 U+ Q; w& z1 Q strTo = toAdd
$ U% k% G# i/ j
6 i: c; ] H$ Z( y4 l8 q" ] msgRoot = MIMEMultipart('related')
5 c8 P ]7 N9 k$ [1 \ J! B msgRoot.preamble = 'This is a multi-part message in MIME format.'2 w, d' Y+ L7 B. X
& `1 f# r7 F1 ?0 W p5 W msgAlternative = MIMEMultipart('alternative')( O; p- N$ ^0 @7 s' U4 z; O# ~8 }
msgRoot.attach(msgAlternative); _9 t ]( y5 [% v3 J$ v
- V5 ?. c2 r5 F3 W6 j f # 邮件对象 1 a3 ]; k" v) {- L6 j2 }
msgText = MIMEText(html_text, 'html', 'utf-8')
' V5 c" |' E% ~$ ? msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化8 e; s* }1 ?% @# r6 Z0 S7 T! z
msgRoot['From'] = strFrom # 发件人也是被格式化过的4 _2 n4 T( Y- }: f1 s# S5 U+ T' \
msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”* W {- T5 n' _6 x+ Y7 N* L( @
msgAlternative.attach(msgText)
! Z! W- Z8 c' N) a
" }$ e) a# p- H0 J$ t) {4 Q' u$ H smtp = smtplib.SMTP(SERVER, 11)% d7 h/ i/ m6 d$ F( \# Y; B. Z5 b1 G
smtp.set_debuglevel(0)
/ ]/ o2 w+ E" w0 ~* A) T' n # smtp.connect(SERVER)
8 c4 a- f( }$ J0 n- A) X2 r smtp.login(USER, PASSWD)
$ z2 ]# l. S; k$ ]' k8 E0 z # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别9 S% G1 k$ s9 a% ~9 d0 J G
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
* A4 q* m& f+ n) f smtp.quit()$ _7 ~! Z. D# k0 [. q
总结:$ S" M& @' `, e0 B1 @6 N% Q3 u
0 _! ` q" E# S, Q
看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo, S' v Y" v7 U- f, _4 U
. _* e' n1 D$ q+ S
实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”
8 m; F1 ^# l0 e" K9 d: u" Y
, e7 n3 L x$ l/ A8 B% C' M同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
! }8 O" ^2 H6 Q# h" [
+ P' j2 @8 {6 ]/ @ n还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。1 a d# D5 t6 D5 o0 @
最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得, P& R0 x7 T: @/ o" Z
% W' x+ |7 k: L: {' b2 f k,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
/ u$ A5 m; y u9 Q) b7 E6 x' Q6 s: k$ `( J" Z8 T
定时讲解Python技术,分享一些学习的方法和需要留意的小细节% \) q! v. @% c/ Y: R: E
————————————————2 p9 j, o! j/ t, B) t0 K
原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
- }# ?$ C- a% P/ I
: ^# l" j1 y3 J+ \# W5 r5 m2 r* |8 L, f( X( J7 n, ~! S4 Q8 f
5 k' F, J2 f( C2 {! `$ y
|
zan
|