数学建模社区-数学中国
标题:
python发送多人邮件没有展示收件人问题的解决方法
[打印本页]
作者:
杨利霞
时间:
2020-3-30 11:14
标题:
python发送多人邮件没有展示收件人问题的解决方法
python发送多人邮件没有展示收件人问题的解决方法
, Q* m* u; C* h1 G
这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
# t- M! K% E0 d" `3 |! t5 s+ N+ _
背景:
: O- w* F( B3 Y1 L
e6 }; J; x4 o6 P d
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
, W" R4 _/ ~4 n, T2 ?6 w7 K/ t
8 K% c& ~) M7 \/ Y0 ?/ Z
问题:
/ |, ~" l1 `8 w, E# S
+ ]) ] @5 Y1 @/ [9 V. v: k2 O8 y
使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
1 H3 P% l, U9 C+ Y: L: R1 G
8 o5 z' u- [: j& s; x9 y+ _
问题代码示例:
- j" n- C# ] ~' K
# -*- coding:utf-8 -*-
/ x) X5 P1 I" T" x+ x8 S) z. D; F
import smtplib
3 A x) ]; d. z5 g6 s( N
from email.mime.multipart import MIMEMultipart
7 v- q( I& A$ e8 U# r G& Z
from email.mime.text import MIMEText
8 i& b9 [# I8 c' ~. O, g
9 L6 n$ \ p* e4 B
def send_email_to(fromAdd, toAdd, subject, html_text, filename):
, N/ B; P. h- Z% {
server = 'mail.****.com'
0 ^+ ^( ~6 @& G& s1 J' {
user = '*****'
9 ~6 y* X" Y/ T/ N# p& z& k: q. m
password = '********'
, [! T# w G$ _- U% R, G8 s
/ E {; N( ] {; r7 Y
strFrom = fromAdd
: `1 q1 L* ^+ W% D
strTo = toAdd
$ P: U$ l& _# u4 l2 Q" k6 h
$ k: f: j' ?$ {8 e+ a, a8 h8 s: C* y
msgRoot = MIMEMultipart('related')
5 P7 j8 t6 l3 |" E! e# n: ^. e
msgRoot['Subject'] = subject
5 B. ?+ `* P+ ?" ^4 |7 |' X
msgRoot.preamble = 'This is a multi-part message in MIME format.'
* j" s \& ^" k, B2 O
; ^# G3 s0 a( O5 u4 G% U; ~: F
msgAlternative = MIMEMultipart('alternative')
9 P6 n7 n, Z+ \8 ^
msgRoot.attach(msgAlternative)
8 P! k! B% @1 q
2 s" M$ [0 E3 m" T; u6 M+ R/ D
msgText = MIMEText(html_text, 'html', 'utf-8')
, }$ G6 Q$ G* ~# \; }& Z5 N
msgAlternative.attach(msgText)
0 b0 G& {! b O0 ?9 e. D8 q
) L; M* D m; U) b% s+ l" c {
smtp = smtplib.SMTP()
: X5 A" ~; E/ [* [
smtp.connect(server)
p L1 n7 L9 U: V% {, }
smtp.login(user, passwd)
o$ K0 y9 V6 ~
4 ? Y2 o Q# n+ c* o
att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
* A* [ s" C1 ~) c
att5["Content-Type"] = 'application/octet-stream'
; Z3 p# p$ r) t% e
att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
8 y8 X2 v8 x, U- k; R5 W
msgRoot.attach(att5)
7 G4 ?- M8 f( O e6 _
% g7 t$ d' ?" x$ Y w' M
smtp.sendmail(strFrom, strTo, msgRoot.as_string())
; V2 a5 y; w6 m: Y/ g2 E) [
smtp.quit()
; L* {* t, h+ I& o. O) j
return
9 O8 W. n) T8 s0 W) e; Z# S+ K
. c1 y" a) M. O/ }
% G3 B2 C+ Y- `
成功代码:
; V* d; U' x' [
#!/usr/bin/env python
3 `4 G" F( j3 f$ C9 \
# -*- coding: utf-8 -*-
' {5 w5 c# w o- h$ k
% F" K1 j% f' h! n% L
import smtplib
1 S. E& J( h3 J2 [4 A' S
from email.mime.multipart import MIMEMultipart
3 p9 m* g3 K* N4 L- v
from email.mime.text import MIMEText
8 a+ r- f$ z( T: U$ G$ o
from email.utils import parseaddr
% ^# P; u5 S) K( t
from email.utils import formataddr
: N; N. X3 [7 P. C i
from email.header import Header
* `0 R% a9 D5 c
! E; h5 @1 M! l
; I* B0 T( F+ r
def __format_addr__(addr):
! [/ p0 z0 z& y- g
# 解析邮件地址,以保证邮有别名可以显示
/ H0 u- M( A' i! [
alias_name, addr = parseaddr(addr)
3 H9 W6 R# k- {, j( `4 J, h
# 防止中文问题,进行转码处理,并格式化为str返回
/ \* u& x; R4 K# j! c
return formataddr((Header(alias_name,charset="utf-8").encode(),
% ?0 H% K3 d ^( R' }; y6 N: b
addr.encode("uft-8") if isinstance(addr, unicode) else addr))
$ k& V+ Z7 V$ a4 l. K( W8 V. b' N
9 H% Z: X- q U B' E) g$ C
1 [5 b6 x/ F& F2 ]
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
- Z2 q( F$ A+ c2 ?5 q* ?' v& N
4 [4 Y* m: k8 ^. Y+ T9 N
SERVER = 'mail.***.com'
' ~/ j) G$ @& j+ s, C/ w T
USER = '******'
5 c2 K7 V$ u0 M/ O. n/ D( Q
PASSWD = '***'
e( A& P5 E" b' I2 i9 M0 l6 ]
5 u, r4 V4 Z1 T3 l) v+ q
strFrom = __format_addr(fromAdd)
8 X# x4 P q, a! b2 Q8 ]1 _, ?0 m
4 ^0 ?4 \7 Q, B! |- S/ j
strTo = list()
' b ~7 J5 B# N
# 原来是一个纯邮箱的list,现在如果是一个["jayzhen<
jayzhen@jz.com
>"]的list给他格式化
$ r+ c7 m1 Y8 a) r8 [
try:
* l# a" O3 `* l! f5 ?# q3 ?" r
for a in toAdd:
, b, o5 o+ g6 [. `6 B
strTo.append(__format_addr(a))
; i$ q+ f d6 i( m5 A! n5 H
except Exception as e:
' H/ n( n; C% L- J+ R
# 没有对a和toadd进行type判断,出错就直接还原
. k! x7 G1 Z. k/ i& P* w* H
strTo = toAdd
2 }) O6 ^ D7 x/ o" V( v9 d
7 Z- v( v; O v; E5 u
msgRoot = MIMEMultipart('related')
6 N* X% v2 _( A+ c' q
msgRoot.preamble = 'This is a multi-part message in MIME format.'
9 g$ |8 z; V0 h9 p) D! D
2 D. G2 L1 P4 d3 q
msgAlternative = MIMEMultipart('alternative')
1 x' Y8 M, J* Y
msgRoot.attach(msgAlternative)
! z8 T: a$ {% [& j
2 Q' L/ `' u* W) D7 t$ C
# 邮件对象
. Y/ F; T# c( i2 i/ M8 g) f/ v
msgText = MIMEText(html_text, 'html', 'utf-8')
0 H1 E- i! X" n- M
msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
! Q, \1 N# E( D- b
msgRoot['From'] = strFrom # 发件人也是被格式化过的
; q1 g. C* Q1 S; u
msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
7 r) _* o7 V* X8 A
msgAlternative.attach(msgText)
0 B; t( W Q0 z( ?4 [
0 a; x5 L9 d. K
smtp = smtplib.SMTP(SERVER, 11)
7 k) `; m# g. o( a# h) M
smtp.set_debuglevel(0)
( E. G% _8 z0 x2 R2 n5 l
# smtp.connect(SERVER)
. K* f4 W. J$ L; v/ \ [& _
smtp.login(USER, PASSWD)
8 h( f8 j, W* }' e3 h
# 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
4 r# x7 i1 z8 g$ b4 R
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
6 z8 E) @5 _' X6 H; o! C. l6 K+ |
smtp.quit()
9 N( [& o- b m* S# Y+ R- w9 m' d
总结:
# Q& h4 Q" I& y8 X
+ W N3 Z8 D0 c9 F' P3 p) P- V! V
看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
[% F; M" z+ ~. j/ W% Z( C, ]
5 k p: y& K/ q5 Z' Q
实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”
" }0 c0 `+ A9 l
a1 Z* M' S6 A0 Z
同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
( F& L8 c( ?5 D* A+ I% d$ _6 g3 C
1 i7 o9 |& ]6 K
还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
) a/ [( E$ p$ J0 g/ ~1 _
最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
/ U. N1 m5 r H7 n7 ?1 ^
* R$ S+ ?& j( V$ Y. b% B
,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
/ g4 n$ o0 U0 P! a
, U1 W+ z- N2 y1 K
定时讲解Python技术,分享一些学习的方法和需要留意的小细节
8 M7 b1 s# g3 L T
————————————————
3 W# S. K& m' Y) {+ r7 a% u/ J% z
原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
& j" }+ v0 F) Y" p! y/ v0 q+ G
, x# W1 Z- n( |0 ]
4 ]6 ]- |. u7 r) e1 X
- O) X* o8 T4 R" Z% Y F
作者:
柠檬草lll
时间:
2020-3-31 11:00
发表回复感谢分享
$ K$ j* M) ~( ^! d$ M! G4 x6 Z
作者:
柠檬草lll
时间:
2020-4-16 22:10
发表回复不错的资源
. O- A. r6 P8 P
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5