- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566453 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175159
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python发送多人邮件没有展示收件人问题的解决方法9 Y' W* E3 Q* X) Y( O+ r' q; O' J4 c
这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
0 K8 j t* E( C& p背景:- n4 I ]0 r4 @9 M
& X' r& X; b1 l- g. O4 j
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
0 u" C% x& A9 } Y/ K4 Y1 u* W/ v7 ]7 r" R$ o' I) a+ h
问题:
4 I9 t1 f6 |. T p# I+ B$ A
& R) K( h6 B- b1 G* k. w使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容4 O" e# J2 ~: \6 x
0 w6 a, @/ \- ]3 `# w* c问题代码示例:6 i4 z$ ]0 R! n( w: e
# -*- coding:utf-8 -*-
0 c* E9 T. U# R$ x" nimport smtplib
3 e7 z8 ?% A% R B8 wfrom email.mime.multipart import MIMEMultipart
8 w$ S4 l4 T# X( a; p1 gfrom email.mime.text import MIMEText
- H- I/ X. t# [; J# d
8 @* A! J+ |0 @0 o0 sdef send_email_to(fromAdd, toAdd, subject, html_text, filename):" Z4 [& b# Q0 \* H; U3 {
server = 'mail.****.com'' M5 G9 x d6 m
user = '*****'4 ]5 m/ C7 r7 x, W
password = '********'( t2 Z0 f* k4 K
, K' m1 Y- F: z8 x. h% ^
strFrom = fromAdd' Z" k9 }+ h; K6 z. T6 M
strTo = toAdd/ l: I8 M8 T- g, S* H* h
7 m( T# x" K- g6 p% s1 a msgRoot = MIMEMultipart('related')
+ W8 p1 l1 S* L: x1 t( _ msgRoot['Subject'] = subject
: J3 u- w4 J: [5 p! j. \- s8 G msgRoot.preamble = 'This is a multi-part message in MIME format.'! y( m, L P- b8 w2 ]9 ^
1 ?* g2 x# N& a msgAlternative = MIMEMultipart('alternative')
1 J2 p h& @9 F' B4 m msgRoot.attach(msgAlternative)
; e" s3 r% e5 s
, I( H* l8 L; I! [) l, V0 D msgText = MIMEText(html_text, 'html', 'utf-8')
' X$ v4 V; Z8 d7 z5 S$ X [2 I msgAlternative.attach(msgText)
2 r- c! a e7 ~0 ~( }
: m) l+ Z8 E. u1 A0 \ smtp = smtplib.SMTP()$ V+ K% G8 V7 u& K( u
smtp.connect(server): q7 X/ a4 T4 y$ Z
smtp.login(user, passwd)
0 b, L. O% J N. T; m7 ~* _) O" H2 @0 i' H: c+ I
att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
. p9 C* X) c6 w- y# H, l att5["Content-Type"] = 'application/octet-stream'
8 T6 x" B* z$ P2 ~1 C0 c att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'; g4 w7 Z% c6 q' ^
msgRoot.attach(att5)' r$ W* _- J0 V. ^ ]! D" r
! `3 h2 y7 U: O1 C- z
smtp.sendmail(strFrom, strTo, msgRoot.as_string())
( y2 r9 I" x$ o$ ]$ S smtp.quit()
! l" |; |# ~- i! n: [: `8 ?8 i return7 a! I. ^: a! r+ D3 K! e/ m
& J8 ?7 e% I2 T% A3 e
( d$ n' X3 ~# E! y, k+ k
成功代码:
% p4 k6 ]& O/ M#!/usr/bin/env python- r- _9 m# N$ a5 r. Q0 g/ p2 ^
# -*- coding: utf-8 -*-
8 H% A5 D( V; j8 R+ u, n7 W" b, ^' V! J k+ H; s( v8 d
import smtplib8 M5 d5 x3 g+ y \% c6 E
from email.mime.multipart import MIMEMultipart
5 ~ f! {1 h4 d$ i9 Jfrom email.mime.text import MIMEText
% u- D0 X, H/ @1 v) l nfrom email.utils import parseaddr' O" \+ M8 K" }$ i& G: i9 f
from email.utils import formataddr3 z6 a, w+ G6 C8 D) `
from email.header import Header) W8 Z: t0 j( [4 P- ^
) i- Q$ w3 a8 P m, d3 @- l) j
K# w ~( S( e6 g9 R# i) U
def __format_addr__(addr):6 Q$ S( | u) |5 }) a, G8 W: x8 K
# 解析邮件地址,以保证邮有别名可以显示" `! y) T/ a" s% f$ J9 F5 ?; C
alias_name, addr = parseaddr(addr)
5 F; d2 b: U, J # 防止中文问题,进行转码处理,并格式化为str返回 i1 ^4 V* ` L
return formataddr((Header(alias_name,charset="utf-8").encode(),
; W2 D1 n! c `4 c( e addr.encode("uft-8") if isinstance(addr, unicode) else addr))" k5 S$ C% M: C4 `1 G
% `: B1 D: B+ @4 B
; {9 v1 Y0 ~$ `0 ^) @ f+ zdef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
# k6 s V/ X8 M0 s% S5 p& B3 l! B. e" h& r( H: J) `* [! ]7 Y3 I/ W
SERVER = 'mail.***.com'
w$ x% f4 @% l USER = '******'
+ M, h& G- M1 v! M8 J4 Z/ l8 Y. K/ f PASSWD = '***'
0 Q9 U. z# A5 C! A# l- g5 g* E* }
( m7 e& X0 D& n5 o5 q8 o: W6 H strFrom = __format_addr(fromAdd); n7 {6 t3 u/ m: `8 P( J
& C# ]( c$ }6 C$ M' | strTo = list()0 ]7 t9 ~( l! N. r# c5 e
# 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化" ^* y# W5 Q4 r* T; ?5 l$ j
try:5 z7 n/ @ J6 N0 R1 ]
for a in toAdd:
6 {: w8 I& M" m( v; B- L strTo.append(__format_addr(a))/ ~0 j) d" w9 D9 C4 p/ s
except Exception as e:
$ o, F% A: u/ d' W& C d # 没有对a和toadd进行type判断,出错就直接还原. r1 l$ I4 S9 }( l2 l
strTo = toAdd
3 s* [5 D( u* C: q! ?2 X, ^% b2 s4 Y8 T c2 D. Z
msgRoot = MIMEMultipart('related')
; c, t$ t2 f: L2 u7 w msgRoot.preamble = 'This is a multi-part message in MIME format.'
$ A2 ]% B1 F! [) ? N+ f! k0 C& e
! L1 l- Y4 o1 I8 x/ m9 m msgAlternative = MIMEMultipart('alternative')& \- T) ? [) ~* W A: x
msgRoot.attach(msgAlternative)3 z! C8 _" \/ z7 ~2 y: h8 _
% A; {3 I0 d- V # 邮件对象 ) s d# ?0 b7 q. N) O3 |
msgText = MIMEText(html_text, 'html', 'utf-8')
# L# `6 f, `, A3 j: `* Y msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
5 \/ {8 M' D$ b, c, e- S msgRoot['From'] = strFrom # 发件人也是被格式化过的) J: N( u5 k" `) t" B3 y) [/ g
msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
+ `+ V) q5 H" Y4 [! `! e7 m0 x msgAlternative.attach(msgText)' a4 h7 k+ a8 ^7 H. p- O$ D, M
g: v/ \- q. }* n0 z' @4 T
smtp = smtplib.SMTP(SERVER, 11)6 W0 n: b9 b! ?& F/ c5 ~, ]. Z
smtp.set_debuglevel(0), F6 O7 i% Z3 j5 T
# smtp.connect(SERVER)4 d8 f0 x) w' J* o
smtp.login(USER, PASSWD)
3 e5 f" b) d/ F. a5 m% h% X # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别5 r1 T* x& s& A7 ?+ v& k: O- A
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
! O w5 A* l1 b) J smtp.quit()$ x# Y. z7 [- K. m
总结:
1 E1 Y& Z- ^' v0 j. C. A0 w# E2 E6 x; R
! t- |" H; S' P8 P看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
; m ~, K1 P0 A" z4 z6 A
' J: Q/ H, Y+ E4 @实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”2 a4 _' i% f! m; W" y
( `/ t `# ~: m3 [
同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
4 ?- Z0 Y: K$ c' G% N+ K
0 M) x+ a: T! a/ u8 z还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
1 x: @8 m5 P' ?最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得% Z, g5 L1 p* C1 L7 Y4 `
8 f! ~( z! P; ~
,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员5 ], T6 i& E, Y7 n
, L; k& w/ S+ {9 n
定时讲解Python技术,分享一些学习的方法和需要留意的小细节) a$ _3 X' G: w& Q: A
————————————————) |7 O. z7 i# n+ ]
原文链接:https://blog.csdn.net/haoxun12/article/details/105162947+ b- I* R. ^4 Y( v9 G
' w9 i& ?, {) e0 |- c1 p' l& r: h, s2 ~3 z! N
( A- m3 U o1 g) H4 H
|
zan
|