- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564563 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174592
- 相册
- 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& ]9 R) t$ s8 o; z* }
这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
7 ^9 s) C% a7 v. |+ Z背景:
3 ^" D9 k# ?0 _" O* S$ b% [8 B# I A* Z; t7 P
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
- t) |" a0 c6 | A' M
: ]) |+ G+ u2 q& G1 v问题:5 F+ _, I2 ?* x) ^* \' q
0 ]5 I: f; q* U) B
使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容! w% q. J& Q M3 M3 {& z
* Y4 Z; b/ `- z$ e* G
问题代码示例:
. f6 K8 h' z6 }; ~5 ^* ~# -*- coding:utf-8 -*-1 E9 I U: n# f J
import smtplib
# a% y1 s, F! H. b Vfrom email.mime.multipart import MIMEMultipart* L3 H) y$ O/ h! F& D( f; r
from email.mime.text import MIMEText
7 L* _6 L- o' s, q4 F( }7 K/ Z% f* _5 J" o4 i$ `; q1 o9 P
def send_email_to(fromAdd, toAdd, subject, html_text, filename):8 P ]; O1 U" H# @) [& o' [7 Q
server = 'mail.****.com') U$ P9 L) V7 z) t- C- {2 h
user = '*****') [2 J% }) i; W5 P0 F" Q
password = '********'1 p' w0 |* |& |# F! M. ^
, _5 b. i8 P7 R/ j8 e$ D& x
strFrom = fromAdd
5 y+ G5 z8 o" U. `, H strTo = toAdd. @0 f. m5 g Z' E0 X1 A
4 r# H9 }/ u) S- S- d( K msgRoot = MIMEMultipart('related')
( r) Z- p& X- w" D8 i, N- q msgRoot['Subject'] = subject/ j9 `; |6 g2 P- }7 s
msgRoot.preamble = 'This is a multi-part message in MIME format.'
* V) b! a, \$ [% N+ q1 R$ b, A+ ]2 l" x9 x) s) \- b: O
msgAlternative = MIMEMultipart('alternative')
! a% X! e9 p9 q8 F" m msgRoot.attach(msgAlternative)
# i/ ]( V. A; N; b2 D8 h9 g
. R4 P% c& q4 z* t, g msgText = MIMEText(html_text, 'html', 'utf-8')/ Q( j' d& c- [9 t
msgAlternative.attach(msgText)% Z: w+ {) Z7 q0 ~8 K; O, S o
- N6 w; @: V0 g smtp = smtplib.SMTP()7 ^. L4 S- I, \# o
smtp.connect(server)( t4 S0 d) E/ E: ^$ d9 Y, U: e
smtp.login(user, passwd)% B7 z% D8 d* K( J/ j% n
2 C( B* S$ F, z8 z0 D att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
, C s( |8 s3 E( g# @$ u: {( z att5["Content-Type"] = 'application/octet-stream'
2 b. T; [5 Q) y Q7 h att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'6 a ], y0 \1 q0 f" K$ o e
msgRoot.attach(att5)& `* @8 z, H) o& T/ z
5 A0 h7 E4 W Z" ], | smtp.sendmail(strFrom, strTo, msgRoot.as_string())
% y. ^$ h7 R% i4 ~8 I smtp.quit() O4 ?+ O5 Z. n/ Q
return
d& m% U# b& ~1 K' x9 B0 \3 F4 E) z- z# V$ X) W3 M
) ^" t8 J- S1 h) ~9 z* ^5 g0 h成功代码:4 M2 ]( u6 Y c# ]# t" |, d c$ K
#!/usr/bin/env python
5 `, M/ s- E. {! b0 A+ l3 ~ ?# -*- coding: utf-8 -*-( t4 \# f" `7 ]) b3 c- O" K' ]! L/ k
! S9 i) m5 O) w& {" N$ c' Ximport smtplib- y- g5 H6 p; Y0 E* l
from email.mime.multipart import MIMEMultipart, j$ f( L3 A6 ?2 N+ d
from email.mime.text import MIMEText
7 E% p' ]' t* Qfrom email.utils import parseaddr
) h$ a+ U3 d5 q) D, \0 H" ?2 _from email.utils import formataddr0 g" Z3 s6 @" { }
from email.header import Header
/ u! p/ ^0 N8 I3 Z- H: S" k8 I' g: H% }" V* b/ ^4 b
8 D% n: x. ~; X/ X( }' Bdef __format_addr__(addr):( ], E2 ? G( X
# 解析邮件地址,以保证邮有别名可以显示
0 E. i9 b1 U7 D( b2 N3 J, j alias_name, addr = parseaddr(addr)5 e) H' e9 L* O
# 防止中文问题,进行转码处理,并格式化为str返回( A- i$ ~7 d' e1 t
return formataddr((Header(alias_name,charset="utf-8").encode(),
( M8 |, Y' k5 [5 x, }5 z: X1 j addr.encode("uft-8") if isinstance(addr, unicode) else addr))0 m- Q: d, K, W- A! a
$ N% [4 C% a W8 y3 V* N. V
- A" R4 j: u/ ^8 w$ q7 Fdef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):+ o, {% A5 g; p4 |
/ O5 [6 {6 p% t7 E+ y
SERVER = 'mail.***.com'
% j$ q1 {, ]2 o+ Q6 ^ USER = '******'
7 s% G, L" c2 e PASSWD = '***'! `, E& C) }; [! Z
0 Z. a) V0 {) n6 \% O- Q strFrom = __format_addr(fromAdd)
' M& p9 e- z1 W$ o' P
& q+ b& ]. {, T& [! ? strTo = list()1 c$ p9 P0 c* _( O. O0 i. X
# 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
$ w0 C2 r! `1 a+ |/ b! N3 r try:
m; I' K: j' @. f. N# m3 |/ I for a in toAdd:
9 Q3 R( `( h% \) D2 O strTo.append(__format_addr(a))' o' k2 ~' w/ \" A J' B
except Exception as e:
8 \2 |4 l8 O/ ]0 G0 j/ s- ^0 u) ]/ \4 _ # 没有对a和toadd进行type判断,出错就直接还原7 }- {) l% Y7 c' M, J
strTo = toAdd7 q8 _2 N& q2 B0 ]
0 s& A8 G7 H/ N2 o
msgRoot = MIMEMultipart('related')
- C- ]7 k' }2 B1 w msgRoot.preamble = 'This is a multi-part message in MIME format.'
: m4 b: a, I! I7 Y1 X. R) b% O& b, g4 y: Y
msgAlternative = MIMEMultipart('alternative')# s$ N4 w% y7 J# w0 o
msgRoot.attach(msgAlternative)
* }+ T9 ]- T4 V- l9 p- \( O, e/ F" E1 i a0 n
# 邮件对象
h" u, r) }9 i' J8 B msgText = MIMEText(html_text, 'html', 'utf-8')3 j3 v6 z1 Z6 K" Q3 Y
msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化- k3 J4 M' |/ t+ m: ?& Z
msgRoot['From'] = strFrom # 发件人也是被格式化过的 Y1 E) F: z" P" t! w. ~+ R
msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'” U) x* C+ k0 u% y
msgAlternative.attach(msgText)
1 Z$ s0 `7 y# S8 a; E6 J2 a" r) J- X7 p4 y
smtp = smtplib.SMTP(SERVER, 11)& G7 K. P: c1 w) _
smtp.set_debuglevel(0)
6 h8 E v* K; v' R5 c/ J7 _; L # smtp.connect(SERVER)# t2 J5 k& s+ `$ I
smtp.login(USER, PASSWD)
+ h. W8 ?) H- g # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
3 h' v1 M( g0 S y9 F2 f smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
* l% `) I8 N% o v0 r. j' I' ? smtp.quit() ]# S! N" q4 R. T- R8 ?
总结:
8 P% B2 d$ H8 W0 l& N1 t
6 s& A6 }2 L, Q, J) x看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
5 V: C# C, }) k8 }2 W& {
! q2 H# K9 W, I4 z3 r: Z7 V实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”4 Y/ ^+ }9 t* j9 Q' `- U- K
% s% ~3 b6 W; p- D; Y" _3 ?
同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
: z. u7 F9 ?+ ?# {4 r' e8 e. F
7 Q, \8 ~, V, c还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。" u, D0 g( x2 [' B& P: x: B$ k
最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
9 Z k$ d9 ^2 g
4 ?/ s; W( E# P( J) ^5 Q; t,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
4 L+ f% Z& d1 S/ n( }0 r$ k2 {
; L5 ]- _( G) U; P8 C% B定时讲解Python技术,分享一些学习的方法和需要留意的小细节
' B$ \8 x1 {' _4 t1 p————————————————* ~7 h$ R* B2 H, N2 N
原文链接:https://blog.csdn.net/haoxun12/article/details/1051629479 h S. k+ P5 H& E/ C
0 ?% y# }- N0 L, e5 Z5 w* T! g: y# o4 q7 q, b3 [* x9 ~; b, ~
6 n! |- R- a& ^ |
zan
|