python发邮件不出原因_python发送多人邮件没有展示收件人问题的解决方法

python发送多人邮件没有展示收件人问题的解决方法

! G+ O4 q: \# R: |这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下' |$ ]! r, v9 A; Q* I% _, p# i- ~

背景:

! E2 ~% @- o1 h7 B9 f) ?# ~

% Q% L8 k: j* z! E( l工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人& q/ M; m0 U' e1 a7 x% N

' V, {5 S& s, p问题:

6 z  z: ^6 w; T0 N* l& t. C2 E) [$ E

使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容* C) s/ B, ?1 Q+ V! `3 T' H+ m

: T6 E9 `! k* g  B  M1 L% U

问题代码示例:4 d: G7 e5 e4 ?1 @& z

# -*- coding:utf-8 -*-

/ R4 U/ G* V& b6 [' Vimport smtplib) l; b: p# d" e+ h) ~

from email.mime.multipart import MIMEMultipart0 T+ O: _  u, w& q4 @( D

from email.mime.text import MIMEText

$ b% ~/ R, U0 o3 \2 g

9 O3 @' p5 ?6 Kdef send_email_to(fromAdd, toAdd, subject, html_text, filename):" O' I! Z, e0 d! u- B' W8 }4 M

server = 'mail.****.com'

' q4 _6 v( J* S8 y3 D user = '*****'. _& ]" O" R4 E2 U) Y8 G3 r

password = '********'- ~4 ^$ o5 Z' E8 l. Y4 Y/ `$ x0 ?

8 Y: L4 ~% f, w

strFrom = fromAdd) R8 c+ N2 l, U1 r

strTo = toAdd

0 T" {( F' I% l/ E" @- f

. m0 B# e" }" T# j$ q msgRoot = MIMEMultipart('related')& B& U1 w& v4 z

msgRoot['Subject'] = subject

4 O2 B) l: t2 j# y7 a6 e% u msgRoot.preamble = 'This is a multi-part message in MIME format.'' F* C3 n1 P8 P/ @7 z/ |' B

! E/ [+ Z+ M0 \! h1 l5 ]/ l% i% h- A; M msgAlternative = MIMEMultipart('alternative')9 q& i- S. ~8 @* @

msgRoot.attach(msgAlternative)* c8 d; \1 S2 M. c0 z- n

( N1 b! N8 t. {% X# z3 F" A msgText = MIMEText(html_text, 'html', 'utf-8')

7 b; s( @& n- y( h( W2 B; S, S msgAlternative.attach(msgText)

, k. ]# f: A  z+ x  |- _" C5 ~* ]% n6 ]/ h- |  l: }+ j+ y7 \

smtp = smtplib.SMTP()

$ |% `+ X$ x' l; E3 u. V! u: ` smtp.connect(server)

, Q) v: P" C8 A7 a smtp.login(user, passwd)

" k8 Y, }) D+ y" ?  }' E; X

9 \" h& x% g' S' R" Q" l6 D9 o3 w att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')5 X. g& L- n6 C* J* O

att5["Content-Type"] = 'application/octet-stream': T0 G0 V8 Y# J5 ^5 h# V: B+ a5 `

att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'

$ k6 ^! I7 |: O2 M& W7 J$ H" c msgRoot.attach(att5)

- F1 _; _2 V+ r" ]1 @% x( l( Z0 R, \$ m' `

smtp.sendmail(strFrom, strTo, msgRoot.as_string())" ^" S8 [7 M' u1 @9 B/ {) h8 x

smtp.quit()$ s- T6 }* d% V7 ?4 R

return% {6 t- P, k8 ^# S7 O3 X

: L' @9 {2 C# N* T. B1 z! L0 j

) Q- F' J( G# r& j成功代码:G! W. ?( `: X! Y6 e

#!/usr/bin/env python

; K7 n% i- f! S7 M# -*- coding: utf-8 -*-1 k8 ~5 F' N) H3 y- l7 a

0 \2 a% d. z- W; G5 h' _1 m1 Ximport smtplib

* Z; @+ @" @# R# t) q' @from email.mime.multipart import MIMEMultipart, b: a! C( q% ~- n4 }9 V' k

from email.mime.text import MIMEText

( f) J( Q/ C+ vfrom email.utils import parseaddr

: W6 D& _1 Q! G& ffrom email.utils import formataddr

8 R1 s" c+ \7 x) \) P( \+ {from email.header import Header( c4 d' I' F' Z8 ]

8 @& b; H7 [( d% L& ?6 g9 R

; E* s- I: `8 ]( Rdef __format_addr__(addr):

: f' s8 j8 Q# P/ F5 l$ m& l( d # 解析邮件地址,以保证邮有别名可以显示8 i8 A- n2 g0 H! k' Q

alias_name, addr = parseaddr(addr), n  h3 i' \6 ^& {# }, \

# 防止中文问题,进行转码处理,并格式化为str返回0 p3 J5 y% `2 o

return formataddr((Header(alias_name,charset="utf-8").encode(),

% K1 p6 n8 W' p9 ^2 W# x: B: x; v      addr.encode("uft-8") if isinstance(addr, unicode) else addr))

' g$ d$ t+ K3 Q' f. z) q. l& Z- K5 u3 H  }

/ D$ d4 p3 u% c( ^$ ]

def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):

7 U6 J. y% Z7 L: u7 ?6 j3 o5 l! T

6 p7 A2 ?5 Q% a% S( E. _ SERVER = 'mail.***.com'5 n) w; f4 Y6 _$ M$ v

USER = '******'

- N3 H! Y# ^* ~$ u% R PASSWD = '***'

, F( q' O  T* T. l5 P

( I  ~: {$ _% }5 T strFrom = __format_addr(fromAdd)/ Y# F1 J/ R  P+ t9 N7 s0 F

8 ?4 h. G) A) M: ^! k

strTo = list()

7 Q4 v5 h$ A) x0 Q  h # 原来是一个纯邮箱的list,现在如果是一个["jayzhen"]的list给他格式化

' w6 d  ]5 A: O) y4 z0 x try:* |& ?6 z/ o7 ?: k

for a in toAdd:

9 E; i2 [; |5 f: n, s& u/ X   strTo.append(__format_addr(a))

+ Q4 f* G: L3 P except Exception as e:

, N! U0 k" [+ G$ O( Q  # 没有对a和toadd进行type判断,出错就直接还原

. w7 T# u" _+ k! O. x% L3 O  strTo = toAdd

/ j* J; I% I7 Z. ~; E4 M9 I- ^: m/ B6 u$ g5 w  [

msgRoot = MIMEMultipart('related')

* {1 d$ p0 ?. L0 J% _- A msgRoot.preamble = 'This is a multi-part message in MIME format.'

$ Z9 @: }: w) z. D% [0 r, p

5 i+ b( o! M  m& E7 c( r msgAlternative = MIMEMultipart('alternative')

! R- V# W% ]  I$ O' F2 \ msgRoot.attach(msgAlternative)) b/ t' y* J+ K3 ^) S* }; X

5 @2 \% q$ ~( |+ |$ M

# 邮件对象

) k0 o) W6 q* m3 n7 | msgText = MIMEText(html_text, 'html', 'utf-8')! v" D1 L7 W5 N+ H4 l! s; O3 z

msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化

( U; m7 B1 f+ I3 [ msgRoot['From'] = strFrom  # 发件人也是被格式化过的; @: U7 I8 @5 v/ `0 v

msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”5 M, v/ q6 s8 ~/ Z

msgAlternative.attach(msgText)

/ [4 Q; v5 Z% A! F; ]7 K

* J2 K+ h' G7 s7 i1 c* R smtp = smtplib.SMTP(SERVER, 11)- a. u& S& M& Y3 p) R, N, Y' z

smtp.set_debuglevel(0)

5 R) ?! s  m2 d4 R # smtp.connect(SERVER)

0 y- N* U, v; @1 {2 E. A smtp.login(USER, PASSWD)

5 I8 b; T+ t7 A1 m # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别

6 B  q; Q( b/ m, K smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())/ \! U: W/ U9 v- ?

smtp.quit()

3 h, y6 {: i% V" b, X; j总结:3 I& _3 L5 O$ o3 ~

; S5 g, q4 k" }; q

看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo

4 U  s2 f% o* v; Z/ @( P0 ^, W7 U

实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”

; V3 u  @8 U' a2 B8 ^' J" q, U$ T9 Z6 n# A6 k  o6 n' p, K$ F

同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型! @% V' }) {7 h' C/ H6 d

. N0 _: f1 d6 A2 Z0 S4 w6 O

还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。

8 C& j: i: h0 p最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得6 n; z; h' n8 U& W% O

$ X* I  H( @4 m9 c' g8 ^,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员

$ l2 [3 G5 W8 p  W% \

( u) x7 ]" E, r5 ^定时讲解Python技术,分享一些学习的方法和需要留意的小细节5 L* D5 k6 M4 i. x6 X8 V- y1 \6 o- p

————————————————

4 h9 h( `% B3 m$ b* R原文链接:https://blog.csdn.net/haoxun12/article/details/105162947

/ K! w! g( _' z, Y% S% {Q0 R- B& `$ J1 H. ]

& }/ m" h+ ]& ?0 k5 J% P6 a- e' \1 C) v

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值