数学建模社区-数学中国
标题:
python发送多人邮件没有展示收件人问题的解决方法
[打印本页]
作者:
杨利霞
时间:
2020-3-30 11:14
标题:
python发送多人邮件没有展示收件人问题的解决方法
python发送多人邮件没有展示收件人问题的解决方法
! J* [+ F: i! c
这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
' K. \1 X; M" e; x& R3 M& N
背景:
/ W, d Q1 U+ C/ O1 V
0 B {5 ~5 ]' N; `' k
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
; [+ l2 w7 }+ ]/ a& j; h6 W$ [! _0 N
- s2 X( o6 X' r
问题:
. q4 T6 x9 F& i, M1 U
6 S6 w6 B' b) T' H
使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
0 l$ j: Z0 r2 m( ?* a2 \' Q6 f
" j% e' ]: ?" |) W
问题代码示例:
! ^3 b5 ?9 d! w% {! B5 G# Y; x
# -*- coding:utf-8 -*-
! [' _! W% y) E) j% T" ^
import smtplib
3 ]) L- w' `. l @3 y) C/ s3 N1 Z
from email.mime.multipart import MIMEMultipart
/ Y- D& {( o" F: k2 R
from email.mime.text import MIMEText
6 M) A- d- _0 \
- O8 ?# |6 i: N2 h/ \0 a' ]
def send_email_to(fromAdd, toAdd, subject, html_text, filename):
0 }. Q) B0 U) Y8 u
server = 'mail.****.com'
6 N$ I% `, [4 n, W2 w# d
user = '*****'
4 w% R; K ?4 |5 k, z
password = '********'
% T% o( G( l3 v+ w; I: [
- o; J. x2 a) C. u9 S2 n4 u
strFrom = fromAdd
: ~- y5 z, V! V: p+ p- U1 m9 x0 N
strTo = toAdd
3 Z9 C) |0 Y- H- m# H! r. X
4 M4 E3 S, x; a
msgRoot = MIMEMultipart('related')
* G- N$ z: `5 B* I% `' l
msgRoot['Subject'] = subject
. O$ h4 J4 @, Y# ~7 }" `1 ]2 m
msgRoot.preamble = 'This is a multi-part message in MIME format.'
2 a, X v) }% U" n% o0 ~4 n4 A( f
; A" ]6 T d% u& R
msgAlternative = MIMEMultipart('alternative')
+ U4 ~( }3 L/ x" y
msgRoot.attach(msgAlternative)
# s3 E# [" F# _+ S
5 h" N6 D0 B# z. o' d
msgText = MIMEText(html_text, 'html', 'utf-8')
% m5 s9 v+ w0 B! t& Q
msgAlternative.attach(msgText)
% I- `% u; I$ M
" J8 j% `2 t8 C6 Y( T" j9 L
smtp = smtplib.SMTP()
+ r @0 u& ]! t% u4 @( [3 ~: n- f
smtp.connect(server)
" X1 `* }" y0 x2 v# n1 L+ L- w
smtp.login(user, passwd)
4 K: t' _$ ?" B( M
1 a: p$ l4 j6 o$ X% f, B
att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
2 c Y. k; Z$ z) H
att5["Content-Type"] = 'application/octet-stream'
! O f n; z/ x7 Z W$ Y- A& N2 P
att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
2 \8 @3 K2 v2 v9 _6 Z% K" K+ B
msgRoot.attach(att5)
' U9 x# W/ @: c* u
$ ]; @6 d: Z7 Y6 X/ ]4 [/ t+ f1 t
smtp.sendmail(strFrom, strTo, msgRoot.as_string())
# G' z3 [3 f' k- R" U
smtp.quit()
" b, ^0 r( `6 }' T1 M. k5 h
return
~1 h3 a$ G. n% M/ A
" s _) H: A% }3 G5 Z7 P
+ o3 x3 i" v& [9 t6 }
成功代码:
d' k) A( Q2 O5 b* ]( X
#!/usr/bin/env python
6 c! |" s! G1 A" b" Z
# -*- coding: utf-8 -*-
?" y- k4 ? Y/ ], I
+ W0 ]' n$ g7 d% r$ E6 g* I6 [ L' \
import smtplib
2 n! c) e; D: U( D( O5 u. b
from email.mime.multipart import MIMEMultipart
/ b' q `8 s& `$ z) C
from email.mime.text import MIMEText
+ ]/ D/ [ K. y
from email.utils import parseaddr
2 a+ D( P1 o. [0 s
from email.utils import formataddr
8 `$ r! o7 L0 k$ ~. J6 _
from email.header import Header
1 Z& V R* R: v0 j
7 h% r! H; E. Q9 I/ r1 S
7 [ c7 D V. _7 g/ O# P2 N. g
def __format_addr__(addr):
4 E1 }* ~9 a8 s4 G/ v, E
# 解析邮件地址,以保证邮有别名可以显示
4 [( N5 o$ U1 F1 O' o) O: R9 f
alias_name, addr = parseaddr(addr)
/ W' [2 J6 v/ f# S1 A
# 防止中文问题,进行转码处理,并格式化为str返回
, t! L' X1 G- o3 v
return formataddr((Header(alias_name,charset="utf-8").encode(),
1 ~. P$ o/ O/ r( [
addr.encode("uft-8") if isinstance(addr, unicode) else addr))
2 m) C7 R& ]0 p
}+ ]0 a- ?/ F3 w! m* m
. r: e2 j) d) Z* m' z3 n
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
( _0 ^6 d3 D2 p2 B
' }' l7 Q+ m& C& V; A" {
SERVER = 'mail.***.com'
3 x s0 z6 W; `% \- G
USER = '******'
g1 H( O- J6 |3 f; H/ S
PASSWD = '***'
) g0 ^/ f. t" @
8 l) u2 c, k. I$ I0 W+ z
strFrom = __format_addr(fromAdd)
1 w/ V' Y8 M+ s, o) A5 p v
3 l T' r% ^% J9 z# g( ]0 h+ |7 S# J- W
strTo = list()
9 m0 K- N* u; s8 ]% R# s
# 原来是一个纯邮箱的list,现在如果是一个["jayzhen<
jayzhen@jz.com
>"]的list给他格式化
6 i$ \ Q$ b3 x n8 z6 Y+ E9 |2 e
try:
. h& f% P& ?( U5 z% v) A5 z1 e
for a in toAdd:
! R2 x$ T1 ^, [* s" C2 f) W
strTo.append(__format_addr(a))
0 o- w; c2 y% j) J/ @( M+ y6 P6 x
except Exception as e:
7 u& m ^* M# ~, I" l; D2 i5 ]
# 没有对a和toadd进行type判断,出错就直接还原
" C$ L( @2 c% M
strTo = toAdd
3 Z7 L) ]5 h7 u& c' k. C7 }. t! r1 h
* A. b; Z. S. \2 a6 l6 _
msgRoot = MIMEMultipart('related')
: J4 S+ w6 X* }: L
msgRoot.preamble = 'This is a multi-part message in MIME format.'
; R4 r" ^& u& N" U) X u" d
5 t" L7 V* ?2 }4 n7 }
msgAlternative = MIMEMultipart('alternative')
; q. d( r0 D9 s; i* U% N. T* P
msgRoot.attach(msgAlternative)
7 e5 \7 B( R4 A" R5 O, Z
6 m2 U% ^5 b* l' u2 ^ \
# 邮件对象
+ T4 t! E4 Q" l- x E0 r
msgText = MIMEText(html_text, 'html', 'utf-8')
8 m L# Z3 B% [1 C8 P0 f" ?8 i
msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
; T: Z! ~. ~3 X; `
msgRoot['From'] = strFrom # 发件人也是被格式化过的
7 c; b2 D& j" D, f, w3 \7 ^
msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
/ o3 @5 V7 }% t- R' i5 v0 c# Y/ |
msgAlternative.attach(msgText)
! _$ F# C+ w9 |8 Q
6 ^) {1 p/ U0 n5 B# V! i) K
smtp = smtplib.SMTP(SERVER, 11)
: T! n/ x6 ~2 l2 v6 M
smtp.set_debuglevel(0)
1 ?% S E3 X2 j) v9 x( o
# smtp.connect(SERVER)
" G0 I/ ~/ ^6 E
smtp.login(USER, PASSWD)
% [8 w9 x! Y% N+ J. Q/ ^
# 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
8 t0 j$ x, C3 a3 m/ k- @
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
$ t2 l, `1 M" r4 Z. l' \' ~
smtp.quit()
) Q% y6 V1 S: t3 V, h
总结:
% g. I' |- s& z s1 a, _
: }! f9 R! y j+ u
看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
" E: b, v6 [ }
4 Y7 W: a; |0 s0 ^5 d! r* j
实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”
6 R. Q4 x+ r: \3 H" q; J; X
6 }9 s! W T! l
同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
. F4 A6 |3 |- h) A8 V4 K
. H; d& @0 s" a8 c. z
还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
- K- u2 b v' G b) _5 N0 A
最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
/ G4 f( y. _, y' N+ {
# o- O" }( n3 u/ D* W
,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
" W# ?' `0 u F( H) }
4 R( A3 W, E* A0 Y
定时讲解Python技术,分享一些学习的方法和需要留意的小细节
, x/ E, }( F) y* c1 n9 E9 f1 I
————————————————
3 G2 x5 t; n1 Z" f: E
原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
% ~ W! C8 a6 d. S* @/ ?! i0 D5 F
: W$ h4 g1 v, f# L; j9 M& o
( _3 b- U" h7 D& `" j
- v+ N* l' I# o5 N: N( p
作者:
柠檬草lll
时间:
2020-3-31 11:00
发表回复感谢分享
6 l( I1 X4 P3 d+ h) r0 r' T
作者:
柠檬草lll
时间:
2020-4-16 22:10
发表回复不错的资源
6 c* R" O* Z4 F! [' v4 e& M# U
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5