数学建模社区-数学中国
标题:
python发送多人邮件没有展示收件人问题的解决方法
[打印本页]
作者:
杨利霞
时间:
2020-3-30 11:14
标题:
python发送多人邮件没有展示收件人问题的解决方法
python发送多人邮件没有展示收件人问题的解决方法
/ W* Z0 b. y0 _2 l) j
这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
U) ^# a4 p* O9 Q
背景:
. }3 E5 R$ @& F O
1 L; e& K& l- @
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
: W- f& S; x O! m
" r8 R4 J/ X9 d' E! L4 S
问题:
& s9 L7 n, Y1 s& G- ?
9 B( W4 X3 h* }& i4 O
使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
" f0 [8 R& x/ u9 \
& g9 o2 s9 U4 R/ k4 R
问题代码示例:
7 n v# f" \) I. z8 R8 {3 _' X" U2 t1 E
# -*- coding:utf-8 -*-
( E" @2 V% H$ e' p9 ?: B
import smtplib
4 k$ x' A6 @( M
from email.mime.multipart import MIMEMultipart
9 A7 g9 v( j# ~; g. E
from email.mime.text import MIMEText
3 d3 ]' K! _- l, _0 M0 g
# U4 n9 s# V8 D, g- e! a# f
def send_email_to(fromAdd, toAdd, subject, html_text, filename):
+ V$ u+ |4 r ?. V
server = 'mail.****.com'
6 w/ c) a% t( I0 y+ [2 ]$ T8 M
user = '*****'
* {( {9 z1 e$ u; |$ ?( R9 g# k
password = '********'
3 t; {" c, r6 B2 n+ b+ _# K( C
3 ?7 }4 }+ T' A& i) d. w
strFrom = fromAdd
( q0 T) i# P9 B' r7 _
strTo = toAdd
" \8 s6 d8 I% n4 W: g3 a: @% N( f% L
& q" Y8 J2 T% q5 M
msgRoot = MIMEMultipart('related')
* t- t1 R8 y- F4 `
msgRoot['Subject'] = subject
& A e1 Q( J5 o0 O( t1 `+ c
msgRoot.preamble = 'This is a multi-part message in MIME format.'
. d [5 B1 i- w X1 z7 \) E
& @. J4 E$ U' @3 @, _5 x
msgAlternative = MIMEMultipart('alternative')
: B9 H2 Z* ^+ @6 W# _
msgRoot.attach(msgAlternative)
1 Q4 |/ _% j- {- {2 G) q
0 w) M1 Y% B* I3 S' t+ N) o" H5 ~
msgText = MIMEText(html_text, 'html', 'utf-8')
I6 ?$ h% n; m- s y
msgAlternative.attach(msgText)
/ |# E$ M Q& X0 r; e) P7 a# C* p
; ^) G& v* h0 o
smtp = smtplib.SMTP()
% a) B& @+ s: G
smtp.connect(server)
) [& n B/ a( l9 C
smtp.login(user, passwd)
- Z9 t# R, B; w1 O$ ]! A; O
9 L3 {! ]( c/ |8 ~4 O& A5 s6 v
att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
2 [8 w/ j( F4 l* n" i' S8 e) v
att5["Content-Type"] = 'application/octet-stream'
# R7 V5 _9 R; [8 Y
att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
, D7 y* Y0 b k2 i6 r
msgRoot.attach(att5)
3 Q% M+ x+ A, a" _- f5 ]
: h1 y; N9 t4 B L) _( E
smtp.sendmail(strFrom, strTo, msgRoot.as_string())
5 ~: T% r y/ E6 B" i& N- m2 @
smtp.quit()
$ e' U0 O1 y( U I; r
return
9 H9 B. [ j5 E2 l
% X3 }- y6 Z5 Q8 g K$ p! _
% `% x4 H7 j8 J: G9 g$ Q1 p# w! |; g
成功代码:
, ]' {7 [' M0 I. o4 W
#!/usr/bin/env python
. v7 R( H8 p1 s7 k" q8 I; T
# -*- coding: utf-8 -*-
$ ^3 L* E0 z- x
: e) Q0 _. h# p' }# |' ^; j
import smtplib
" c5 A: T6 ?7 R
from email.mime.multipart import MIMEMultipart
2 ?( h* Y1 r# u
from email.mime.text import MIMEText
2 N) o% o6 M5 K! C0 e, A
from email.utils import parseaddr
d, Y; x6 E6 o3 Y
from email.utils import formataddr
9 A, [4 Y- ~% h7 @7 A+ Z9 t
from email.header import Header
$ M3 `1 C. ?# p$ y4 |3 ]3 [
. u* s) t l2 ?+ k5 s
/ ^3 W* U7 p9 s3 {9 f+ a8 u
def __format_addr__(addr):
7 o7 A K1 I( _3 h
# 解析邮件地址,以保证邮有别名可以显示
. b2 m) k" L: n
alias_name, addr = parseaddr(addr)
6 v8 D% S" m' p2 d9 Y: p
# 防止中文问题,进行转码处理,并格式化为str返回
: l- J2 `' H" q
return formataddr((Header(alias_name,charset="utf-8").encode(),
% c+ n/ ?1 C! |) u6 m ?
addr.encode("uft-8") if isinstance(addr, unicode) else addr))
) ]9 _8 o% j- V& R7 J% S
' S/ T& a: r$ B/ g8 ]1 u( V
$ E: q4 I+ v3 s9 u& r4 q. c' B
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
2 L8 Y* a4 W" r' H' J
) H6 j; R; Z* M' A
SERVER = 'mail.***.com'
+ h$ y: X/ W6 o8 q6 X4 a" E
USER = '******'
6 s8 n' e9 S; Q
PASSWD = '***'
2 v8 b5 J% X8 R8 n
8 T& j7 T0 o# N* e+ ?
strFrom = __format_addr(fromAdd)
+ f$ c6 m) V% ]" t$ K/ b- h
5 \+ d3 V; q. P
strTo = list()
- O5 u" D: X1 i* C
# 原来是一个纯邮箱的list,现在如果是一个["jayzhen<
jayzhen@jz.com
>"]的list给他格式化
5 x- X3 a) [3 l2 e* u, z
try:
$ D0 g* o& J$ }
for a in toAdd:
+ ?- G( ]4 F M9 ^
strTo.append(__format_addr(a))
0 r4 ^3 q& G j: X4 b6 J+ N
except Exception as e:
- E# \. q1 I/ d, N$ i
# 没有对a和toadd进行type判断,出错就直接还原
% ]2 n. k3 D- y: l+ z, l
strTo = toAdd
U' K O4 L! ^# \" K6 K) U: t
" W* o0 c* Q9 T! G6 V/ a2 p
msgRoot = MIMEMultipart('related')
( r( T$ ^5 s0 s6 ?; ]. H
msgRoot.preamble = 'This is a multi-part message in MIME format.'
- R& J, r9 n* x- [
0 b, B, }& f( c# V- {2 P4 a
msgAlternative = MIMEMultipart('alternative')
4 K% D9 L. L0 h# s5 m
msgRoot.attach(msgAlternative)
. T0 u, e4 Z$ x
. x. T8 X/ l4 B3 C2 e# E Y3 K
# 邮件对象
" a9 L: n* A8 G' `7 U
msgText = MIMEText(html_text, 'html', 'utf-8')
% H5 s& l: D1 y% t$ m5 v
msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
8 ]+ S( D( l; t- t( o# @
msgRoot['From'] = strFrom # 发件人也是被格式化过的
) O' o6 l1 M% v8 o( D: F
msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
+ Q" {8 ]/ d) s/ \/ I$ n
msgAlternative.attach(msgText)
, X2 \) x0 d& h4 K k4 q
' g4 t9 v- Y( p4 f' N/ t
smtp = smtplib.SMTP(SERVER, 11)
/ ]& Z" X: x% L( z1 M4 r2 h* Z9 q
smtp.set_debuglevel(0)
& C/ q: w) U( |# ]
# smtp.connect(SERVER)
4 m& j/ h) T; ~' a8 m5 q
smtp.login(USER, PASSWD)
, } L t# w. m) y3 U
# 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
5 |; v: T7 {% C* G/ l, a1 y2 ~) m
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
) ?8 n5 L; }% E8 G$ w& T# S
smtp.quit()
3 Y1 r5 P! U' h* P# [, P
总结:
/ z+ A- w& K1 ^/ q: l4 }
+ n8 M" y) b1 r2 j- _
看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
$ G3 c/ O! B) W' M1 {2 a
0 F: f y( W- B. t7 F5 N, y a/ F
实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”
0 N; z ~- O0 `. y
* F. |4 M8 ]; j9 |! R, Y9 j
同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
# z g8 U4 k- \+ Z1 A2 M U- }0 l2 E! c
5 y4 `; P: A% \2 g: O
还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
) O; A- h: o- [! D# ?" N
最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
4 F% K2 @! I. ?& i/ \
& ~+ [, |9 P# i) _- E
,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
& U, o4 O. Y1 \$ ~& C4 L
# u9 i+ c" y- I* i
定时讲解Python技术,分享一些学习的方法和需要留意的小细节
8 d& q, x C" W6 B, b, Y; [. _
————————————————
& i8 p# R1 D# n T
原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
1 W5 M9 ~9 E V; a* e
% X, L! Q6 \' o
( d) o, h' {8 w- {7 V' \3 ?
4 H! L' P# r7 n$ J' f0 {8 P
作者:
柠檬草lll
时间:
2020-3-31 11:00
发表回复感谢分享
}+ w7 w' h9 K/ B+ N+ {6 u% h7 |
作者:
柠檬草lll
时间:
2020-4-16 22:10
发表回复不错的资源
# ?) C- T. m# l$ r% v! {
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5