在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 563383 点 威望 12 点 阅读权限 255 积分 174238 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
python发送多人邮件没有展示收件人问题的解决方法 4 ^2 c! ^& F7 I
这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下; ?4 M5 I+ a0 x. l9 q f' l
背景:5 J) ^/ L, g t' l. w
, ?4 m% y1 ^% W9 o8 X 工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人8 a: N$ k+ V6 _; [1 j* M2 {) X
/ @- v% G2 I. `% H, _2 U5 \ 问题:
: o& F( ^, Y& ^& l2 i+ x/ t @ & a8 J9 v1 T. q4 s
使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
" B. i$ s- i; x7 o I6 G+ i3 Q
2 {0 I! E4 a0 q! z1 J* ` 问题代码示例:4 r9 ^3 H3 G, s8 U. {: ?
# -*- coding:utf-8 -*-/ P1 [! d& E+ U2 ]/ h" X+ {% h
import smtplib* z" i( d* s- @, d% `
from email.mime.multipart import MIMEMultipart
: f1 Y7 k; g2 Y, N" A8 ? from email.mime.text import MIMEText
- E9 s0 z" [! M8 @; e
4 I% J9 I/ X/ v- J% e/ l, ? def send_email_to(fromAdd, toAdd, subject, html_text, filename):
" Y2 g9 s: y0 p2 F, T+ R server = 'mail.****.com'" U8 s/ b: C$ ?7 n
user = '*****'+ q" P4 z; S9 B' I: F0 w% d0 f J6 k
password = '********'+ e: B. `" H+ d1 r/ n% t
4 m# P( a' t% T0 Q/ h) z% n
strFrom = fromAdd* b4 Z7 t E0 K
strTo = toAdd
. _& D! _' @$ t& m0 n% v
2 f2 i6 C3 G: v- a. \ msgRoot = MIMEMultipart('related')8 c5 f+ D3 N) |6 s# [
msgRoot['Subject'] = subject
' |. ^; E# J; k4 v" U9 M% J msgRoot.preamble = 'This is a multi-part message in MIME format.'/ H% T3 d0 N+ _/ H/ O. K
# g) I* l: b" G* D( Y( c* B" T" b
msgAlternative = MIMEMultipart('alternative')
. [0 z' p- {0 S msgRoot.attach(msgAlternative)' `! _6 f6 c7 m: V5 E
7 i% B, k7 a! M' R$ O4 | msgText = MIMEText(html_text, 'html', 'utf-8')
( @& C# O5 O$ G1 _( X$ Y3 j msgAlternative.attach(msgText)
* P- u& A) i! i7 x# @ ; q1 b+ N' A+ |& W6 H6 c8 P
smtp = smtplib.SMTP()
/ Y9 m% D9 P& u smtp.connect(server)
0 P: j9 S+ j" u8 H2 K- N smtp.login(user, passwd)
: O0 O, |: R1 ]9 ?
$ n" t q9 z/ P, X att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')6 T1 H9 c/ X1 {; l4 l/ { h. ~
att5["Content-Type"] = 'application/octet-stream'
; J4 W9 g: ]6 E$ e) V' l att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
( N+ N- F, N0 o# z' o/ y msgRoot.attach(att5)1 v; Z% x' n* M' W% P
8 r/ u s! A2 P5 l* [" }6 I smtp.sendmail(strFrom, strTo, msgRoot.as_string())2 k, h' C1 _6 h# T1 ]
smtp.quit()
& V1 _5 a$ _0 u D return z0 l7 N6 y% t9 Z2 }! d# \
3 o1 F9 m: n/ ?( M" W1 q
+ e W0 c7 L& E" Z3 W8 q3 l+ x 成功代码:5 Q9 R! b6 F+ O* D6 i2 }3 A! k* _5 b
#!/usr/bin/env python. W& a% \0 S; S, Q1 U2 ~
# -*- coding: utf-8 -*-
3 r: P) p$ k% k/ K; g2 e1 y* }" ^
& a4 D1 E7 ]4 }" @+ o import smtplib4 [" O8 z' S- }+ N
from email.mime.multipart import MIMEMultipart
3 ]& C' R: k3 S/ I1 b4 e from email.mime.text import MIMEText
3 `3 ^- S8 u0 }0 U from email.utils import parseaddr
3 i# @4 [6 m, p from email.utils import formataddr" b) A% w) l' F' W! I) L
from email.header import Header6 E1 ~" {/ ~$ l# L. m
* {, w& O- J7 d0 z7 u
) q& g; x3 G7 ^; u x6 l$ m; h; H def __format_addr__(addr):
1 Y' w9 R) T+ e # 解析邮件地址,以保证邮有别名可以显示7 y0 m2 v! g! g* _( J, N
alias_name, addr = parseaddr(addr)
0 u, J4 I+ \+ h, V! b: t7 I6 Z # 防止中文问题,进行转码处理,并格式化为str返回( Z; r7 Q% a" G! G4 d% b! m
return formataddr((Header(alias_name,charset="utf-8").encode(),1 ~+ ]. I. Z1 q. G& K
addr.encode("uft-8") if isinstance(addr, unicode) else addr))
: X+ _/ \& P1 r( m& e4 Z3 X & j+ l8 i N/ l, Y3 s
5 R( r$ v( s( @6 d1 a/ ]
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None): ~, u3 b: M. y6 v/ ^. R. n) M0 T' j
4 A* s& w3 g: p* J9 A1 X
SERVER = 'mail.***.com'
' J* k2 C3 n5 U. v" C; _ USER = '******'
+ P9 ]; L* j1 c9 a, S$ e& G9 g PASSWD = '***'
, U/ }. U: R9 G; [. j& W5 f3 }
& u( l" b9 D7 S0 b u/ L, ? strFrom = __format_addr(fromAdd)
5 |. C* ~9 t' O# F; L6 f; I 9 s* a0 r3 v- a+ W* a' L' S, @
strTo = list()# ^; F' t# |* N6 I
# 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com >"]的list给他格式化9 k2 O+ j4 P( h" R' I+ t
try:7 Z3 ], I- \% _2 j. g9 W. u
for a in toAdd:
( w) D1 t& \% y) m strTo.append(__format_addr(a)); b6 K: ^# ~# d4 M: i4 B- P. C4 _
except Exception as e:! v' @: n+ ?1 Z3 [- A4 r& ]
# 没有对a和toadd进行type判断,出错就直接还原
E" j. D) l/ A3 E4 i; v( x strTo = toAdd
' V' {& M1 w- r# x& } / W/ C( Y/ H+ z: C
msgRoot = MIMEMultipart('related')
7 L$ q" N( o" u9 l1 ` m8 c C) x ?3 } u; x msgRoot.preamble = 'This is a multi-part message in MIME format.'
) u7 G6 k R- |9 U& \7 p- V/ s6 U
/ Q' j4 D, s$ w& r( }; W msgAlternative = MIMEMultipart('alternative')$ N6 g2 `- O3 |! ~& n1 J
msgRoot.attach(msgAlternative)
: d& D! d6 k8 I' \ ( @9 o: `& [9 A6 V
# 邮件对象 - t1 m0 ~; x2 A$ f
msgText = MIMEText(html_text, 'html', 'utf-8')
1 L: S9 x* R+ {8 C; G msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化/ k- M4 O- f' ^$ r. a
msgRoot['From'] = strFrom # 发件人也是被格式化过的) p& D; N7 a; E% ?+ n' n
msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”, o& {8 u# A) Q
msgAlternative.attach(msgText)
5 r6 D* P9 L* P4 Z, [8 g : g9 r" J& ]8 a; ~
smtp = smtplib.SMTP(SERVER, 11): v. g% f7 y8 Q% E6 l, B9 z: d! \7 O
smtp.set_debuglevel(0)
" q0 y$ I+ m y* d # smtp.connect(SERVER)
5 p: [8 [. i0 u2 q. E c9 | smtp.login(USER, PASSWD)
. C% F7 Y! T2 {* w& [ # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
, \9 }) u: J/ y: X0 H- S+ ~; I' s smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
4 u3 N2 Y& _9 p6 L3 Q) B smtp.quit()/ W( l& V) b h+ w! o! l, w: Q
总结:
, e$ p# w, k" S0 I' A' w* M5 r5 U/ t
# g* ^- w: S9 C1 w 看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
& s' a, m' h o% v0 A , n, q4 J8 B# Z+ U6 o
实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”
! y1 n" v0 W" E! P# h
F G4 B+ L7 z% V! e# V; V/ m 同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型 {" G+ N" g" }9 Q
& \0 `$ J: l' q; U; e @ 还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
& ~2 ^1 T6 H+ Q" H2 x3 ~% F 最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得, g" n; ]8 V' {. T, w+ z/ A" U
+ g/ {$ z5 G9 g3 ]* B
,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员" Q/ x" }6 i" K" J8 Z. Z% u0 h! |: H
/ e, n9 a: o$ G
定时讲解Python技术,分享一些学习的方法和需要留意的小细节
& P- K y: \0 `$ d9 [ ————————————————( G* L2 J% ~% ~/ i
原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
! W2 V3 W' f( @. r$ A. {
* T% t" \9 e$ L6 g& l
. _3 q. R7 i& H; s& s9 h& k , [; Q% z1 _! P; S
zan