- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566451 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175158
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python发送多人邮件没有展示收件人问题的解决方法+ H5 R# U0 _; y8 e( a
这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
5 g8 v% n; O( n背景:
$ j W: u/ \- K0 m) n" ]/ h9 E# G9 L* K) t2 j' X; R7 Y
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
& U$ \* n0 x8 Q# F2 Q$ U% N# K+ _) L5 a9 A1 t
问题:3 B/ n* Y% o5 O$ W
7 ]0 {3 J$ V" ~5 a: W: }使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
* H+ V) ]$ m% v5 Q. U0 ^, F" F* _4 _' L" X
问题代码示例: C! l$ [1 W; d: d! {4 ~4 ^* J1 a" ] N
# -*- coding:utf-8 -*-) l3 O: u# B% L; l
import smtplib
. @+ `3 c: B G- D; `9 P* Hfrom email.mime.multipart import MIMEMultipart
$ f# m6 m& k/ h1 {+ F+ Y$ O& xfrom email.mime.text import MIMEText# X+ S* V5 Q) K
7 P3 Q j6 x, |5 k3 n$ Ndef send_email_to(fromAdd, toAdd, subject, html_text, filename):
' O- Q# U+ q. ^. `0 G& g7 \8 s server = 'mail.****.com'
$ Y' o% c; a# Q user = '*****'7 r1 q7 b4 A* ]$ s3 w# |' M$ z3 P
password = '********'
5 Y% b8 d: E5 O/ y1 h
6 C% q# C. g- s" p strFrom = fromAdd6 G' X- {1 P/ z) }
strTo = toAdd% O$ i5 W% E1 j, s2 \
5 F8 ]3 ?% x; e+ h msgRoot = MIMEMultipart('related')
- l; T3 J7 G! v Z; ]6 s msgRoot['Subject'] = subject- C, c6 O5 r' ?1 [" Q8 B
msgRoot.preamble = 'This is a multi-part message in MIME format.'
- |7 L4 u& M \4 m* ^3 ~- O& T" K! x M* o# d1 H
msgAlternative = MIMEMultipart('alternative')
% n+ m9 ~0 Z' b5 p6 ]# j K0 i msgRoot.attach(msgAlternative)/ N. `6 L: S+ |. p3 P4 D# N
8 Y j' g( {6 f. V msgText = MIMEText(html_text, 'html', 'utf-8')# y+ d: I0 D6 s5 [1 P
msgAlternative.attach(msgText)4 V" d1 h* R/ J1 [, w" D1 H
3 c! J K/ N$ m
smtp = smtplib.SMTP()
/ L1 x8 t# f' {3 z: o( d; T( i smtp.connect(server)
. ^9 N# {/ J! t7 Q; v smtp.login(user, passwd)
! k+ o0 H7 x+ i: ]! z. d0 i7 \. B3 n
att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
. H M: M0 K& c3 n4 i att5["Content-Type"] = 'application/octet-stream'
, B4 j5 i7 E) l' P7 B/ r att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"') a7 Z& P" |# m. ]
msgRoot.attach(att5)
% G) h4 L: n" E+ `8 m; h# F0 ~& E+ H7 ^ U: C! s5 B) i9 d
smtp.sendmail(strFrom, strTo, msgRoot.as_string())2 X5 _( O/ O& i9 Z3 {. N
smtp.quit()3 d9 Z" z3 s* m3 D' b3 ]% O
return& n# v& W' ?# ~5 J- @
0 A( w( \8 n9 r
9 g4 p9 W2 Q5 u- `: x3 w成功代码:
s- X3 Y1 |. \8 G( G#!/usr/bin/env python$ b: t% u3 w& ~
# -*- coding: utf-8 -*-
' f* Y9 u! w. b' m% {" k6 h+ n" F6 L- G0 N$ c* i* s
import smtplib
. J+ D/ y4 V5 X0 ~" C9 O2 Sfrom email.mime.multipart import MIMEMultipart
9 x$ Z3 {& c2 `9 C# l% Nfrom email.mime.text import MIMEText& C( p5 ?! l7 Q: S0 y( h
from email.utils import parseaddr! t5 f; Q' X: Z$ H
from email.utils import formataddr
. n6 `0 ~' \7 L6 G0 j6 Hfrom email.header import Header
`# b. ]( p1 |2 O. |$ c+ a% F' o3 w
; a! n9 U- f( g4 D5 ]: ~+ D! B
def __format_addr__(addr):+ {+ a/ ~6 S8 X" `' a
# 解析邮件地址,以保证邮有别名可以显示
) a2 w- `0 q' \. U) }0 y- W# @ alias_name, addr = parseaddr(addr)
8 m# D4 R; @9 d$ r- t # 防止中文问题,进行转码处理,并格式化为str返回% b/ h3 P. `# X; R
return formataddr((Header(alias_name,charset="utf-8").encode(),/ v" ?7 b7 d/ k
addr.encode("uft-8") if isinstance(addr, unicode) else addr))8 w$ r0 [% O9 y @# v
! P9 {+ Q( J( t2 A; d8 P ]! f( h7 d/ }& ]
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
2 p4 t' a2 u" g* z4 W! D! C) w i% C$ ]8 `6 S# y$ t
SERVER = 'mail.***.com'
" q6 T q8 O) [( u! @: s USER = '******'
& }0 t" Q1 ^2 [- M/ N& O/ f; q' \ PASSWD = '***'- R+ s) u8 B7 c' [ v: S
- k; n0 O0 A8 W strFrom = __format_addr(fromAdd)0 A- k, \/ f, O0 E
6 |2 |2 g T$ _$ e6 c
strTo = list()
+ Z- o6 T5 ^ H" O$ h # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
& e3 u- X5 j, c- P* S6 H+ Q try:" M6 _& L4 `' T3 E! U, c, g' f
for a in toAdd:8 o( _/ T4 r* s+ p2 |: \6 E5 K6 Z% a
strTo.append(__format_addr(a))( @/ f7 y+ N' b3 g" g
except Exception as e:
]0 ~' p9 E0 L& T # 没有对a和toadd进行type判断,出错就直接还原
3 o6 b0 I" T% {* e! I strTo = toAdd
' U9 w# ~) P f$ G4 W0 v! O j& |! t/ O6 y4 X
msgRoot = MIMEMultipart('related')
6 s- d6 _- Y r4 ` msgRoot.preamble = 'This is a multi-part message in MIME format.'( u3 \6 L: t" V$ n4 k' h
8 I0 t# }/ f1 O" S' i, q msgAlternative = MIMEMultipart('alternative')
1 s' b# D; x! C6 N( Y2 Y: q msgRoot.attach(msgAlternative)
) e+ X8 ~+ l- v! p' y
# @* W7 `4 u7 p+ G }$ a" P # 邮件对象 " }% b% {/ k, D' ^. @) B
msgText = MIMEText(html_text, 'html', 'utf-8')
' r# }# \3 F% X* @8 E) ^% e msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化; \0 n' w5 K- M$ Z& h( J
msgRoot['From'] = strFrom # 发件人也是被格式化过的
; l7 ]* w1 N* _& M2 `7 w8 G msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”% m. V& E+ E1 ?/ y. e: Y$ a
msgAlternative.attach(msgText)1 L% T, {. v' H r& C
2 m+ g2 C* { [; P
smtp = smtplib.SMTP(SERVER, 11)7 o+ ~- x8 M ^
smtp.set_debuglevel(0)
+ {( q9 J# _/ ~" l # smtp.connect(SERVER)6 i* o/ w1 ` ~9 q& `2 h9 a; P
smtp.login(USER, PASSWD)2 j- B1 u/ f9 p
# 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别, _' x( Z% |. l% X+ W
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())" ^, z- O/ L( |2 o! c8 e9 W
smtp.quit()" E+ H0 K. F* ~/ N
总结:
$ }- K% K. Z# B; w9 ^
4 E+ C: l$ Y# i& L6 ?* G看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo, i" j4 s! P' {& w1 q" O
0 e6 y% T: H5 t% j: k3 K实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”7 P% |# L- a8 @# C+ n, \" w
7 ?4 u R2 k! a; b# I3 D1 N同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
U! W/ ^% A( f. U# z$ A5 c; ~" G; A3 T: _
还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。# ^8 i1 E3 ?/ t: ?
最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得6 O1 F5 T; N5 J2 g0 N
+ O9 W. k- t1 {& r" `/ H
,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
) ?& b$ `' ~5 d% j* A# b3 r1 A
% B* _% Q2 _3 X! ^定时讲解Python技术,分享一些学习的方法和需要留意的小细节# j6 _# [* p6 j) t
————————————————. r( r0 [- L& V1 g; s* ~& R
原文链接:https://blog.csdn.net/haoxun12/article/details/105162947, y2 K/ f+ \6 ]! ]
2 O; Q7 \/ v a7 c' I0 {: g, _: P
; W n$ }1 j& R) @6 W$ ~
6 r. K- d* ^# J5 U2 u |
zan
|