- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 558551 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172938
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python发送多人邮件没有展示收件人问题的解决方法 x( E5 b/ z8 u. d' t. U2 Q
这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下$ W: Y3 E' }5 ?" c5 o
背景:2 t- l5 U7 g$ j; n! o
% K" Q- a/ [, m& n8 Z9 p
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
- O4 G5 R8 U% Z: L6 W* g, T' b5 }) x# l: P+ q. S' K- f; Y6 L: {3 b
问题:
, U0 l1 e# a. R$ f5 \
/ }. a) L- a6 G. g使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容. i' _, z' g9 t$ o+ u& D2 d
7 ?* B/ S2 i* O5 O" B问题代码示例:
6 t: C% U; Q$ [: t; X/ _% p# -*- coding:utf-8 -*-
5 a* g: T( ~3 q, \import smtplib
& q5 g% f, N, }" d9 sfrom email.mime.multipart import MIMEMultipart! e7 ]$ B- j% S
from email.mime.text import MIMEText
. z, N/ _* p; Y2 w: n6 d' O7 q) i. F" T
, _, F) {5 J# i, A$ ^1 Jdef send_email_to(fromAdd, toAdd, subject, html_text, filename):9 Y- }4 X. b6 R
server = 'mail.****.com'
6 X) {. }, S! d$ }0 ` user = '*****'8 e2 ] {$ h' e* `# O" B: O
password = '********'* t( e7 ?' k7 W) ?: T
k2 F, h. y% g2 j) z- _
strFrom = fromAdd, o% l2 r0 q& Y6 _
strTo = toAdd5 q. q, d( a& N* L
5 e) ~ i3 w& C2 O$ ^ msgRoot = MIMEMultipart('related')
" n( g* z- _! g8 G% o msgRoot['Subject'] = subject" E; d. ]$ I! s* i$ i
msgRoot.preamble = 'This is a multi-part message in MIME format.'
@2 b* S2 s+ x9 ^! t: P* L% A) K \
msgAlternative = MIMEMultipart('alternative')' s, o; g7 X f: ?; u
msgRoot.attach(msgAlternative)
; ~( S/ R) M% {( V* ? U& u' d+ e Q- @: Y& p% o
msgText = MIMEText(html_text, 'html', 'utf-8'); ^3 ~% }3 n6 z* `. S$ D1 B3 [4 U
msgAlternative.attach(msgText)
! J5 ?/ J2 ?- i+ r. u: j$ `! B' j, k4 C. S0 r* C2 J! T- I
smtp = smtplib.SMTP()
0 ^3 i# J+ z6 t0 D smtp.connect(server)6 U& @8 o* S* @, Y Y6 [" T5 N
smtp.login(user, passwd)7 O9 G! _, x: z8 e& E
( f) J( N5 f% l2 a3 f( ~+ T; s& Q
att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
& a0 f( {. U- I* A j% q att5["Content-Type"] = 'application/octet-stream'% o" P) ~3 K: S$ \8 S
att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'. `( [* u" Z5 [1 i5 j3 \9 W' r
msgRoot.attach(att5)! i$ d+ m3 u) m
d0 |& n, O6 D. \$ L# I smtp.sendmail(strFrom, strTo, msgRoot.as_string())
+ o- X9 T$ A0 g& t smtp.quit()' m+ z1 L# j$ ]8 o; |. q
return/ [. V5 X5 R( ]( U9 U
/ u! M, r |: K
. b- I4 H4 j" F) K; I4 T成功代码:
: c* V( v9 Y9 l3 U! b; X. {#!/usr/bin/env python
/ R. N# |4 J& s o' P+ Y# -*- coding: utf-8 -*-1 r+ h' S5 D& f4 a) w; ]
4 z2 |) i* F6 Himport smtplib7 i% o* i" ^9 D* ?
from email.mime.multipart import MIMEMultipart# j) T! g" M7 z. _* s
from email.mime.text import MIMEText
0 b* ^5 e. j# f; pfrom email.utils import parseaddr
! A0 B. E% Q }; V! Q0 j9 k. _from email.utils import formataddr
' V* i$ m( F5 Vfrom email.header import Header! t0 G( E5 f& i' r7 h7 } g/ ^
3 X8 C% X; g3 B- C3 [( n3 T
6 Y. |5 u7 ]( P: {; D& Tdef __format_addr__(addr):6 r2 s- E+ u/ T3 z% ^$ @( ]! [
# 解析邮件地址,以保证邮有别名可以显示7 V' P! I1 F9 s
alias_name, addr = parseaddr(addr)
, K( `3 q. u: U6 o4 e$ b7 R' H # 防止中文问题,进行转码处理,并格式化为str返回
6 {( i# T3 E& P! m return formataddr((Header(alias_name,charset="utf-8").encode(),
- c* u2 |" e$ R6 _& Y addr.encode("uft-8") if isinstance(addr, unicode) else addr))
. \, ~4 @3 |- z8 P" m# k1 n3 ^2 p! Q0 n2 Z9 X
7 r1 `3 T, M+ J* Q& Idef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):6 g4 V4 q( e8 k$ q" H2 t0 @
/ A( i' @/ b" h" P2 M& a SERVER = 'mail.***.com'
. D4 d( w ]6 z. x USER = '******'! ]% c. `+ D& ]8 s
PASSWD = '***'" ]$ _. F9 U4 l K8 j- S* J0 F" c
# H, K! j7 G5 l3 v8 ] strFrom = __format_addr(fromAdd)* i8 Z: D% Y$ a
( F0 l3 a2 ]$ M: k0 g8 c strTo = list()8 S8 V; g2 t! w% ]2 ^5 \5 w
# 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
+ m1 p% t( b: m! O# o# @7 R try:
; v! `6 l5 k, }4 ~ A for a in toAdd:+ b3 A; Q& O: [8 O! G( @
strTo.append(__format_addr(a))2 X8 |% ^ i$ ^" D4 a2 T) o! l
except Exception as e:
/ O' o% I7 C/ H9 P# M # 没有对a和toadd进行type判断,出错就直接还原) @- j4 x3 S! T7 Z
strTo = toAdd% e9 ?4 G. N" Y! s9 b
5 k% h+ @" E3 S7 t o msgRoot = MIMEMultipart('related')
9 k& T+ ~, q' d8 ` S msgRoot.preamble = 'This is a multi-part message in MIME format.'8 D* i5 N5 b" {4 ` L
( |7 i+ Q4 e. m) P( G& [
msgAlternative = MIMEMultipart('alternative')
# v8 n' q. S* W msgRoot.attach(msgAlternative)
' q( @1 c5 Q) O& m7 v8 N
, k$ l# J# Y5 B7 P5 e # 邮件对象 ; q, i+ |0 b9 @0 t
msgText = MIMEText(html_text, 'html', 'utf-8'). M# K$ e* W! Z& E% \
msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
; x; F; @7 ]7 |& Y msgRoot['From'] = strFrom # 发件人也是被格式化过的
/ @# S; U" A4 d" q1 |# S) r% y- B msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”0 C1 q3 Q2 Z/ ?1 u) V* C9 R
msgAlternative.attach(msgText)& D( m; |' F+ c, R
! ^4 J% _3 p( A3 E/ G smtp = smtplib.SMTP(SERVER, 11)1 N: {. ~2 O% P- G" _( G" z
smtp.set_debuglevel(0)2 x/ S8 p4 ^, n0 p7 P1 R8 m7 P
# smtp.connect(SERVER)
: v2 y. ~" l& Q S# [9 U: `0 V+ d smtp.login(USER, PASSWD)
M M: Y' e) _. r1 t% H0 g # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别. A' V3 g3 M4 f9 y. M# O
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())4 S' A9 J% @! g9 w
smtp.quit()
) X3 D9 Z* P/ P/ N; ]: ~7 [总结:
7 K1 @0 c" ?3 Z2 q% J5 B6 J, t6 x% C: p: ]' H5 c( D
看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
5 Z& ^/ H( u$ J$ g& t& q6 K( q0 Y# s# o9 R6 K- Q8 d
实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”
$ U( F) s' }6 G$ R* v. T
8 U/ ~% H- F: v# O$ y, ?- \同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型7 B! W& ^4 s H, q
2 I% p+ Z! j# [& q2 d& J) O( b' c还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
f- B( c+ `" |: K5 \5 A最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
/ M& f' b/ v8 P4 r9 C- u7 f' M- s8 C& E8 d9 [2 [* H$ a
,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
4 C! b2 `+ d/ p/ Y% d7 q
4 v" c4 ^6 @ x7 R3 [定时讲解Python技术,分享一些学习的方法和需要留意的小细节
1 J& J5 B# U2 c2 F1 D# d. I————————————————
8 _9 B0 J+ c! L8 v6 Z4 m原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
& W0 v6 n W! R2 v4 }8 q2 S5 C& C
$ Z4 ?2 G9 n+ Y5 g/ m2 D
9 w- }6 G, R, X9 t4 T' W0 l. r7 f% ?3 h: a' @! P( d
|
zan
|