- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565361 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174831
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python发送多人邮件没有展示收件人问题的解决方法
! p# X% m! c3 M. }5 Z这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下1 {5 c7 S- ?# ?; K( R N8 F
背景:
9 S, C0 J: E4 s9 B( w C) l
0 h- |+ s; K, p( s: O! u工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人& G( `4 m9 c- ~3 y: O: T
9 L2 \3 }7 P& K0 }! d
问题:
' }( W/ Q, b" b8 K, Z
6 ^- K0 b8 O% w1 O1 ^使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
1 R0 \3 D# T7 v5 Y8 ~/ m5 W+ O+ Z; u( _- \! h
问题代码示例:0 J" V1 |. Z O- A2 g' z8 f3 D
# -*- coding:utf-8 -*-
3 _+ m6 c. F; l0 [8 Iimport smtplib5 y% J9 u1 E3 W( v5 l# `- b8 g( D
from email.mime.multipart import MIMEMultipart
$ ^; W& g3 v3 s2 U! _from email.mime.text import MIMEText! z+ I. N8 J4 F! s
. l; L2 _1 Y" n7 N/ d
def send_email_to(fromAdd, toAdd, subject, html_text, filename):
; U% G# y, b0 [8 ]# d server = 'mail.****.com', ?* b/ ^7 Z: x! O/ ?* A- ]) I
user = '*****'
+ ]6 v" n: V0 d! v3 Y password = '********'
0 m# N- g9 Y& g i# y5 E0 Q. m5 t7 P1 u {# P0 ~$ d) V8 m& q
strFrom = fromAdd* F; B! S7 J# M% u
strTo = toAdd
3 x+ O M: b2 T$ X1 Z0 i
+ P0 Y% X2 t" B8 l8 K9 ]7 x msgRoot = MIMEMultipart('related')9 n5 l0 n, x. n: Q; s
msgRoot['Subject'] = subject
8 f) g* \4 `" C# K msgRoot.preamble = 'This is a multi-part message in MIME format.'% a) y/ s( [% ]) \
7 m6 p6 t: F4 G: S' ^" O e# g! z msgAlternative = MIMEMultipart('alternative')* l$ r7 U& l, U
msgRoot.attach(msgAlternative)
8 A6 Z5 c8 T2 W7 T
; P! n- d" Q% x* o msgText = MIMEText(html_text, 'html', 'utf-8')
. `6 N# e4 z+ a/ K+ j( w- j msgAlternative.attach(msgText)3 V* Y( i9 K0 v: B
# O4 F, R# J. w5 d \- o2 ?4 H smtp = smtplib.SMTP()
3 f8 D' f5 ^3 Y9 e smtp.connect(server) C6 D6 [! z; W
smtp.login(user, passwd)6 a: l2 l# s& K0 J% D( @
+ T* Y% X2 k: ~, u' ~' F9 [2 r att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')" O' G! z3 H" W9 A( K# M6 F
att5["Content-Type"] = 'application/octet-stream'9 h9 R" [5 U: c1 o# j
att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
9 ^: M7 u) z* r msgRoot.attach(att5)! }1 ^" D( f8 l% j& r: b
+ M5 J; c2 I2 t5 W; ], x$ Z
smtp.sendmail(strFrom, strTo, msgRoot.as_string())/ L% x; U# f8 N# ]
smtp.quit()
/ M! X: N: v4 ^- {6 G( R) A0 H _- k return+ ^3 i% b3 ~5 g& e1 s
9 Q, x. w/ R2 r+ J t+ m: w( p4 V
) M& ]3 f& ?- ?5 C: ~成功代码:- y0 _& U8 Z& ^3 M! L4 O3 `1 v
#!/usr/bin/env python
# w0 J! [! O8 E& A8 x' y/ z# -*- coding: utf-8 -*-
$ Y* g4 j" S6 G% x$ b( N* S4 B/ c; `9 n" S l6 n2 F) [: y
import smtplib, N; h0 \4 q7 a
from email.mime.multipart import MIMEMultipart
7 U* w0 q8 I5 `3 \( f. ^from email.mime.text import MIMEText1 M# F3 \: u3 B$ u s, ?+ ?9 ]
from email.utils import parseaddr
4 |1 G5 F; |: ]5 j ^from email.utils import formataddr
r/ {; b# d. T4 z4 |from email.header import Header
; P# O5 t# }" Y( G6 p- H4 E$ z. E1 P) a3 z6 ]
. A5 ?7 Q5 K x8 J; @def __format_addr__(addr):- J2 Q7 t( j! \& \, D
# 解析邮件地址,以保证邮有别名可以显示0 ~5 K+ z+ Q% i! t7 O
alias_name, addr = parseaddr(addr)
" X1 m$ G( v' {/ e7 @* { # 防止中文问题,进行转码处理,并格式化为str返回
1 O3 _0 T8 C! Y5 D- Q3 Y return formataddr((Header(alias_name,charset="utf-8").encode(),
+ v6 a2 E$ W1 g0 d, I- }& ^ addr.encode("uft-8") if isinstance(addr, unicode) else addr)), P. _" |7 y. \. I/ K$ i$ }3 e; X
& T/ b1 O y( i4 q+ f1 h/ Y( v5 Y& P& R" q$ P/ W- Z
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
6 F' n# n" S8 V0 f; S& w9 h
4 h! W( N. N2 k' ]- G' J |5 K SERVER = 'mail.***.com'
" @& _, m* `2 a$ |/ l5 \9 q USER = '******'3 P6 H6 }; G% J: m2 v
PASSWD = '***'. l' `8 _( t8 }* g. m( w
M% h$ P6 u; V6 m' H! c strFrom = __format_addr(fromAdd)
1 C g5 D0 U( G* y
3 d+ s+ L/ r7 N strTo = list()8 w- X6 ?# z) v5 t3 ^ d
# 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
- U6 s4 p7 u- m/ H$ b$ K5 A try:
* i% p3 u( o9 h2 D. ~& c for a in toAdd:
5 X# p1 `0 W f$ N) d$ | strTo.append(__format_addr(a))
# N- V6 X. Y$ p6 N4 n except Exception as e:7 C& m, }$ _. Q# d
# 没有对a和toadd进行type判断,出错就直接还原
* `' e% i& I; J+ x! l5 p' _* J strTo = toAdd
2 y0 M4 Z- H0 M
6 R& b5 f% s4 a7 s7 O6 |& {3 }$ m- M msgRoot = MIMEMultipart('related')0 {7 o- r0 {" Y0 m
msgRoot.preamble = 'This is a multi-part message in MIME format.'
3 P* B" r3 B9 ^* h, M r* e X( ^" o5 p2 ?6 i! W! t, A' y/ B
msgAlternative = MIMEMultipart('alternative')4 w Q7 ^+ _) \# i+ u
msgRoot.attach(msgAlternative)% A+ c/ V# i" x3 W% o J1 R7 `' [
9 q, W9 E# B, D: G( h # 邮件对象
3 y# L4 D( d/ e! O1 \ msgText = MIMEText(html_text, 'html', 'utf-8')
0 H, }9 P E% [' L9 Q0 }& _# j msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化6 g$ B& r) h/ e$ z
msgRoot['From'] = strFrom # 发件人也是被格式化过的5 \" n: Q1 V! }" M8 ?$ \# b2 \6 |
msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”) Q3 C; [# d/ Z6 D$ A
msgAlternative.attach(msgText)
% y& K' Z5 ]# E0 U0 N4 U, F8 S- ~* b6 d* W: l! W# E# V2 ~
smtp = smtplib.SMTP(SERVER, 11)( _3 p4 E/ I( W
smtp.set_debuglevel(0)" T2 |% F0 L" T& u; G c
# smtp.connect(SERVER)+ q0 @( X" x. T. ^0 C. P
smtp.login(USER, PASSWD) r. }5 r% a$ P( V8 d/ i
# 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
: {5 O4 r5 N4 u( P smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
$ D9 o3 l# h' v% W! `+ ? smtp.quit()0 ?( X4 p$ L8 {) @1 `9 n3 } H
总结:
" F0 K: z0 N2 [" b1 |4 U9 G
F3 A( @& T9 J5 u/ n看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo! m" K! A6 H# f3 s
+ ]0 l$ M' _: ]; Y( E
实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”" y8 O: i O9 h1 ^) V6 }
0 o8 F, q* ?0 S& \+ Y. t- Y1 d同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
8 b' h( J+ E5 ?6 v5 z* \$ a7 \; u1 I( Q4 X1 s
还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。9 }6 G8 V0 N7 D0 B7 x6 v6 y
最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
4 s7 F. }/ F- A6 |! S
4 {; |& }# _2 g8 u) X,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员4 g* R, k$ d9 V0 s
& Q: w- h& d, i/ ?/ i k1 s6 N q
定时讲解Python技术,分享一些学习的方法和需要留意的小细节
( J% D# `( ^8 h# ?' g8 N, G' M————————————————' g9 o) X3 W5 X7 z* y6 p1 o: X# m
原文链接:https://blog.csdn.net/haoxun12/article/details/105162947+ N! _% i# _) G7 {' J0 }6 \
$ a) N: h) I% v! }
$ H! j. U( M7 P- H d
) [' Z$ K( L) X5 Z |
zan
|