数学建模社区-数学中国
标题:
python发送多人邮件没有展示收件人问题的解决方法
[打印本页]
作者:
杨利霞
时间:
2020-3-30 11:14
标题:
python发送多人邮件没有展示收件人问题的解决方法
python发送多人邮件没有展示收件人问题的解决方法
4 A: R( g8 w; J1 z* E& i
这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
% N$ _. N' \0 f9 I
背景:
$ v4 B' X% j; |! `" ~2 @
4 j6 }7 @8 _( C8 o! L7 |% x! o
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
7 i3 e, y" N( Q/ P4 n
! K8 y6 Z0 N0 {/ j+ [
问题:
( r3 U9 U. R9 A# K9 W; i
2 B2 \- \' r1 _" l6 B# J6 ?: _
使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
. l; ]2 `, @1 I
- w s" u4 f) m3 D
问题代码示例:
9 E( ]% X: @3 B, L0 |
# -*- coding:utf-8 -*-
( i9 h6 y6 j0 r C: t3 y( g
import smtplib
4 a8 l/ o1 x9 t8 t2 \
from email.mime.multipart import MIMEMultipart
( ^/ c% Q/ y: J# ^4 W
from email.mime.text import MIMEText
/ y4 X8 X6 o- R5 @$ P) b
, [+ \( o: K F6 R* L4 q1 C. C) V- B0 U
def send_email_to(fromAdd, toAdd, subject, html_text, filename):
: `9 a8 m8 K! o! \, m
server = 'mail.****.com'
: V# j" H" o; a+ V& p" `
user = '*****'
j) I+ Y. x0 i3 [
password = '********'
7 J4 Z2 P/ k$ a1 e3 H" r0 m* F
9 {9 O' H" V+ d% _2 w
strFrom = fromAdd
1 [. G5 {7 a1 A! j
strTo = toAdd
9 m, C$ `2 C- }# ~7 ]
( W% Y* w* D' l- c
msgRoot = MIMEMultipart('related')
$ r, y! A/ H+ l: ~4 Z
msgRoot['Subject'] = subject
. a$ w, H9 O4 W' P& U
msgRoot.preamble = 'This is a multi-part message in MIME format.'
: [" x% M0 ?! k0 L. y: Z' F
! }4 r: j9 ?; \; b+ f
msgAlternative = MIMEMultipart('alternative')
& R( x0 N; |& Y/ W. [7 F
msgRoot.attach(msgAlternative)
8 C( {# @# R. R# s- u* b, F
4 E. X; g7 s0 u5 x1 p
msgText = MIMEText(html_text, 'html', 'utf-8')
4 Q& _- b4 s/ T$ g& `* g/ C" X
msgAlternative.attach(msgText)
5 _' T3 t$ g' N+ t
0 k9 z3 |: a% o; F# ^. S
smtp = smtplib.SMTP()
' _* p* [, O" W s
smtp.connect(server)
$ {3 |, U* _6 B ?6 l7 d
smtp.login(user, passwd)
) N; c' E# I, N* r& s% v
- X& J$ U8 W, N/ V
att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
" q% ~* l; P t4 b+ Y, t
att5["Content-Type"] = 'application/octet-stream'
8 x0 @5 |! G8 i+ _- X/ \+ E
att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
8 m* R. Y) o6 \% B6 R
msgRoot.attach(att5)
8 A N9 O5 [2 V4 d( U& _% Q& D1 Y9 v
9 ~0 o: T4 ~) Z) F
smtp.sendmail(strFrom, strTo, msgRoot.as_string())
# J. R, N7 M/ J @$ j5 L9 C
smtp.quit()
! |. f; R5 L" w: G3 x. [
return
* T/ _. D: E9 l
) a" ?) t) U9 W7 v4 H" V) R
) X0 O4 C* g+ |, m3 ^5 N) x% A
成功代码:
+ y; A' _# k+ b7 Q
#!/usr/bin/env python
2 ^- b( `" Y8 t8 E) m
# -*- coding: utf-8 -*-
# j6 A/ i5 n. x1 [1 Q9 Q; d9 h
/ O3 R6 W/ _+ Z4 C* y
import smtplib
/ h! t$ G$ d! x' s4 [+ h5 f
from email.mime.multipart import MIMEMultipart
9 `5 _& }! m+ |" h* d5 E
from email.mime.text import MIMEText
2 w" U( s3 P+ @2 \3 K& T
from email.utils import parseaddr
8 }# y$ `: o' c" d+ Q3 k
from email.utils import formataddr
- a$ Z d$ A- N! q9 U; u
from email.header import Header
$ L* j1 G4 _% _9 d- v8 g( R9 U
6 y* F* A$ x. ]9 ~; k
1 T' a R! d. D* W$ P3 a' R, r
def __format_addr__(addr):
! K- R* k8 r* a, |. ?
# 解析邮件地址,以保证邮有别名可以显示
4 H; C1 P$ q3 c* h# M3 g1 R# a
alias_name, addr = parseaddr(addr)
1 y9 a$ w' U0 \% [$ K
# 防止中文问题,进行转码处理,并格式化为str返回
! n: n3 h. v0 O2 c9 M8 ^ v/ v
return formataddr((Header(alias_name,charset="utf-8").encode(),
2 T; |* P6 m2 [7 X" l
addr.encode("uft-8") if isinstance(addr, unicode) else addr))
: ^" Z# W3 z5 G* Z0 k% L2 B- K
$ i8 Y( p9 R2 M% O( B) b+ @( t
4 C( U; G5 D; z, k. w
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
6 l, _2 s0 N3 k8 [7 @9 o
( F3 O; @% K2 S0 k/ U
SERVER = 'mail.***.com'
* a4 N/ r8 C3 E2 z' g* d/ Z
USER = '******'
" e0 u$ `5 c5 s6 l
PASSWD = '***'
f3 p9 {. v2 Y5 G* U1 x
" |: N. K4 Y3 k
strFrom = __format_addr(fromAdd)
. S! ?/ d' h; @8 p6 E
7 q% n0 ~- U: F' i s
strTo = list()
3 H( S# v: U0 m( o0 |0 u
# 原来是一个纯邮箱的list,现在如果是一个["jayzhen<
jayzhen@jz.com
>"]的list给他格式化
; a& |( b3 P8 c8 x% _
try:
/ W, N8 {, w$ j, e9 ?
for a in toAdd:
9 M: d6 G" u o% K
strTo.append(__format_addr(a))
; K1 p. F# Z2 o9 E, Y
except Exception as e:
n! ?+ u4 r$ t& t" c/ e
# 没有对a和toadd进行type判断,出错就直接还原
* F+ z+ K0 T2 q3 ~9 [/ \
strTo = toAdd
& D$ W) C2 z& K4 u
' P' [2 O& o' m+ g2 `% }1 x. r
msgRoot = MIMEMultipart('related')
% I5 u) i& m$ H! F/ E
msgRoot.preamble = 'This is a multi-part message in MIME format.'
5 ?5 Y3 I) ^. Z* P I
1 t: H8 w$ o; _3 [- {; F
msgAlternative = MIMEMultipart('alternative')
! P% I. h% u) E2 J# l% j8 A& @
msgRoot.attach(msgAlternative)
. _ p5 N% k$ Z5 W
5 ]2 ?6 Z6 h* o0 ^9 w/ i- I
# 邮件对象
* G; W Q4 A2 y, b: c' j1 g# e8 r
msgText = MIMEText(html_text, 'html', 'utf-8')
# o. p1 B# O e9 X% l. v# P# `
msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
5 l# J* F/ F" d* _. Y$ G) U6 y
msgRoot['From'] = strFrom # 发件人也是被格式化过的
, s2 k; S2 }) O- s
msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
2 l. J& _$ X3 |6 p! d' K; g
msgAlternative.attach(msgText)
- W' U2 o( R& j- o
/ x2 w6 X6 c# T% @9 N
smtp = smtplib.SMTP(SERVER, 11)
6 a: [) N" R U# j
smtp.set_debuglevel(0)
0 H) E, y, I, D& |( F2 S
# smtp.connect(SERVER)
8 s$ v' B/ X9 t! T0 n& @8 w
smtp.login(USER, PASSWD)
8 H2 C5 ~1 Q) ~) _
# 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
5 m2 I; L; N) [, B" l
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
# g0 I* i6 m7 r! b" {# M" H3 a0 }
smtp.quit()
- ^# b) B/ @9 y2 D6 }
总结:
4 e7 o' `3 t. `$ V2 a. a
0 h! } a, w4 l2 `& {
看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
- o* [5 Q% e+ w; e. H5 |. X
7 ~) _. G. z; @! Q$ A( c2 W- N% r# O. i$ r
实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”
! F, V% j# p! n4 Y4 q l
' q a( C/ l; H2 a/ c. t
同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
% D0 \8 E3 @" K9 j7 w/ E
: D5 Z4 Q2 L( {* Z/ Z
还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
, B/ U- n- a. U" O7 G. n
最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
6 t2 l/ |" ?$ a3 g
8 W: E( K8 \$ d7 E
,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
3 b/ w7 \6 Y3 s
. b& g+ B$ ]7 } \
定时讲解Python技术,分享一些学习的方法和需要留意的小细节
! O4 D C8 ^+ J7 s- y
————————————————
7 i- D- J8 X0 \% ~
原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
' Q, Z. h: J; i; T( A) f8 ~
- M: K1 m6 I" _8 o/ O! ^5 Y+ y
# X! t4 V* z% q: a* z! t
# H8 Q" h2 {4 E
作者:
柠檬草lll
时间:
2020-3-31 11:00
发表回复感谢分享
4 r2 {7 i1 t- Y+ ~
作者:
柠檬草lll
时间:
2020-4-16 22:10
发表回复不错的资源
/ X/ v' s6 Q6 R6 }: D2 |% x
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5