在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 564574 点 威望 12 点 阅读权限 255 积分 174595 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
python发送多人邮件没有展示收件人问题的解决方法 - t! N% `* J. m1 G5 V" b
这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下- I: X- S7 e# Y/ y3 U9 b. D
背景: t1 W: ?3 S- X* n
6 f( i8 L' M7 ~* g$ l; P
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人3 x: Y/ o: p F; ?- |9 E. K
$ B% D9 m8 Y- X! K; y* Y3 C/ Z$ f 问题:
2 O( }, c: C2 [3 h6 L
2 C' o) |$ o) y1 ~5 n1 K 使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容' ^% H) B$ P+ M7 M. [* n2 s l7 ^
* d7 W) K# w l# E0 O3 O
问题代码示例:. @* D; D* s1 T- J( W. F
# -*- coding:utf-8 -*-" c& t1 t& n$ u# ~
import smtplib
: X ]4 I( K6 Y: V$ C from email.mime.multipart import MIMEMultipart
5 {. I1 X; t+ A, ] from email.mime.text import MIMEText
$ ~, t( N0 D) _6 V, A+ h + q7 V: ~7 G4 t; P
def send_email_to(fromAdd, toAdd, subject, html_text, filename):7 D! G' l5 @/ F: U' C# k8 g
server = 'mail.****.com'
) R5 f" c7 R! q/ m5 r8 H; M5 ? user = '*****'4 F3 i6 r# e+ R7 |
password = '********'2 n" O: l- ]: \- d7 e \
$ w/ t6 o$ G# p( p strFrom = fromAdd
1 g3 {5 r T6 @# D! M strTo = toAdd
' \) D7 T! s( |+ {. b( o/ R: U / F; w+ G/ h- i! |9 F
msgRoot = MIMEMultipart('related')
9 `( T* {( J' X x4 w3 o$ W msgRoot['Subject'] = subject
- @9 [1 P7 Q& C5 k J msgRoot.preamble = 'This is a multi-part message in MIME format.'; o- f, ?1 r; ]- s$ _: h+ ?- @
* A- A5 u2 D- F) q+ N& p3 ^" ~# y
msgAlternative = MIMEMultipart('alternative'): o& k7 A1 \9 J% r& v
msgRoot.attach(msgAlternative)" i- d* X; N5 ~
9 W/ o) Y, t$ H: j, C# d
msgText = MIMEText(html_text, 'html', 'utf-8')+ L3 W+ M0 @. P( p: M$ ^# D# u
msgAlternative.attach(msgText)1 d; V; S; b' \
2 i( n" C( t; s0 a1 h' o, H* s X smtp = smtplib.SMTP()/ ^$ j1 C4 b; E) [
smtp.connect(server)5 ]4 V1 Z' K+ r# j' H
smtp.login(user, passwd)/ c7 u u( B2 I; l' [5 b. {/ S
* D% ]8 i: J W
att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
; o8 B; x6 U0 Q) ^3 M* ~+ X* ~ att5["Content-Type"] = 'application/octet-stream'$ `7 g9 D9 |* s
att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
0 `- C/ M& l9 Z6 j# n4 V msgRoot.attach(att5)
8 c2 L9 u: ]% H5 M- ^4 J
# a7 p$ l, h6 W/ R$ k2 Y smtp.sendmail(strFrom, strTo, msgRoot.as_string())
( K3 _3 K) q7 h( E smtp.quit()
/ c8 @& V; B2 N. L. `: `. t/ f1 h; Q; X return
4 x+ c5 `+ q8 r6 s : b. I6 C6 F0 u, q# s: [" _& e
' @1 x; F+ \7 T8 w 成功代码:+ M) d, @8 P" a) G8 d. `' n$ S
#!/usr/bin/env python
* B0 Q6 t1 p% W- Z # -*- coding: utf-8 -*-
$ S, J( q7 H# ~) z3 B" i; m 8 I! S/ @# g; w; a6 U. }
import smtplib- H" g' q+ C* h- q9 H
from email.mime.multipart import MIMEMultipart$ R3 d6 p4 n. F) l0 r5 v
from email.mime.text import MIMEText
t+ O; |9 b B ~, M from email.utils import parseaddr/ b4 A- Y2 m4 J$ O
from email.utils import formataddr! e6 a* @7 T; J9 }- p( c
from email.header import Header7 w. l' C7 S+ k) k: D8 s o* o! o
# s- ?2 R! X0 ]) o" s. W3 W
) O5 v/ }- j! D4 [+ r. ~# R def __format_addr__(addr):) ~. i7 g1 A8 U% |+ {4 d( I) O
# 解析邮件地址,以保证邮有别名可以显示3 G7 O0 f. p0 p4 b5 ?1 [
alias_name, addr = parseaddr(addr)
, M0 {. }+ ~' R" U7 e" \ # 防止中文问题,进行转码处理,并格式化为str返回+ A9 k1 b, c6 k' w1 K
return formataddr((Header(alias_name,charset="utf-8").encode(),+ y+ ]" \, C; A% i; c% n! p
addr.encode("uft-8") if isinstance(addr, unicode) else addr))
, p" S/ s l5 m
; K! C4 T# d% }2 S# X- e/ x* q
9 `" q% T$ {) n# p+ c0 A Y def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):' \% n$ d% F6 h+ Z, \ `4 |
7 ]4 B- ]4 k) b) a! u$ `0 N# u6 i SERVER = 'mail.***.com'
/ N& U, R; T2 ] USER = '******'& h4 d3 U& N( Z9 m! p: J0 X. s% ?
PASSWD = '***'9 w y2 ]! ^" c1 r) h1 p
- q1 G; q& `, T% e1 \ strFrom = __format_addr(fromAdd)
, R* V" X4 r. O' a/ L- i " `/ z8 S- b" F+ o
strTo = list()$ A* S, h1 M& r) F# D6 _& S
# 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com >"]的list给他格式化- j5 h( N- T4 g" P' T2 \' t
try:
* k' h% z: {0 R: a0 ~$ L1 R6 M for a in toAdd:
& g. {% c2 f5 R) Q% M! j, o# P( a& y strTo.append(__format_addr(a)): [5 a" E( Z1 [+ |
except Exception as e: g7 C" c+ u/ F1 z) f
# 没有对a和toadd进行type判断,出错就直接还原
# T' V+ \6 c- l strTo = toAdd8 l( ^+ H9 e% T1 C3 P. z
, Q2 x1 L+ ^. v! h msgRoot = MIMEMultipart('related')
, r! D2 \! t7 n% B8 ^ msgRoot.preamble = 'This is a multi-part message in MIME format.'
7 h: l/ r" `. c& l4 O
. k( m m9 ]# I- r% B msgAlternative = MIMEMultipart('alternative')5 W5 g/ V5 F8 r0 o2 Z
msgRoot.attach(msgAlternative)
. `9 q" B0 k2 H8 q" y4 o 4 r4 C: Q: G% ]% J2 R
# 邮件对象
# Q+ q; }/ ]+ p' v7 j msgText = MIMEText(html_text, 'html', 'utf-8')
" X0 I7 e( G0 \& |9 a, F( ~4 f msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化( e4 W( g& |+ t: P% G$ v7 C
msgRoot['From'] = strFrom # 发件人也是被格式化过的7 r; X7 h; U+ @0 H
msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”2 d# h; r3 p5 _7 {
msgAlternative.attach(msgText)
: F6 y" |1 p. m3 c+ S
5 d& c2 }0 X; }, D: F smtp = smtplib.SMTP(SERVER, 11)
. `8 b% r0 {( g8 E- z# [ smtp.set_debuglevel(0). L- ] p) R, K. U @' T
# smtp.connect(SERVER)& V# x) X R5 @" o5 h
smtp.login(USER, PASSWD)2 [" K0 L8 w+ A% r# c
# 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
% @0 q, T5 S# N3 P. }# K6 v; p, X smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
( t: t. m3 C- Q3 G# T smtp.quit()0 x, U" p Z4 Q8 u; D
总结:
7 J+ a0 i, A0 o# E, @3 ]5 C4 p ; V7 ~, G* F/ E2 @) V N- j2 M
看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo/ j+ x9 r* o; k L% ~
* ? Q7 y& X6 u: w( S7 r- Y& { 实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”
! C1 a# {2 @; [' u7 a: Q
, L+ j- X5 y% S* E 同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
( E1 z9 Z2 ?; g. K% z- K9 } . X7 P; w3 d. W& S% R5 t& G
还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。' x0 ^( _1 B+ V" P0 o9 v
最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得+ P0 V, s8 Q3 }
$ u: E U- m7 T
,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员- G. X+ E: j6 _- u* F, U5 Q7 b+ }
! q% H0 X: p4 J+ I8 R6 C 定时讲解Python技术,分享一些学习的方法和需要留意的小细节
, i6 v& g+ H0 X2 `+ Z ————————————————5 n& I$ h1 C" ^ W6 S
原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
8 m% Q, m Y% I
% ~2 h3 t5 N5 j) a: y$ k ' M; M$ ]* d, D$ ?7 }. I; ~; B
' D; R# s8 x( O6 t
zan