- 在线时间
- 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发送多人邮件没有展示收件人问题的解决方法
( H# {# f% M/ a0 k$ _这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
/ ^* z1 c: U4 A) n( z# R B% C背景:6 A, _% j' R4 t7 \" `( x+ `
$ P7 y$ |/ H6 C4 n8 Z- ?工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
4 `/ p. F& ~8 [ l3 j* `, I3 w* {# D- A* H& z
问题:7 N. r6 ^1 B; R9 V# z, a
1 Z6 q- ~ E, H: ?& \, j, R' a0 [7 O
使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容8 ]1 f7 O) | x6 d' x) u
8 L; C' {0 H, ]0 i+ ^问题代码示例:: C: C: ?" Q. L; G3 S5 O, E& h; D
# -*- coding:utf-8 -*-. N7 f9 b% L& ] w
import smtplib
' R: D$ u4 g; ^$ F2 rfrom email.mime.multipart import MIMEMultipart1 h1 `' k! `8 D3 G- Q) |* q- `4 o
from email.mime.text import MIMEText
5 Z% s6 [) f9 x. [
/ F# G/ x$ L! y4 n! Vdef send_email_to(fromAdd, toAdd, subject, html_text, filename):
' M& ^5 y; N, m; N( T' o) D server = 'mail.****.com'
4 I o3 l2 A$ Y user = '*****'* | H0 _& C3 t P6 L
password = '********'% w& v* y a. _7 s% Y* d" D5 n
( J) |5 f3 j5 h$ k# m; L strFrom = fromAdd; I: {* h; E/ b0 u; C
strTo = toAdd! M) w$ t7 D" ?+ p" K! K
( y" s' l7 C) d/ K5 E/ y: H msgRoot = MIMEMultipart('related')4 ?, j2 z% R: `/ p
msgRoot['Subject'] = subject
+ s2 Y5 {0 p0 | msgRoot.preamble = 'This is a multi-part message in MIME format.'$ B. W* A* z, E3 H2 q
7 |5 O- s/ i5 |; O, P- \
msgAlternative = MIMEMultipart('alternative')
3 t! ~5 q1 r2 v msgRoot.attach(msgAlternative)+ Z! d' B6 ]. F) f
% V( L: c% _- N& ^$ f! \ msgText = MIMEText(html_text, 'html', 'utf-8') [ C+ L+ G0 Q. O: |8 |2 y I
msgAlternative.attach(msgText)% }& M' @' y `+ l/ r& d. c9 F
. r0 t7 p, s6 C* B7 I( }
smtp = smtplib.SMTP()4 e4 c; E4 ^5 _% _1 |$ |. |- R0 p
smtp.connect(server)* S ]' Y, ~7 k
smtp.login(user, passwd)- s: s1 v2 n: s5 W
" C. I) r; T1 c+ Q
att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
* K2 h: s0 Z$ I9 x! t$ A8 l att5["Content-Type"] = 'application/octet-stream'! t: c' A. o& T; r! Z% c# Y5 V
att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
* Q: j8 U) m4 d* V) }: ~1 \/ N2 `1 ~ msgRoot.attach(att5)
) m* c& v" e1 [4 _+ o4 Z* |$ l) J$ m* k6 {- q# g/ Y( a
smtp.sendmail(strFrom, strTo, msgRoot.as_string())* Y+ L7 f# J4 _* _3 f, }
smtp.quit()8 k/ g& N# _& n) u
return; v! H0 i0 x" J, a* H5 ?
' e1 |; U& Q. a/ P( a
1 x5 o; D2 G4 P% d! I3 A
成功代码:8 [0 ~( [( b* V7 |$ L3 w; }
#!/usr/bin/env python' w$ O$ L; A; l" i9 k- {! x
# -*- coding: utf-8 -*-
, |8 f8 L3 v g3 {8 Q, j0 R
# D# u$ Y$ U. I" `/ C- kimport smtplib% \; O4 d$ c, Q( o* Y- W
from email.mime.multipart import MIMEMultipart
8 C j9 F" y/ a" ]from email.mime.text import MIMEText! S' @1 i) C1 J
from email.utils import parseaddr
3 v8 s) ]0 K( ]; J9 y& c# ^% Bfrom email.utils import formataddr
0 U X8 f u# i; nfrom email.header import Header8 u3 Z* l Y3 L7 M/ r4 t' D3 P
5 x- Y; N4 ?- h: ]: K
: Z6 I3 c; b% F$ Adef __format_addr__(addr):
' R: q% S" _( E; q # 解析邮件地址,以保证邮有别名可以显示
% o% q4 ]0 ~( r4 ?- J alias_name, addr = parseaddr(addr)
& M* m, S1 ^, N; @- ^& U& a # 防止中文问题,进行转码处理,并格式化为str返回
7 u5 p3 E6 x4 A0 G return formataddr((Header(alias_name,charset="utf-8").encode(),
7 S g3 {7 C$ y- |* c6 E( v addr.encode("uft-8") if isinstance(addr, unicode) else addr))
4 k9 W, E, v- x5 ]9 p' Z' T) k
+ S/ w0 R4 U, h" [5 U
' R. N* S7 o* a8 j- V$ e. Kdef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
2 F, ]8 f! `8 x, W& i$ x* r' Y
1 @' G8 f- k6 r0 m SERVER = 'mail.***.com'
# d! S- b, U/ `0 | USER = '******'9 [* P/ M& K8 | L, ~
PASSWD = '***'
! G7 F/ Y5 b. k5 C4 c' }; `
3 M3 m; m% d" w1 O; R$ p strFrom = __format_addr(fromAdd)
1 b' K+ f; m8 {8 v, `; k. ]/ b" {) B& _8 o8 w S
strTo = list()$ g4 @- E+ P2 @. k5 B3 T
# 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
5 _. N2 U- G0 M2 q& |# S5 C- E/ `' n try:# E j6 ~5 H; [) t! @
for a in toAdd:7 L5 }3 T. `; I
strTo.append(__format_addr(a))' q4 x# j- v) Y% ]3 r- z
except Exception as e:2 X: `4 l( }& F3 t7 @/ R$ X7 S
# 没有对a和toadd进行type判断,出错就直接还原7 n, e8 f" t" R" ?, |; Z
strTo = toAdd
3 }) s }3 `% J
9 [2 ?9 s, A) ? msgRoot = MIMEMultipart('related')
: Z, G0 ^' Y, M" a/ K8 k1 K msgRoot.preamble = 'This is a multi-part message in MIME format.'/ W; Q v0 X W6 U8 t i: S9 m
9 T: Z+ C8 b$ d" _8 B+ i. | msgAlternative = MIMEMultipart('alternative')
; V4 z* f+ p: x, A msgRoot.attach(msgAlternative)& ?0 E4 c$ t7 Q, l! G* l3 A
$ B4 A4 G# C+ O7 _ x5 U # 邮件对象 , ?* E2 c) |/ j& z
msgText = MIMEText(html_text, 'html', 'utf-8')
h1 C( @4 E) {8 {5 { msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化2 c: h3 R$ O6 S/ k1 ]2 N0 H
msgRoot['From'] = strFrom # 发件人也是被格式化过的
& b; f( @ o, C. f msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
' }4 N9 k1 t ]! n* S msgAlternative.attach(msgText)5 r4 e! b! _ M- i2 h2 X; W
' _# ]2 h8 L; h% J2 |* b j8 |$ Y! X smtp = smtplib.SMTP(SERVER, 11)- q8 {+ B* }/ r( ]( [) b$ n6 N1 S1 i
smtp.set_debuglevel(0): P$ \% X# n8 a% ?% u9 ]- ]
# smtp.connect(SERVER)
# b: D, n7 S2 [* ] smtp.login(USER, PASSWD)
# A/ k; Q% W3 Z i/ t$ v' E2 t # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别# T% J- p6 ?/ B4 C0 C
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())9 T/ @ q! l0 @) }
smtp.quit()! m, r2 E. j2 F9 _( k
总结:$ w+ P+ b: G- G2 p% ?
# n2 ?. k1 y- s$ E' n. V
看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo7 a2 }% i. z7 m* Y! `
: B9 p; [" _- G* d3 z- G1 f" D
实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”' K6 [% _- x) A$ E2 D y
0 B$ c4 J; y' I' e! h1 F' L
同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型! }5 f7 [7 {% }7 c; F& l: I+ U
+ `6 w4 P1 z4 R& k q还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
0 c6 }" R; O6 ~3 ^* M+ D, F ?; O最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得& ^- ^( _! r; g5 H
& {4 J) D6 [; k- p% D
,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
! D5 W5 @' _. b; y* ^0 H
" K) k/ ^' T! v$ `% Z7 L( E. R定时讲解Python技术,分享一些学习的方法和需要留意的小细节
: ~2 ^( B. F- }1 ` ?4 x————————————————
8 B7 }! }; r6 [* Z# p原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
% X2 n* h4 ~& C9 ]
8 w8 E; @; m& U) i; K0 W
" W! h r/ o$ U" f# \# o8 g2 c& `
. R( G* R3 _ E# m; e |
zan
|