- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565361 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174831
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python发送多人邮件没有展示收件人问题的解决方法
! S" s4 z# C' h5 H2 Q这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下7 q4 {0 E# \' z0 u( R% _; K
背景:
; c( _ V c2 e9 V' w
4 o8 S" p3 b, N/ ]2 ~工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人4 U T! m. K0 G7 o E
* X8 j$ {6 o3 m问题:; O3 Y8 r3 H H! u7 V* C" u
4 a$ `+ v+ t6 w0 U6 v4 @0 j) {. P使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
" n" T8 g: v% N1 `
% ]% L5 j& b; M) z问题代码示例:
/ J, G2 j& Z3 E# N- E9 `. b6 @# -*- coding:utf-8 -*-
% Y5 a; [( h( o3 d* Mimport smtplib3 Z+ F. H4 x) W! i
from email.mime.multipart import MIMEMultipart
5 e3 E! R" c V7 Ofrom email.mime.text import MIMEText
, Q( W6 V2 s0 S( t5 q. r- k: M- g* D+ i5 K8 o
def send_email_to(fromAdd, toAdd, subject, html_text, filename):8 ~3 ]! s" v" G0 E2 y: T
server = 'mail.****.com'3 Z! o5 B8 j; W, E; S
user = '*****'* T* i1 |! k% r0 c* y c
password = '********'; X/ E: f2 ^& i* n* O
, F+ s9 y- ?* d) v# T! d& `
strFrom = fromAdd
7 ?# @' D, j6 t& T# Y& U) }1 Q4 R strTo = toAdd2 D& J; n" h. _* s8 ~
4 l0 ?; v( N1 w5 V& \' R
msgRoot = MIMEMultipart('related')
: K- r, S! |. m; N) M6 H4 N* ` msgRoot['Subject'] = subject8 i7 C+ }1 x2 o1 x
msgRoot.preamble = 'This is a multi-part message in MIME format.'; Z7 N( F# M" a6 c' q5 l4 }
0 L. G! G6 ^2 Z/ w7 g# C
msgAlternative = MIMEMultipart('alternative')
) z" j3 H# w" \ msgRoot.attach(msgAlternative), E+ t. Y: ]5 l
; `' x) g6 Y& \( J- m; X" M
msgText = MIMEText(html_text, 'html', 'utf-8')" T1 \! q6 f' Z" D9 E5 T
msgAlternative.attach(msgText)
/ I2 n9 u2 f) \: C3 j r& s# K, B
, X$ G4 N$ }( U, \+ A1 _ smtp = smtplib.SMTP()* }- a1 D" ~9 X2 L c5 J& ^
smtp.connect(server)
3 c9 O w! E8 j: ~! g smtp.login(user, passwd)! u$ i* @( m5 i9 l5 J
1 K9 E8 j7 {9 q6 y. E1 |3 r att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
5 N+ p: m7 s$ a+ i( f att5["Content-Type"] = 'application/octet-stream'. q. E" n' a0 ]0 T. X- x# v
att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
! ~% s& h: o# f msgRoot.attach(att5)
+ d# D% p0 @+ U4 C5 Z' e6 I) s' H( @9 }; N/ D
smtp.sendmail(strFrom, strTo, msgRoot.as_string())
6 d/ A2 k' k8 t- z; ^ smtp.quit()
. Q3 {0 n8 F6 n# `" o. `7 \ return
& P k* r1 B9 i2 w6 S6 j* |1 d, v
4 D! }# L# M5 y& [( n: `& g/ X
, \& u/ x( ]. `' q4 @ k1 w/ a; K成功代码:! l: `) Y+ H p8 U7 u( |
#!/usr/bin/env python
) K8 U: m; z8 \* u$ h# -*- coding: utf-8 -*-! n0 {5 m; R4 m
9 ?" T3 q* z9 |' y
import smtplib
8 ~( a; P5 q* j) N# S1 |from email.mime.multipart import MIMEMultipart+ P7 X2 n: x+ S' i6 e2 h: A I9 A3 S
from email.mime.text import MIMEText
/ {& }! Z; ~3 C6 R7 V+ f6 w3 Pfrom email.utils import parseaddr
; h& Q/ `9 O4 }# T: efrom email.utils import formataddr% ?6 a: ~3 d' z Q( d) F
from email.header import Header- Q- _- d. C; J: [, |' C
# z! {) ?( j; ?! k% S4 Z9 H, V/ S! ? P6 d
def __format_addr__(addr):
( d7 Y- b6 L. y6 c# ?# M # 解析邮件地址,以保证邮有别名可以显示
$ b! |" ~$ X, e' f alias_name, addr = parseaddr(addr)
: T' Y \2 }3 ]2 \ # 防止中文问题,进行转码处理,并格式化为str返回5 i+ e1 ~8 b) T0 g
return formataddr((Header(alias_name,charset="utf-8").encode(),
5 M& ~! F# W) g, @2 J' ^1 G addr.encode("uft-8") if isinstance(addr, unicode) else addr))
8 `4 A8 G/ z5 U l: L- C# `: Y+ w2 @- W+ w
% `. [# e' r% ndef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
8 k7 X) Z% B. ?$ {
$ k& a/ t" \ U: J6 G SERVER = 'mail.***.com'
- w# e6 O F: Q USER = '******'* H! x! O3 \$ g) q$ I' c
PASSWD = '***'
) s- e8 M4 q5 ~+ P
) \+ T$ L7 J% ]' s strFrom = __format_addr(fromAdd)1 a+ S! ?# \6 x( G- V& ^
, R/ K& s0 U2 H
strTo = list()4 O \4 p6 I# Z) v7 m
# 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化2 a# ?6 N' v. y, O1 X; w/ V
try:
' l: u# w: L* V( M) i for a in toAdd:# {( i; Y! r% k& E' L5 ^9 v3 g; i
strTo.append(__format_addr(a))* E4 r. O6 L0 g' Q z
except Exception as e:- | r2 P2 @0 X6 t7 y
# 没有对a和toadd进行type判断,出错就直接还原7 J* R) k$ r. J: u( P. ~
strTo = toAdd# J; ?; R6 z' x7 |$ _& m* C
8 X6 X1 Y3 N7 |
msgRoot = MIMEMultipart('related')7 o9 j+ P: {' w" w+ ~
msgRoot.preamble = 'This is a multi-part message in MIME format.'
: I0 I: `4 \) L2 N- v$ D3 F
3 O; _6 x( \' r, C msgAlternative = MIMEMultipart('alternative'); q0 C' b- f9 J7 W
msgRoot.attach(msgAlternative)
" @6 X* q+ F; T; h7 Q" S" B: ]! [6 n) n' T
# 邮件对象 & {9 ~0 l9 @- N
msgText = MIMEText(html_text, 'html', 'utf-8')% T/ r( _3 w o; P
msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化/ H' A6 \! t/ V T9 n
msgRoot['From'] = strFrom # 发件人也是被格式化过的
3 [8 X' ?7 C" o" A' g8 G msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
$ \* f! n V k1 f msgAlternative.attach(msgText)
1 f; x5 l; J8 ^+ k8 i* Z1 [
$ [/ G0 {( z3 C% d smtp = smtplib.SMTP(SERVER, 11)2 u B) a! T, G+ T: M
smtp.set_debuglevel(0)
1 r1 O# l6 @- m% n. Y1 A # smtp.connect(SERVER)5 q9 y% r# j# o4 i. p- ^
smtp.login(USER, PASSWD)
' ?& y* s# g: i6 U( U. T: k, O% `" m # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
( l' J* ]1 }! _+ S6 F- Z smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
! F; E/ T8 f* j* T smtp.quit()
) Y H# l. t- @总结:
) ~4 d: r6 s% h3 H% J( k3 |2 @
0 Z' T% [# T$ b" f F( d看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
# H& I! X" b9 B& k
6 N8 K9 t! `0 p) i实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”0 \: s% R7 _3 V2 D+ P* Z/ `0 ?
5 w$ a+ U. @' J$ ^
同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型8 }# i/ E5 `/ M' `3 A, y9 `
3 {. d: l- D, {9 F还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。7 |5 h) a4 F4 ^: r$ B, g! a% ~
最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得( T# G4 {& J4 z
. ?8 A$ p6 S# H* v/ p,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员; v; d8 L c3 {) W
6 i; R! L: q; ]! I+ D( h* E5 H
定时讲解Python技术,分享一些学习的方法和需要留意的小细节& \0 o" J' c& w# t
————————————————$ U' t7 E2 T" {# w! X
原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
; v; E! T5 _ X6 V) s- }
" s* B$ ^ l- S/ A. ^5 x+ v9 r$ a6 {
! [+ V) ~0 L% C$ d! W/ l) R |
zan
|