- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566435 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175153
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python发送多人邮件没有展示收件人问题的解决方法6 ^+ A4 R( U8 Z: K) b3 i U
这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
0 T$ Z& w# z# ]- |4 q0 ]# T$ W. L背景:
, z" ]$ N3 A1 ?
% F* M& W6 H! q7 @3 Z+ c' O* G3 p工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
8 C. [8 @$ K8 `4 {' x% a; p
/ b% d, }: I" A问题:) L' x( |- ]. g0 f: D. R
) y, }- Z" l' Q使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容; d2 W6 t1 N% D: B% I% g
3 f& v+ G* S6 E! j( M% w5 I
问题代码示例:
; |! l* }* M, Z7 F# -*- coding:utf-8 -*-7 R+ D' b) ?7 E4 ^. {
import smtplib
; @# k& B/ L" J$ j- F, Mfrom email.mime.multipart import MIMEMultipart6 @! a0 a: U4 Y! |$ l6 D
from email.mime.text import MIMEText
) C$ Z. N$ b" {+ y- K
9 p' y. p% Y( _: G A2 h& Ndef send_email_to(fromAdd, toAdd, subject, html_text, filename):3 S! g! u4 t$ A3 o. l5 S
server = 'mail.****.com'6 y2 X- @8 p; E
user = '*****'7 n& o& o7 ]5 P2 C
password = '********'6 ?7 @4 T+ ?* m$ Q3 N6 {+ f
C- l3 k, h7 R4 D strFrom = fromAdd
' r! [" I8 `: O# F6 B9 H) U- C strTo = toAdd& F" S8 U* [( ^. e
/ g- f% x l3 F- e& N- n& M msgRoot = MIMEMultipart('related'), k& G1 |$ p. |0 B
msgRoot['Subject'] = subject/ n3 M0 ^! u+ r7 b
msgRoot.preamble = 'This is a multi-part message in MIME format.'
' I3 t& S2 Z- H$ r& _ x4 ?4 \4 d1 e V% W' A6 d
msgAlternative = MIMEMultipart('alternative')3 E% c& ]7 W* \0 c& w4 V
msgRoot.attach(msgAlternative)
+ e% F5 l/ q- U9 k" ]0 Q' y* d7 D9 ^& o+ w
msgText = MIMEText(html_text, 'html', 'utf-8')+ I1 `/ H& I* D( e
msgAlternative.attach(msgText)
* s4 m8 q7 ~3 i, i# T* Q, e. w+ j% S% O* O2 z
smtp = smtplib.SMTP()
5 B$ B) C6 ?. A5 S smtp.connect(server)6 U+ x$ W: P7 k' [# o
smtp.login(user, passwd)
3 L) V# Q: V4 L3 o6 F
$ a3 v, {! D y" ?7 { att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')9 }$ |: b! ~$ z o, O' m7 h
att5["Content-Type"] = 'application/octet-stream'
" p$ o7 b, M8 C/ c M l att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
* P9 r4 O/ H: P msgRoot.attach(att5)
3 _7 B. J4 N; P8 Y* _: N6 b
6 K' d: u% {8 \$ o" N smtp.sendmail(strFrom, strTo, msgRoot.as_string())$ M6 L8 b4 f1 W* R: K9 J8 Z
smtp.quit()
+ Y" P% K, n! ~0 Q+ D return1 {+ M) X, g0 a1 V4 A
5 Y8 r3 s8 a' y& _$ p" q2 A$ ?, a0 x% O$ P* X
成功代码:: [9 e; t; h" s; Q) R
#!/usr/bin/env python
- M6 I8 a% D; h8 K5 l# }/ n0 Z8 d# -*- coding: utf-8 -*- o* z. U; G9 D: b0 P* p
# [) G+ Q" l' F; S- |import smtplib
* R* r" n/ s V; C2 Qfrom email.mime.multipart import MIMEMultipart
4 S! V$ k) q9 H" b5 M1 e# T' jfrom email.mime.text import MIMEText
, Q( |# \/ H! G. Q! Jfrom email.utils import parseaddr4 G8 [7 F8 B$ u# \
from email.utils import formataddr! q- P; {( c$ C5 [* G
from email.header import Header& a. A! e$ A& i5 {3 W& F, Y/ i
# _: M' v1 V1 V: J* c6 P4 N" U& v+ s, f
def __format_addr__(addr):8 `3 u2 q# i0 N# k u7 p$ r) [/ R
# 解析邮件地址,以保证邮有别名可以显示) ~9 S* W( W4 i) a5 j
alias_name, addr = parseaddr(addr)
; P4 q Q& N$ |7 ^ # 防止中文问题,进行转码处理,并格式化为str返回
$ y" v5 j& p3 h: |* N5 O return formataddr((Header(alias_name,charset="utf-8").encode(),( Z# y* m5 B& V" |/ l
addr.encode("uft-8") if isinstance(addr, unicode) else addr))
* K! T5 M' R) H
9 t+ _3 @: m1 v& b# M' B( L8 J# g: j' ]1 x4 d. C
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):) h0 d+ N1 `+ y" G
, h- f% a7 S7 s$ r1 F SERVER = 'mail.***.com'
& L8 o! e$ H# q7 [ USER = '******'% g. z& ~. f% u, Y2 E9 E# h
PASSWD = '***'7 |6 @; X# W* Z- o& V: v" n2 I
' |! x6 r8 S" \
strFrom = __format_addr(fromAdd)7 }: Q) N1 b7 a
2 F4 b" ~/ B& j1 G' d
strTo = list()
9 O U1 W9 |, O # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化. J3 A+ h) ?# B% k N* I+ F0 z
try:
2 a9 z6 N2 N- |) S3 [5 j4 O ~ for a in toAdd:- e, o/ B) \1 l8 m
strTo.append(__format_addr(a))
/ K' C. D3 f; [2 [- u8 Z$ d- H except Exception as e:7 h+ z% s# y4 c
# 没有对a和toadd进行type判断,出错就直接还原
% u' L: v" l1 j strTo = toAdd( _' w2 ]" m' z( a
+ ^ J X. L9 j' X# B1 Q$ }. n msgRoot = MIMEMultipart('related')
* l0 I- Z% I% d' g p/ M msgRoot.preamble = 'This is a multi-part message in MIME format.'. w* R' r% K* X
% Z% ^: v" M* W& v9 t
msgAlternative = MIMEMultipart('alternative')9 l, N& b/ x% _" f8 ~" s
msgRoot.attach(msgAlternative)) K6 g7 b$ y* B+ h3 ^
, }9 n2 Y% Y0 s& ]* I
# 邮件对象
+ }) [* N. H6 ?' g+ T! j$ b* J4 Z. H msgText = MIMEText(html_text, 'html', 'utf-8')
& P3 O, e- D+ d* Q msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
) R) D2 |) d$ M* U& ? msgRoot['From'] = strFrom # 发件人也是被格式化过的
- }/ N! [4 O. v% N msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
* h+ X/ W: G: t3 R( W5 h msgAlternative.attach(msgText)( l. V6 c+ M7 y- Q" g/ y1 z
. e' k0 F! K! l
smtp = smtplib.SMTP(SERVER, 11)% h1 O( G. |$ u* t6 N' `* @
smtp.set_debuglevel(0)& n/ q Z8 F- `' _/ P; R
# smtp.connect(SERVER)- N' Y/ U$ F' X/ m G
smtp.login(USER, PASSWD)7 c$ X" \: G9 D7 n+ ?2 p
# 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别- O, {4 ]* s* W& V. z" T
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())9 w5 e! c) ?- f5 U( W, ]) ]
smtp.quit()
& `1 c" `3 ^2 y9 u* T总结:0 r, A) ?6 b, z* z4 J
/ ?2 P1 O' ]* r/ V& v1 F
看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
4 x& o* L0 W! P" r
5 X/ `1 ~2 V! P$ c& h& L2 ~4 r实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”
. ~( p; Z, q. [
+ V R: B0 ^/ r' ?; p: n0 G( M# q同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型% l+ D2 L' Q4 J9 a9 _
4 C0 F' i, O0 F" W/ I0 i
还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
. y: l/ R/ q) G- }& @4 S1 t4 ?" j最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得8 C1 C t: V' j# x/ `& _
: k0 o. V2 ^) N- q: B" @1 D: E( C5 N
,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
6 T9 @6 Q2 _4 T0 C9 ^
+ l) J2 E4 H! y. T8 B定时讲解Python技术,分享一些学习的方法和需要留意的小细节4 e: m9 w9 C0 I! L* Y
————————————————
8 y" R4 ^# i# m$ l) ^0 M2 b+ d, D原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
( W7 k" G4 q" u+ [8 K
8 A E" ~: j% c7 |! ` a' I& ?! S2 c
! T% B1 u8 `9 |# m |
zan
|