数学建模社区-数学中国
标题:
python发送多人邮件没有展示收件人问题的解决方法
[打印本页]
作者:
杨利霞
时间:
2020-3-30 11:14
标题:
python发送多人邮件没有展示收件人问题的解决方法
python发送多人邮件没有展示收件人问题的解决方法
' C( w% ]. V2 `6 I
这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
3 r0 B8 u7 l% F: K7 E5 b
背景:
2 E0 U8 t& [* T, |
; z3 ~& C) z( j+ V8 T5 F+ S$ k
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
2 E! E0 D k6 ?1 t+ V1 y
7 j+ }6 d( @- `8 Z9 U- Q; S
问题:
/ S: E' ^2 g9 e5 M
3 B6 Y: h; d1 c8 l1 Q; P7 f7 L
使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
9 _6 I+ T( [* T
5 j ~0 N ^' `/ L+ T+ O A
问题代码示例:
) @* `; \2 R* v- U2 ^9 Y
# -*- coding:utf-8 -*-
/ _( J/ Q* V+ }
import smtplib
6 d1 u( r7 c; X! y) b- g
from email.mime.multipart import MIMEMultipart
6 w, |& m! `, T s
from email.mime.text import MIMEText
R$ j, Q( V% U" L5 r* c
+ D. e+ ?, ~+ G! z
def send_email_to(fromAdd, toAdd, subject, html_text, filename):
$ Z; t% N) G5 w7 i; s
server = 'mail.****.com'
1 k- k w- [; c# G; f4 ^
user = '*****'
0 @3 M+ t' ~- n1 _0 \% x5 L
password = '********'
6 _( b0 h- X* F4 ?% ]$ o
; q; p, ~5 A' K2 g
strFrom = fromAdd
! V A( {2 B; b9 }
strTo = toAdd
4 x5 ~& ]1 Y( F0 Q4 U
! d5 o4 a- j5 e2 A3 k
msgRoot = MIMEMultipart('related')
' \3 C- ?. d( b& }- u: Z- X4 {* |- T
msgRoot['Subject'] = subject
) {" {8 d0 t; Z9 ?' Z# B: `
msgRoot.preamble = 'This is a multi-part message in MIME format.'
( y8 p# t% y( [' s9 F# a1 q
: _ Q6 q$ |: D0 V
msgAlternative = MIMEMultipart('alternative')
2 c- V! p' k( g, o# T6 [
msgRoot.attach(msgAlternative)
% h/ O# o3 ]+ R: f' x9 a
4 ^' \" p6 i5 s; [- \; ~! ?
msgText = MIMEText(html_text, 'html', 'utf-8')
/ y2 ?! T2 l/ B( n
msgAlternative.attach(msgText)
5 I; L5 J9 S* P0 o
, G1 J+ g6 U) R" l
smtp = smtplib.SMTP()
* ~5 {$ j' v' u
smtp.connect(server)
* `7 q; ]) K9 V: z/ v
smtp.login(user, passwd)
8 E: @( ?, Z5 ~3 N: r6 c4 X) j# y: t
4 P7 Y8 t' y% l% l+ @" V5 |7 B
att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
: @" ~5 ]+ S3 e) g& M% z6 V6 i
att5["Content-Type"] = 'application/octet-stream'
/ }! m, w$ ?# P2 o2 L1 d. C; R! a
att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
( e7 w& G* f3 y' ^5 z" ?6 P: ?4 v& O
msgRoot.attach(att5)
) ?7 ?; e5 O B6 F1 Z( L
9 a% w- `- s. H8 l6 M
smtp.sendmail(strFrom, strTo, msgRoot.as_string())
8 v2 E6 E# _% F. w1 [6 M+ X' l6 d
smtp.quit()
& l9 j" P. Y2 k, }* u* p8 X0 F4 A& q
return
: p/ E1 s+ U8 e6 P
9 B3 O; Y Q, V0 _$ K$ x/ }
5 \& g4 K/ F6 F
成功代码:
3 S* k9 Z' ~# \* l
#!/usr/bin/env python
1 C$ Z& s3 s* i
# -*- coding: utf-8 -*-
& H c& A; w) t) g! I% J& T- C0 `
( J0 h* o' ?, o) x2 K. }
import smtplib
1 D- c5 o& O7 l0 L. |; K
from email.mime.multipart import MIMEMultipart
& o' Q4 m" h! \
from email.mime.text import MIMEText
! K6 r1 M4 Z3 ?
from email.utils import parseaddr
$ r# i+ u( P. a( I
from email.utils import formataddr
; @2 I: C2 H! Y; [: m
from email.header import Header
$ F) r7 n8 o, e8 W% c
; O9 J! W4 T% j& Y
) C! V4 i: |" y7 a
def __format_addr__(addr):
- W7 o0 y6 F: d. @& G
# 解析邮件地址,以保证邮有别名可以显示
7 l2 s" ]% A# Y) c2 K7 L+ a ~$ T6 F
alias_name, addr = parseaddr(addr)
' H: a n' `! u9 U: v
# 防止中文问题,进行转码处理,并格式化为str返回
* I# f* d, {+ F) {9 B
return formataddr((Header(alias_name,charset="utf-8").encode(),
- r* K- t* B5 G6 |, L
addr.encode("uft-8") if isinstance(addr, unicode) else addr))
1 B/ ~1 p7 i; J1 z1 }6 h
% E6 \$ j9 w+ r2 D, ]+ K& V
# `7 L5 l0 w Q+ z* f
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
+ v, N, _9 I& F
7 @. N8 D* Z3 M0 r( p% k @
SERVER = 'mail.***.com'
8 |. x4 i4 p& u# C8 J# q! `
USER = '******'
% H! H8 t' L* o# @) Z( H/ J
PASSWD = '***'
. V0 \/ Q) C5 i& e) L7 {8 \" l* n( x
! p1 z! M9 Z4 l" M. D& h' c J8 g
strFrom = __format_addr(fromAdd)
R% A5 h% k6 _
8 f2 a# |2 p/ {: p# O; e
strTo = list()
5 d( Z, \/ P) b v
# 原来是一个纯邮箱的list,现在如果是一个["jayzhen<
jayzhen@jz.com
>"]的list给他格式化
% C7 P7 q2 f+ D( j4 ^: o
try:
4 L" t" x' P3 y5 }& n4 b* E5 D; Y; {
for a in toAdd:
$ T# t( I- K. b* m& Z% m
strTo.append(__format_addr(a))
2 X, ?- N1 w( M
except Exception as e:
/ V! J8 V, S# @
# 没有对a和toadd进行type判断,出错就直接还原
9 L6 w" D0 F& M0 W
strTo = toAdd
+ V+ D T! h& m0 z
9 J$ D9 H% B D+ R6 A# d- H3 `
msgRoot = MIMEMultipart('related')
6 Y) j. E+ A' O: b- L( ~
msgRoot.preamble = 'This is a multi-part message in MIME format.'
+ [& b, @3 y1 U1 Z+ Z, ? _' @
* \$ T& M+ h2 y! ]6 L% {: F3 ?
msgAlternative = MIMEMultipart('alternative')
+ q3 J9 Z" L4 C, a8 G2 n7 P
msgRoot.attach(msgAlternative)
; Q5 J* R) A/ k, j. i& K
) T6 o6 V9 v3 u! l2 H
# 邮件对象
8 _( c$ w: g/ c y) l" ^+ v
msgText = MIMEText(html_text, 'html', 'utf-8')
4 ]! F# R/ e' @* W/ _1 s! t! h
msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
' z0 E" T. O6 M+ |
msgRoot['From'] = strFrom # 发件人也是被格式化过的
! H3 T; y3 o; y' P
msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
/ ~9 f& T( `$ H5 A6 S) ^/ A' ]( B
msgAlternative.attach(msgText)
/ R+ b6 p; i; g/ I3 n* t/ l- X
$ R* f& x8 K6 g0 `8 h0 }
smtp = smtplib.SMTP(SERVER, 11)
/ R8 i& b- e. t( Q% p, j& _
smtp.set_debuglevel(0)
; A$ s; {9 c- r, {) L! S5 k
# smtp.connect(SERVER)
/ Y( s% {3 Z' W5 P
smtp.login(USER, PASSWD)
7 {% B' K, A* y7 N- [
# 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
1 e/ f! { w: X9 y
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
- j+ f+ i0 j! _+ s# b: S" [9 C
smtp.quit()
- N+ S$ Y( [7 i5 f! [; \
总结:
$ I2 C+ k5 B J7 T, I- p% A6 a, S
0 X& u$ a' l K
看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
/ V" f/ U1 {; @; t" c& E# k) n
( H9 S4 D) Q4 \5 [4 O
实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”
+ a5 ~! \# \. V% r2 g; e2 @
; J$ u H4 } W3 z! ~& d: t
同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
/ W/ E5 P5 x, E
: D& L& h" m; j1 D7 ]: y
还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
! b- W2 [* f& G( k
最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
' ?* d7 t+ P4 L. [/ G. R
* d8 J( T( B7 H# o0 ^) Q
,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
& T0 t; I1 j8 w9 Q8 _& \
8 U3 a2 W8 B- d6 ]9 z
定时讲解Python技术,分享一些学习的方法和需要留意的小细节
. _( B6 `2 C3 I" V
————————————————
! U; I9 W8 D- \" @4 L' z
原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
0 w1 ^" ?1 L( B" g9 v
6 |& D3 W+ F( V& V/ X' I
" o5 r [. Q/ H4 a% g
$ w2 g9 k. [; H$ m3 d9 M8 k* \ L
作者:
柠檬草lll
时间:
2020-3-31 11:00
发表回复感谢分享
$ g! V q' x2 N+ v& ?( [
作者:
柠檬草lll
时间:
2020-4-16 22:10
发表回复不错的资源
3 F: `3 G( {7 ^( |- G6 {! W
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5