数学建模社区-数学中国

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

作者: 杨利霞    时间: 2020-3-30 11:14
标题: python发送多人邮件没有展示收件人问题的解决方法
python发送多人邮件没有展示收件人问题的解决方法
4 A: R( g8 w; J1 z* E& i这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下% N$ _. N' \0 f9 I
背景:
$ v4 B' X% j; |! `" ~2 @
4 j6 }7 @8 _( C8 o! L7 |% x! o工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人7 i3 e, y" N( Q/ P4 n

! K8 y6 Z0 N0 {/ j+ [问题:
( r3 U9 U. R9 A# K9 W; i
2 B2 \- \' r1 _" l6 B# J6 ?: _使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
. l; ]2 `, @1 I
- w  s" u4 f) m3 D问题代码示例:
9 E( ]% X: @3 B, L0 |# -*- coding:utf-8 -*-( i9 h6 y6 j0 r  C: t3 y( g
import smtplib4 a8 l/ o1 x9 t8 t2 \
from email.mime.multipart import MIMEMultipart( ^/ c% Q/ y: J# ^4 W
from email.mime.text import MIMEText/ y4 X8 X6 o- R5 @$ P) b
, [+ \( o: K  F6 R* L4 q1 C. C) V- B0 U
def send_email_to(fromAdd, toAdd, subject, html_text, filename):
: `9 a8 m8 K! o! \, m server = 'mail.****.com'
: V# j" H" o; a+ V& p" ` user = '*****'
  j) I+ Y. x0 i3 [ password = '********'
7 J4 Z2 P/ k$ a1 e3 H" r0 m* F9 {9 O' H" V+ d% _2 w
strFrom = fromAdd1 [. G5 {7 a1 A! j
strTo = toAdd9 m, C$ `2 C- }# ~7 ]

( W% Y* w* D' l- c msgRoot = MIMEMultipart('related')
$ r, y! A/ H+ l: ~4 Z msgRoot['Subject'] = subject
. a$ w, H9 O4 W' P& U msgRoot.preamble = 'This is a multi-part message in MIME format.'
: [" x% M0 ?! k0 L. y: Z' F
! }4 r: j9 ?; \; b+ f msgAlternative = MIMEMultipart('alternative')
& R( x0 N; |& Y/ W. [7 F msgRoot.attach(msgAlternative)
8 C( {# @# R. R# s- u* b, F
4 E. X; g7 s0 u5 x1 p msgText = MIMEText(html_text, 'html', 'utf-8')4 Q& _- b4 s/ T$ g& `* g/ C" X
msgAlternative.attach(msgText)
5 _' T3 t$ g' N+ t
0 k9 z3 |: a% o; F# ^. S smtp = smtplib.SMTP()' _* p* [, O" W  s
smtp.connect(server)
$ {3 |, U* _6 B  ?6 l7 d smtp.login(user, passwd)
) N; c' E# I, N* r& s% v
- X& J$ U8 W, N/ V att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')" q% ~* l; P  t4 b+ Y, t
att5["Content-Type"] = 'application/octet-stream'8 x0 @5 |! G8 i+ _- X/ \+ E
att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'8 m* R. Y) o6 \% B6 R
msgRoot.attach(att5)
8 A  N9 O5 [2 V4 d( U& _% Q& D1 Y9 v9 ~0 o: T4 ~) Z) F
smtp.sendmail(strFrom, strTo, msgRoot.as_string())
# J. R, N7 M/ J  @$ j5 L9 C smtp.quit()! |. f; R5 L" w: G3 x. [
return
* T/ _. D: E9 l) a" ?) t) U9 W7 v4 H" V) R

) X0 O4 C* g+ |, m3 ^5 N) x% A成功代码:
+ y; A' _# k+ b7 Q#!/usr/bin/env python2 ^- b( `" Y8 t8 E) m
# -*- coding: utf-8 -*-
# j6 A/ i5 n. x1 [1 Q9 Q; d9 h
/ O3 R6 W/ _+ Z4 C* yimport smtplib/ h! t$ G$ d! x' s4 [+ h5 f
from email.mime.multipart import MIMEMultipart9 `5 _& }! m+ |" h* d5 E
from email.mime.text import MIMEText
2 w" U( s3 P+ @2 \3 K& Tfrom email.utils import parseaddr
8 }# y$ `: o' c" d+ Q3 kfrom email.utils import formataddr
- a$ Z  d$ A- N! q9 U; ufrom email.header import Header$ L* j1 G4 _% _9 d- v8 g( R9 U

6 y* F* A$ x. ]9 ~; k
1 T' a  R! d. D* W$ P3 a' R, rdef __format_addr__(addr):! K- R* k8 r* a, |. ?
# 解析邮件地址,以保证邮有别名可以显示
4 H; C1 P$ q3 c* h# M3 g1 R# a alias_name, addr = parseaddr(addr)1 y9 a$ w' U0 \% [$ K
# 防止中文问题,进行转码处理,并格式化为str返回! n: n3 h. v0 O2 c9 M8 ^  v/ v
return formataddr((Header(alias_name,charset="utf-8").encode(),
2 T; |* P6 m2 [7 X" l      addr.encode("uft-8") if isinstance(addr, unicode) else addr)): ^" Z# W3 z5 G* Z0 k% L2 B- K
$ i8 Y( p9 R2 M% O( B) b+ @( t

4 C( U; G5 D; z, k. wdef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):6 l, _2 s0 N3 k8 [7 @9 o
( F3 O; @% K2 S0 k/ U
SERVER = 'mail.***.com'
* a4 N/ r8 C3 E2 z' g* d/ Z USER = '******'
" e0 u$ `5 c5 s6 l PASSWD = '***'
  f3 p9 {. v2 Y5 G* U1 x
" |: N. K4 Y3 k strFrom = __format_addr(fromAdd). S! ?/ d' h; @8 p6 E
7 q% n0 ~- U: F' i  s
strTo = list()
3 H( S# v: U0 m( o0 |0 u # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
; a& |( b3 P8 c8 x% _ try:/ W, N8 {, w$ j, e9 ?
  for a in toAdd:
9 M: d6 G" u  o% K   strTo.append(__format_addr(a)); K1 p. F# Z2 o9 E, Y
except Exception as e:
  n! ?+ u4 r$ t& t" c/ e  # 没有对a和toadd进行type判断,出错就直接还原* F+ z+ K0 T2 q3 ~9 [/ \
  strTo = toAdd& D$ W) C2 z& K4 u

' P' [2 O& o' m+ g2 `% }1 x. r msgRoot = MIMEMultipart('related')
% I5 u) i& m$ H! F/ E msgRoot.preamble = 'This is a multi-part message in MIME format.'5 ?5 Y3 I) ^. Z* P  I
1 t: H8 w$ o; _3 [- {; F
msgAlternative = MIMEMultipart('alternative')! P% I. h% u) E2 J# l% j8 A& @
msgRoot.attach(msgAlternative). _  p5 N% k$ Z5 W

5 ]2 ?6 Z6 h* o0 ^9 w/ i- I # 邮件对象
* G; W  Q4 A2 y, b: c' j1 g# e8 r msgText = MIMEText(html_text, 'html', 'utf-8')# o. p1 B# O  e9 X% l. v# P# `
msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化5 l# J* F/ F" d* _. Y$ G) U6 y
msgRoot['From'] = strFrom  # 发件人也是被格式化过的, s2 k; S2 }) O- s
msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
2 l. J& _$ X3 |6 p! d' K; g msgAlternative.attach(msgText)- W' U2 o( R& j- o
/ x2 w6 X6 c# T% @9 N
smtp = smtplib.SMTP(SERVER, 11)
6 a: [) N" R  U# j smtp.set_debuglevel(0)0 H) E, y, I, D& |( F2 S
# smtp.connect(SERVER)8 s$ v' B/ X9 t! T0 n& @8 w
smtp.login(USER, PASSWD)8 H2 C5 ~1 Q) ~) _
# 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
5 m2 I; L; N) [, B" l smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())# g0 I* i6 m7 r! b" {# M" H3 a0 }
smtp.quit()- ^# b) B/ @9 y2 D6 }
总结:4 e7 o' `3 t. `$ V2 a. a

0 h! }  a, w4 l2 `& {看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
- o* [5 Q% e+ w; e. H5 |. X
7 ~) _. G. z; @! Q$ A( c2 W- N% r# O. i$ r实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”! F, V% j# p! n4 Y4 q  l
' q  a( C/ l; H2 a/ c. t
同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
% D0 \8 E3 @" K9 j7 w/ E: D5 Z4 Q2 L( {* Z/ Z
还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
, B/ U- n- a. U" O7 G. n最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
6 t2 l/ |" ?$ a3 g8 W: E( K8 \$ d7 E
,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
3 b/ w7 \6 Y3 s
. b& g+ B$ ]7 }  \定时讲解Python技术,分享一些学习的方法和需要留意的小细节! O4 D  C8 ^+ J7 s- y
————————————————7 i- D- J8 X0 \% ~
原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
' Q, Z. h: J; i; T( A) f8 ~- M: K1 m6 I" _8 o/ O! ^5 Y+ y

# X! t4 V* z% q: a* z! t
# H8 Q" h2 {4 E
作者: 柠檬草lll    时间: 2020-3-31 11:00
发表回复感谢分享
4 r2 {7 i1 t- Y+ ~
作者: 柠檬草lll    时间: 2020-4-16 22:10
发表回复不错的资源/ X/ v' s6 Q6 R6 }: D2 |% x





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