- 在线时间
- 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发送多人邮件没有展示收件人问题的解决方法) W, \5 ?- d! E& n! v: B2 r
这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下- p& l- C6 A2 }$ L; T
背景:
' W- U2 s |4 p2 J$ x' ~2 x2 T4 b3 H8 C v) v ?. I4 I
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
( d$ C( k% G- p8 w& _% l7 }/ R
& J; h% E! D6 A8 Y2 a$ L3 u, g问题:) V F; E) w( w ^0 x) ^
p A9 p& O: O) X0 j3 y, k9 G! h
使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
! E2 p2 U+ [$ p; d* j4 H& S- b
6 r9 b/ Y. @/ S6 X$ b k( {问题代码示例:
$ M% Q! {8 u- P9 T6 `& }# -*- coding:utf-8 -*-" K t# W( _3 x
import smtplib
4 g/ |4 c% c7 m- @from email.mime.multipart import MIMEMultipart3 t& w. I3 O5 A2 k0 S v4 [& F d
from email.mime.text import MIMEText
5 K/ H5 F+ a! `# B( o5 ]' J
" ~6 ~: a$ n' {* B N2 `def send_email_to(fromAdd, toAdd, subject, html_text, filename):6 h( X8 w$ b( w6 c
server = 'mail.****.com'/ s2 o3 o' g! ^0 G$ ^9 L! k0 V
user = '*****'
8 U# t, z& d% n% K) o password = '********'- _, w; L; @5 p2 I$ {
9 x8 c$ t: C/ J- |" O
strFrom = fromAdd7 R: H* i( b* r7 d- c
strTo = toAdd
9 i" ]1 C1 x( a
1 W# ]6 N" d4 k1 L msgRoot = MIMEMultipart('related')
1 s" w( f: c4 @& f: `- Z msgRoot['Subject'] = subject* w( Y2 j' c# o- ]: D
msgRoot.preamble = 'This is a multi-part message in MIME format.', @2 X7 [$ l- N% Q
2 G! R1 o; u+ v! o
msgAlternative = MIMEMultipart('alternative')' M' e+ k1 ~; B. U, P
msgRoot.attach(msgAlternative)$ P, k) A5 H4 T/ W' p: u& K
* z F- Z L8 X [' m, R6 l
msgText = MIMEText(html_text, 'html', 'utf-8')
$ d3 ?" |8 n3 t" D* L: f msgAlternative.attach(msgText)/ M: N: g: K2 \6 T0 r6 W
/ m6 f ?+ F: @+ P
smtp = smtplib.SMTP()
0 q5 f- n" M k( p smtp.connect(server)
7 p& I5 B# V) [ N& `( M: P0 r9 u1 o smtp.login(user, passwd)
* ~! H6 P8 `! f- ^7 E& O* u; u* n; S9 s, i: t; t. X
att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8'): `% M; y4 s" |6 F: o& l
att5["Content-Type"] = 'application/octet-stream'
% d3 ?5 [% B9 }' @$ V att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
: b5 R; Z. G" z1 u- ^9 D, k9 A msgRoot.attach(att5)
D) V$ ^$ p7 v. L$ u# \/ |) ^; F, E9 H
smtp.sendmail(strFrom, strTo, msgRoot.as_string())
! ?& I" R% r1 { smtp.quit()
2 t4 A, n; ], C return
3 e' F2 e; I" H6 r0 m+ q
$ s4 `' `" W- {" q6 w) V8 j9 [9 W4 e4 m2 D
成功代码:
* q+ `, h" s! u( b3 E& p w! D. [/ j#!/usr/bin/env python. c1 M1 @# ^9 [: l; i; |/ w
# -*- coding: utf-8 -*-' [9 Q: Q- A2 P
( ?! d! N$ G+ N9 W
import smtplib
, G+ h D5 g ?2 i: T. @from email.mime.multipart import MIMEMultipart
6 @- C, G; D* e. h+ |0 ffrom email.mime.text import MIMEText
3 g1 n) j% d+ k Lfrom email.utils import parseaddr
- g( B7 E) W+ {, x! Nfrom email.utils import formataddr3 \# M5 q, [' e3 q
from email.header import Header
2 E( b n) V! ?- W
1 y h/ g6 c% I
% g7 W+ s# E0 M+ p8 e! gdef __format_addr__(addr):
; L3 |6 ~; t! ?# G1 @* {$ A # 解析邮件地址,以保证邮有别名可以显示0 Y7 Q7 ~( ~0 G
alias_name, addr = parseaddr(addr), E! S( h( X& m
# 防止中文问题,进行转码处理,并格式化为str返回
- c' s2 v8 u0 a! v, g" \! Z return formataddr((Header(alias_name,charset="utf-8").encode(),% N( }% e' ^$ P
addr.encode("uft-8") if isinstance(addr, unicode) else addr))
2 ]3 x$ E! D$ A9 X5 Z' m5 F' O; z; E1 V# w; W/ G
o& A: y0 Y" N. H+ X
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
, ~' ^8 k' H. O# O" k
: n( Q& ]; F: R' L5 q; ` SERVER = 'mail.***.com'* c2 @- R. Y6 X q L& Q
USER = '******'
( h; K, Q1 A, N7 ?; O6 ~ PASSWD = '***'' x; F2 @7 {9 f" q; H- b7 h
- q) W8 A: M6 v H strFrom = __format_addr(fromAdd)* m7 H( [" o3 M! v( {& j! D! B# a
: Y5 m0 ]4 A, m& }! e7 ? strTo = list()) e* Y8 s$ D5 N, m3 } l. m% M5 i
# 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
) Y2 p m5 I4 j+ q1 H- O% N2 b try:( ]+ [1 k. h; p2 q1 O+ x
for a in toAdd:
5 l; ~" m+ D% A( l8 ] strTo.append(__format_addr(a))
/ ^7 W- l, p5 y6 q& r" c9 r, \ except Exception as e:
9 N" o* X# m9 k# {9 Q q # 没有对a和toadd进行type判断,出错就直接还原
) V9 R5 v8 Q8 R/ J strTo = toAdd0 J2 T) f' B3 W
$ b; F5 a: }/ E% s! i0 {' b
msgRoot = MIMEMultipart('related')' X K3 s* c. N/ [
msgRoot.preamble = 'This is a multi-part message in MIME format.'. A" m6 j& S2 j2 m, a& }
# F, m2 v9 X6 s0 F! V) `4 N3 k+ ?
msgAlternative = MIMEMultipart('alternative')$ N7 S5 V7 Y! E
msgRoot.attach(msgAlternative)
$ D" a& L2 w" A f& w2 M0 f
- P$ J; q6 t5 f # 邮件对象
3 a, S; m+ X+ } msgText = MIMEText(html_text, 'html', 'utf-8')
g; P2 i; I8 c: o3 F3 y/ K0 t( r( e msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
* B: t" Z5 d& c# |: c9 R& e5 d msgRoot['From'] = strFrom # 发件人也是被格式化过的! `, O; l* z P6 S; @
msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
6 e: T+ p; m+ V+ p" B2 z3 J msgAlternative.attach(msgText)4 q3 N- n' m3 D$ [% i$ N% ?9 Y
- h4 M: e+ h3 I: j2 {1 W# s7 Q! z
smtp = smtplib.SMTP(SERVER, 11)+ }8 I- [( A% ], P. Q: f5 o2 c
smtp.set_debuglevel(0)
$ }. J: l% k" r # smtp.connect(SERVER). f+ r7 j3 {# O9 g, ~/ T5 N5 g! ^
smtp.login(USER, PASSWD)& |& @& `6 X" V B' Z5 s/ A/ ?
# 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
7 Z9 Q$ w8 a4 S+ S5 r+ R smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
9 ?5 f- Z D& i8 G# z) O smtp.quit()7 b0 I, E5 S2 X. ]6 O; a
总结:9 N- W) g& S; d
& Z% Z6 ~) Q! l: S! {" v7 l
看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo/ p( [4 l* V- Z8 R- E7 v
4 z2 x# c+ _" i实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”+ m* a3 f3 ?4 N+ W- Y: |; ~ t
: u8 B* T% K* p/ O$ D0 D同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型9 p+ L% R; s0 t5 L. E) l
5 }" i3 T3 n( `! x. M( R
还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。/ k$ S. K0 Z' m% Y
最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
: p, f' p0 Q R7 y% {
p9 k. t! S' m2 T,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员3 x' K+ Z- E' f/ |2 [, q
7 S+ K2 Y& b5 {% B# [定时讲解Python技术,分享一些学习的方法和需要留意的小细节* i4 r- v) i7 z2 C
————————————————
! A/ u% |6 N4 v1 p原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
* X* m7 `: _5 x/ t9 v8 G: }
6 P& _( T3 E/ n% a4 m- j t/ b/ X$ e& ^) f8 U$ X" P. ^6 l
6 x! E; n/ t( S1 u5 m+ x
|
zan
|