- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 558441 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172905
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python发送多人邮件没有展示收件人问题的解决方法6 w3 W! P. a; m4 g/ U, S
这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
6 ]" E. A; B- V- M背景:
% M, E; h# T2 i9 @1 ~4 @" ]( g
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人& l1 o; f: R' ^4 O# z
8 |. a2 [8 ^( Y* H: c8 i7 s问题:0 Q/ J( X, R& w% u+ O; q2 ]4 e
/ Y! |6 `# ^7 V# ]# r8 R! G
使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
5 ?# H2 f* k1 n/ G4 r. i
8 G* \% V0 {6 b4 N$ h9 _5 j y9 p问题代码示例:
% ^+ k2 b; g% g ?( F# -*- coding:utf-8 -*-* E. |8 L1 o$ [% B+ r9 D
import smtplib: f" c3 v! O* h
from email.mime.multipart import MIMEMultipart$ N$ C9 ?/ E5 O2 H
from email.mime.text import MIMEText
) R6 \2 x7 x* e9 Z7 S R2 T& |8 H9 Z1 D+ b2 [2 }
def send_email_to(fromAdd, toAdd, subject, html_text, filename):- K. @' U- }2 c& T
server = 'mail.****.com'' d) b. @* V' R& L3 I- M9 _
user = '*****': O7 [% f+ @; t
password = '********'; u; J; m( e% K4 T
& d! V. k* f5 _2 e |
strFrom = fromAdd3 `2 |: x; b$ X6 X0 g
strTo = toAdd* p3 d; H+ F# e& l O
0 Z2 K1 h: g3 ~ w& {4 ~$ R9 U1 y msgRoot = MIMEMultipart('related')
% F9 W2 y& C7 K# _5 T msgRoot['Subject'] = subject
( O" d \% A9 I7 d9 B: V msgRoot.preamble = 'This is a multi-part message in MIME format.'2 c( [% l6 |# Z+ v; K! H
+ ?4 U9 A$ F$ ?9 o+ u msgAlternative = MIMEMultipart('alternative')
! Q( ^5 I3 e5 r msgRoot.attach(msgAlternative)/ A& P2 D9 Q( p* }1 a" L. M
5 z- l% H- a1 v3 S: ^8 X$ h$ @
msgText = MIMEText(html_text, 'html', 'utf-8')
. I! w- K p9 o. Z msgAlternative.attach(msgText)* s D5 Y7 W8 I3 L
4 g/ y/ M* n9 E4 v. D
smtp = smtplib.SMTP()
" S* I3 c6 o. a6 e2 o smtp.connect(server)
$ L% w$ h' R4 A+ c* A7 S' | smtp.login(user, passwd)
! d4 i' y1 e! K/ }9 l' D* c
/ l6 Z/ R# H, m# Q att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')3 v( L4 E) g1 b
att5["Content-Type"] = 'application/octet-stream'
$ u" i. X- X/ y. P att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
) k" w* K' q3 C/ p) _" G msgRoot.attach(att5)
6 `+ B( e4 d0 W& H! i4 ]6 I
4 Z, A, Y$ e6 z1 s0 h7 F! y smtp.sendmail(strFrom, strTo, msgRoot.as_string())
& Q' [/ h* G; i! y) d* h$ ? smtp.quit()
: y; j) c9 ~2 f% i- Q$ J return, q. i! @7 S0 V7 A* }( u
6 f# {0 f' V0 q2 p' E. Y2 q
6 O' L% v9 s3 c成功代码:& R. b/ l' n$ H# b$ {0 O
#!/usr/bin/env python
8 k4 S: h3 e. G( L# -*- coding: utf-8 -*-
. J3 u7 z: y. l2 D# n0 w. @" s" Q4 G1 L' {+ m, `
import smtplib' b7 u) ^( \, ?3 }
from email.mime.multipart import MIMEMultipart
. u: R& E5 f: v' i5 G6 Yfrom email.mime.text import MIMEText% Z# _ `% z! V3 s; r
from email.utils import parseaddr ~. p( B+ v4 J M, f1 h3 X+ O
from email.utils import formataddr+ n* G, Z1 D5 S+ n
from email.header import Header
, W. y: y5 C/ I
- _6 n! q$ y8 M7 @: p h: Q, a" e7 g! U2 w' d) L0 b; [3 Z5 j' y1 [1 |; a
def __format_addr__(addr):( i9 L0 l. {. {* y0 Q; w W
# 解析邮件地址,以保证邮有别名可以显示/ [/ c! ?$ @- i- U u" {
alias_name, addr = parseaddr(addr)3 O. [3 |3 _' m4 T9 W3 c- ]
# 防止中文问题,进行转码处理,并格式化为str返回7 Y6 m6 G- C7 l$ B' d2 L* W
return formataddr((Header(alias_name,charset="utf-8").encode(),
( j) `0 ]0 a4 _7 d& d2 j0 ] addr.encode("uft-8") if isinstance(addr, unicode) else addr))
; E) t1 ^) c4 _8 ?4 d7 G1 L* [% F. Q3 R0 f7 ?! m
' ^7 C; P! L# q0 L3 B
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):. d- J8 m$ u! e# A$ M! F$ o
1 c% [$ T6 ^1 T3 \
SERVER = 'mail.***.com'
+ s; C W' a2 O' k& e8 y USER = '******'1 |& x! a$ @% ]1 `2 O' @- t! b
PASSWD = '***'/ D" z5 c+ }' e* r; w7 D9 B" D0 s
* `5 U; h: \. z; K& n strFrom = __format_addr(fromAdd)6 u+ }) d `7 s- C1 ?; x
$ @' \+ U/ `& x7 d! n$ t
strTo = list()
' G5 m4 K$ D+ |6 L2 D4 w # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
1 E2 k! [3 f! J9 n7 |9 _- a# U/ ` try:
4 P/ o% i& x% c) k. w9 |# L+ o% k. p for a in toAdd:
F9 H! c( V- f" m. ~( F$ t strTo.append(__format_addr(a))
( c" o% Y5 i' j& }9 ~ except Exception as e:
* N' D+ K1 F4 _ # 没有对a和toadd进行type判断,出错就直接还原+ x" t0 q, ?' O/ r; N5 I
strTo = toAdd& ?8 w5 l2 @7 P) P i
/ \8 s8 c5 ^5 ~7 x8 X8 v msgRoot = MIMEMultipart('related')* ]/ H5 V8 Q9 d; e0 Z
msgRoot.preamble = 'This is a multi-part message in MIME format.'
) ^$ R1 k A) m. {3 K0 a! a* ^
: s, i. s8 Y* {/ C: S8 P2 K msgAlternative = MIMEMultipart('alternative')
2 p3 I6 @; B- y& u$ c$ D1 E7 @ msgRoot.attach(msgAlternative)
9 u6 C/ J5 s( w* K S, o4 x8 w9 `7 g- S& U
# 邮件对象 7 O9 X& e; F R& q
msgText = MIMEText(html_text, 'html', 'utf-8')
/ l3 ?6 r' D! k, z msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
9 ~+ `& Y9 u2 U* ^ msgRoot['From'] = strFrom # 发件人也是被格式化过的
5 N y! g* A. m! p+ j8 X$ [ msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”; {. ]- q0 g3 _: @
msgAlternative.attach(msgText)7 T4 h6 ^' n8 A3 k
! m7 Q) K3 D | smtp = smtplib.SMTP(SERVER, 11), E5 C# b' ?4 p; M
smtp.set_debuglevel(0)
' K% L) Z v7 K% L5 ] # smtp.connect(SERVER) N* B) |0 j6 L
smtp.login(USER, PASSWD)
* u9 h9 |9 L% G9 B% g, {" q0 k # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
8 B) U6 ?! J, ]5 u smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())- @ L3 d4 x0 F) f5 `2 a5 S
smtp.quit(): g8 a6 o8 [/ y1 ^& K6 Z- h/ Q( q
总结:
4 l0 w- e" g5 ?. D
# |) e# _- B( ^/ P看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
4 |9 T. e4 ]9 j; [' ?2 V# U5 w, b; \$ g8 C. c- T7 ]
实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”- g" l" N2 p. d2 L9 y7 g
9 s7 r% f9 n/ b* o: ~
同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
3 e# Y! X6 e7 q$ I3 m- n
; X5 \4 n6 p/ T/ Y5 Y还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。3 i) A D/ a1 K1 v5 M& v, D
最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得! r4 M4 n1 ~" N1 I h4 L; ? I
3 ^0 z$ c) Y. C& w,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员3 Z, k& B$ A( a6 r! y- N
6 U! `# S& Y2 P0 \1 K定时讲解Python技术,分享一些学习的方法和需要留意的小细节, A! |9 x% U2 P! q6 _" x
————————————————
& b7 a" A, o. d$ [原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
. \! l- ?9 Q5 _9 t1 C1 d$ W4 R4 Q
. r. N) j' j3 d
4 Z( {! e; o1 ? |
zan
|