- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566435 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175153
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python发送多人邮件没有展示收件人问题的解决方法
! l" H/ D* e# ]; _# P+ ~这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下6 K* V5 |5 M. L7 o
背景:/ y! Z0 x* n- r! T8 ~" n$ ~
6 G( }5 K- ?* H! b% u工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
- T& l) I( f/ H) ~5 r/ S7 o
# Q9 T1 D; Z$ P& f+ o, f7 ]问题:
* A! Z) i% r4 w6 n6 t( a
2 p& H6 R, ?' t$ z- T( x9 s4 `使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容% ~! }- a/ ~' R* G/ J* v! N# N
9 |+ {1 t% C5 G A问题代码示例:; E3 A3 [! H- B& R
# -*- coding:utf-8 -*-
/ ?( t* W- G7 e; g1 B9 C0 yimport smtplib
$ S$ A l% p$ _5 n9 n/ K& u) `2 a; zfrom email.mime.multipart import MIMEMultipart
" F2 s) ?9 Y7 h5 a/ `# w P6 k6 Ffrom email.mime.text import MIMEText! w. Y. L+ K' {/ ^
3 [1 b4 d/ ~9 j
def send_email_to(fromAdd, toAdd, subject, html_text, filename):0 l! g$ L9 B3 G6 V2 n Z. w1 \3 B
server = 'mail.****.com'2 Z2 F* s$ m' Y. ~6 _7 P0 l
user = '*****'5 d* @+ j( P5 A- q9 H6 o
password = '********'
* }/ S' x% J) u! p/ u' P$ ^; |, ?8 }
+ w9 Q) V+ d1 B5 e& w1 W strFrom = fromAdd
9 l" G E) `4 Q/ a# J) u+ x strTo = toAdd
4 X# f) z3 ~% [8 e9 j6 T$ F+ {$ ?2 T4 W, ~: _' w6 t
msgRoot = MIMEMultipart('related')
& j; F, p2 Y" t7 k$ s2 N6 O4 @ msgRoot['Subject'] = subject$ m' n; y# H- z$ H8 L7 s
msgRoot.preamble = 'This is a multi-part message in MIME format.'
4 c1 L; p' s1 Z# G1 l/ S* y" H9 Z% F$ L F
msgAlternative = MIMEMultipart('alternative')* ?9 n- R! e. n2 B+ Y$ W
msgRoot.attach(msgAlternative)
' z6 }$ D! w+ e; B$ y P+ o
/ S( y7 |& L9 W* J/ P msgText = MIMEText(html_text, 'html', 'utf-8')
7 X6 k* j* F5 M! R msgAlternative.attach(msgText). f2 E0 e4 ]0 W* E3 C" @8 O' P
" }. L7 T! U2 v7 j' g; r smtp = smtplib.SMTP()2 Y; F1 \3 o6 `8 G# }& Q: F
smtp.connect(server), q% T. d# W! d
smtp.login(user, passwd)
4 L# [" W. ]; A$ t$ j$ O
' ^" r/ D8 Z/ q) P G- \5 D- Z l: t att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')" b5 l% n+ e# x- o' v! F, H
att5["Content-Type"] = 'application/octet-stream'! Z+ u3 i, R+ C
att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
; N1 _7 Y! Q- h msgRoot.attach(att5)* t3 [4 a2 z( x0 k) @
5 {6 L* d% Y6 q9 A4 B smtp.sendmail(strFrom, strTo, msgRoot.as_string())
, J6 H* V3 C+ `5 P smtp.quit()
/ z. N5 l! {; r* E& c. L return7 r; p( u \& @$ H# |2 o
7 V' U; \$ {% u$ n1 l0 `! B& _6 e
成功代码:
% ]& ?) k7 `" X/ Z8 n( c) `! j#!/usr/bin/env python l+ t9 { Y# H$ N f
# -*- coding: utf-8 -*-
2 d- l/ W4 e! A7 B$ r8 F# a
! ]+ E! L6 V4 C% G. Z5 aimport smtplib
% B9 c0 b$ q' y( j' Y* k9 U' yfrom email.mime.multipart import MIMEMultipart
+ s4 m7 Q. t3 B$ E p2 n, c; lfrom email.mime.text import MIMEText3 V1 a. w! W+ b/ p
from email.utils import parseaddr
7 v: E0 j+ X# W6 Afrom email.utils import formataddr# s' F3 }! i1 b+ }7 E
from email.header import Header
# s% ^: v% a6 J5 b) k
% B( z. b& R) b2 H( _/ o+ p+ M
, w% b4 H2 b+ f2 C# _8 qdef __format_addr__(addr):/ L* s2 m6 u/ z) T( f: a
# 解析邮件地址,以保证邮有别名可以显示
# X1 U+ ?8 V2 X8 @1 t5 }+ a alias_name, addr = parseaddr(addr)
. T+ y7 ` g' V # 防止中文问题,进行转码处理,并格式化为str返回 y B% O0 I/ N5 r
return formataddr((Header(alias_name,charset="utf-8").encode(),
4 d' R& d5 c0 ^# K9 h# E2 S addr.encode("uft-8") if isinstance(addr, unicode) else addr))
: |% t0 B2 V% B0 f" G" x( F3 _, [) }& f4 v8 Q5 @ j0 B7 \
1 H* s# h4 c4 a) x7 Q
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
) {1 t+ h8 ~0 g, Z8 s" E+ m( C# Z9 T( R, i
SERVER = 'mail.***.com'
( a ]0 ?. ]# O* k Y4 b4 R o USER = '******' c& e; m. y4 p% P) C! o
PASSWD = '***'
^" Q/ j; K, M C+ F ]) Y' p/ V6 f& g5 s8 u/ k
strFrom = __format_addr(fromAdd)# n' W9 c* V2 h4 Z2 b8 c+ E( F& K
, P0 ?' {, V; Q8 _- N
strTo = list()
$ ?2 M$ F( b) F) B/ x% _ # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
1 P0 b8 x$ b8 v( i; y try:: N! y. b' j* ~# ?9 o3 `+ {4 A
for a in toAdd:# @. q+ f* E) V+ c6 J
strTo.append(__format_addr(a))% K- n' Q7 ^/ z! j i4 y% [
except Exception as e:
+ N7 ]. P; `, i# @1 Q+ F, i # 没有对a和toadd进行type判断,出错就直接还原
/ k3 Q& T J2 Q# L- g; s2 C( H strTo = toAdd
" [, G9 ]& Y& J9 b% v8 L# g6 H" N
/ j- w! x/ z. ]1 w! G1 y! s1 L msgRoot = MIMEMultipart('related')0 G9 I8 E& H+ M' J
msgRoot.preamble = 'This is a multi-part message in MIME format.'
' g% f& \; W+ P+ Y, r4 {; \ b1 o+ j) k0 o" F# Y
msgAlternative = MIMEMultipart('alternative')# I; k; l! |, l. n
msgRoot.attach(msgAlternative)
, u0 A5 z& ~. }, a3 b( ]# S* Z5 f, ~& c9 s& i
# 邮件对象 5 E B* Q2 @2 ^9 R
msgText = MIMEText(html_text, 'html', 'utf-8')+ C7 R- ~. ?9 A4 c5 d
msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
0 e2 B- X% g: b( `. ?5 R- l# {3 M msgRoot['From'] = strFrom # 发件人也是被格式化过的 Z$ Z. C' `* ?% J# F6 I0 p
msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
* }8 k N' I" f msgAlternative.attach(msgText)
2 q; M) Y1 O9 d$ n2 @. L
c) E L/ G l1 v5 P smtp = smtplib.SMTP(SERVER, 11)4 m4 O) d& H- X. i
smtp.set_debuglevel(0)
1 a4 [* i: X8 j: V( u # smtp.connect(SERVER)
p: H& q, r$ M1 x smtp.login(USER, PASSWD)5 ?, N8 q& @$ E1 L
# 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别( I: k3 H# t$ F# S' `
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string()). R ?* T% X: `0 {: z& e
smtp.quit(), n/ ~* m7 j0 j# U+ v* C6 f( u
总结:
+ @) v, {$ N9 H
- ?* p! a+ h9 { M d看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
) r% }* Z3 n: u7 }
' m; J1 n( O7 G$ {7 p/ o/ @7 d/ o实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”7 B7 @" N& U0 F' k2 `
( S e2 C' K& [同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
# A4 P5 ]* H( X1 D: L" W
' J3 J6 v' i& r# \2 o/ V还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
g; u" i n T/ S- O2 b7 K最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
; E1 V/ V4 \ h
. j' c% e) B2 h. n9 J" i2 R% `,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员2 a, m" B8 Z$ f1 h% h) z
7 Y. ]; @. F9 v
定时讲解Python技术,分享一些学习的方法和需要留意的小细节
. L- z: s+ a: |. ], S" K0 K) I3 T————————————————
% K0 B6 d% }, Z# `# G原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
9 e4 B% { p z/ |$ K: f
' g# J2 d& R( y- H, t! `
# m4 g" k* {% j! F4 j% l5 i0 D4 G2 n0 j* b8 ?8 }4 J
|
zan
|