数学建模社区-数学中国

标题: python发送多人邮件没有展示收件人问题的解决方法 [打印本页]

作者: 杨利霞    时间: 2020-3-30 11:14
标题: python发送多人邮件没有展示收件人问题的解决方法
python发送多人邮件没有展示收件人问题的解决方法
! J* [+ F: i! c这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
' K. \1 X; M" e; x& R3 M& N背景:
/ W, d  Q1 U+ C/ O1 V0 B  {5 ~5 ]' N; `' k
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
; [+ l2 w7 }+ ]/ a& j; h6 W$ [! _0 N- s2 X( o6 X' r
问题:. q4 T6 x9 F& i, M1 U
6 S6 w6 B' b) T' H
使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容0 l$ j: Z0 r2 m( ?* a2 \' Q6 f
" j% e' ]: ?" |) W
问题代码示例:
! ^3 b5 ?9 d! w% {! B5 G# Y; x# -*- coding:utf-8 -*-! [' _! W% y) E) j% T" ^
import smtplib
3 ]) L- w' `. l  @3 y) C/ s3 N1 Zfrom email.mime.multipart import MIMEMultipart/ Y- D& {( o" F: k2 R
from email.mime.text import MIMEText
6 M) A- d- _0 \- O8 ?# |6 i: N2 h/ \0 a' ]
def send_email_to(fromAdd, toAdd, subject, html_text, filename):0 }. Q) B0 U) Y8 u
server = 'mail.****.com'6 N$ I% `, [4 n, W2 w# d
user = '*****'
4 w% R; K  ?4 |5 k, z password = '********'% T% o( G( l3 v+ w; I: [

- o; J. x2 a) C. u9 S2 n4 u strFrom = fromAdd: ~- y5 z, V! V: p+ p- U1 m9 x0 N
strTo = toAdd
3 Z9 C) |0 Y- H- m# H! r. X4 M4 E3 S, x; a
msgRoot = MIMEMultipart('related')* G- N$ z: `5 B* I% `' l
msgRoot['Subject'] = subject. O$ h4 J4 @, Y# ~7 }" `1 ]2 m
msgRoot.preamble = 'This is a multi-part message in MIME format.'2 a, X  v) }% U" n% o0 ~4 n4 A( f

; A" ]6 T  d% u& R msgAlternative = MIMEMultipart('alternative')
+ U4 ~( }3 L/ x" y msgRoot.attach(msgAlternative)# s3 E# [" F# _+ S
5 h" N6 D0 B# z. o' d
msgText = MIMEText(html_text, 'html', 'utf-8')% m5 s9 v+ w0 B! t& Q
msgAlternative.attach(msgText)
% I- `% u; I$ M" J8 j% `2 t8 C6 Y( T" j9 L
smtp = smtplib.SMTP()+ r  @0 u& ]! t% u4 @( [3 ~: n- f
smtp.connect(server)
" X1 `* }" y0 x2 v# n1 L+ L- w smtp.login(user, passwd)
4 K: t' _$ ?" B( M1 a: p$ l4 j6 o$ X% f, B
att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')2 c  Y. k; Z$ z) H
att5["Content-Type"] = 'application/octet-stream'
! O  f  n; z/ x7 Z  W$ Y- A& N2 P att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
2 \8 @3 K2 v2 v9 _6 Z% K" K+ B msgRoot.attach(att5)
' U9 x# W/ @: c* u$ ]; @6 d: Z7 Y6 X/ ]4 [/ t+ f1 t
smtp.sendmail(strFrom, strTo, msgRoot.as_string())# G' z3 [3 f' k- R" U
smtp.quit()
" b, ^0 r( `6 }' T1 M. k5 h return  ~1 h3 a$ G. n% M/ A
" s  _) H: A% }3 G5 Z7 P

+ o3 x3 i" v& [9 t6 }成功代码:
  d' k) A( Q2 O5 b* ]( X#!/usr/bin/env python
6 c! |" s! G1 A" b" Z# -*- coding: utf-8 -*-  ?" y- k4 ?  Y/ ], I

+ W0 ]' n$ g7 d% r$ E6 g* I6 [  L' \import smtplib2 n! c) e; D: U( D( O5 u. b
from email.mime.multipart import MIMEMultipart/ b' q  `8 s& `$ z) C
from email.mime.text import MIMEText
+ ]/ D/ [  K. yfrom email.utils import parseaddr2 a+ D( P1 o. [0 s
from email.utils import formataddr8 `$ r! o7 L0 k$ ~. J6 _
from email.header import Header1 Z& V  R* R: v0 j
7 h% r! H; E. Q9 I/ r1 S
7 [  c7 D  V. _7 g/ O# P2 N. g
def __format_addr__(addr):
4 E1 }* ~9 a8 s4 G/ v, E # 解析邮件地址,以保证邮有别名可以显示4 [( N5 o$ U1 F1 O' o) O: R9 f
alias_name, addr = parseaddr(addr)/ W' [2 J6 v/ f# S1 A
# 防止中文问题,进行转码处理,并格式化为str返回
, t! L' X1 G- o3 v return formataddr((Header(alias_name,charset="utf-8").encode(),1 ~. P$ o/ O/ r( [
      addr.encode("uft-8") if isinstance(addr, unicode) else addr))2 m) C7 R& ]0 p

  }+ ]0 a- ?/ F3 w! m* m
. r: e2 j) d) Z* m' z3 ndef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
( _0 ^6 d3 D2 p2 B' }' l7 Q+ m& C& V; A" {
SERVER = 'mail.***.com'3 x  s0 z6 W; `% \- G
USER = '******'
  g1 H( O- J6 |3 f; H/ S PASSWD = '***'
) g0 ^/ f. t" @
8 l) u2 c, k. I$ I0 W+ z strFrom = __format_addr(fromAdd)
1 w/ V' Y8 M+ s, o) A5 p  v
3 l  T' r% ^% J9 z# g( ]0 h+ |7 S# J- W strTo = list()9 m0 K- N* u; s8 ]% R# s
# 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化6 i$ \  Q$ b3 x  n8 z6 Y+ E9 |2 e
try:. h& f% P& ?( U5 z% v) A5 z1 e
  for a in toAdd:
! R2 x$ T1 ^, [* s" C2 f) W   strTo.append(__format_addr(a))0 o- w; c2 y% j) J/ @( M+ y6 P6 x
except Exception as e:
7 u& m  ^* M# ~, I" l; D2 i5 ]  # 没有对a和toadd进行type判断,出错就直接还原
" C$ L( @2 c% M  strTo = toAdd3 Z7 L) ]5 h7 u& c' k. C7 }. t! r1 h
* A. b; Z. S. \2 a6 l6 _
msgRoot = MIMEMultipart('related')
: J4 S+ w6 X* }: L msgRoot.preamble = 'This is a multi-part message in MIME format.'
; R4 r" ^& u& N" U) X  u" d
5 t" L7 V* ?2 }4 n7 } msgAlternative = MIMEMultipart('alternative')
; q. d( r0 D9 s; i* U% N. T* P msgRoot.attach(msgAlternative)
7 e5 \7 B( R4 A" R5 O, Z6 m2 U% ^5 b* l' u2 ^  \
# 邮件对象
+ T4 t! E4 Q" l- x  E0 r msgText = MIMEText(html_text, 'html', 'utf-8')
8 m  L# Z3 B% [1 C8 P0 f" ?8 i msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
; T: Z! ~. ~3 X; ` msgRoot['From'] = strFrom  # 发件人也是被格式化过的
7 c; b2 D& j" D, f, w3 \7 ^ msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”/ o3 @5 V7 }% t- R' i5 v0 c# Y/ |
msgAlternative.attach(msgText)! _$ F# C+ w9 |8 Q
6 ^) {1 p/ U0 n5 B# V! i) K
smtp = smtplib.SMTP(SERVER, 11): T! n/ x6 ~2 l2 v6 M
smtp.set_debuglevel(0)1 ?% S  E3 X2 j) v9 x( o
# smtp.connect(SERVER)
" G0 I/ ~/ ^6 E smtp.login(USER, PASSWD)
% [8 w9 x! Y% N+ J. Q/ ^ # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
8 t0 j$ x, C3 a3 m/ k- @ smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
$ t2 l, `1 M" r4 Z. l' \' ~ smtp.quit()
) Q% y6 V1 S: t3 V, h总结:% g. I' |- s& z  s1 a, _

: }! f9 R! y  j+ u看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo" E: b, v6 [  }

4 Y7 W: a; |0 s0 ^5 d! r* j实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”6 R. Q4 x+ r: \3 H" q; J; X
6 }9 s! W  T! l
同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
. F4 A6 |3 |- h) A8 V4 K. H; d& @0 s" a8 c. z
还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。- K- u2 b  v' G  b) _5 N0 A
最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得/ G4 f( y. _, y' N+ {
# o- O" }( n3 u/ D* W
,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
" W# ?' `0 u  F( H) }
4 R( A3 W, E* A0 Y定时讲解Python技术,分享一些学习的方法和需要留意的小细节, x/ E, }( F) y* c1 n9 E9 f1 I
————————————————3 G2 x5 t; n1 Z" f: E
原文链接:https://blog.csdn.net/haoxun12/article/details/105162947% ~  W! C8 a6 d. S* @/ ?! i0 D5 F

: W$ h4 g1 v, f# L; j9 M& o( _3 b- U" h7 D& `" j
- v+ N* l' I# o5 N: N( p

作者: 柠檬草lll    时间: 2020-3-31 11:00
发表回复感谢分享6 l( I1 X4 P3 d+ h) r0 r' T

作者: 柠檬草lll    时间: 2020-4-16 22:10
发表回复不错的资源
6 c* R" O* Z4 F! [' v4 e& M# U




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5