- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566483 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175168
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python发送多人邮件没有展示收件人问题的解决方法
0 e9 x; z* R6 r I这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下- J7 y1 J$ B; n' z* o8 I
背景:- | S& @+ b+ T; k% g/ U
. n! X9 I! |; ^4 t6 z
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
) g) u- y( `* }& @
$ F. l2 j% b7 l( q' L5 v- |0 a问题:
& J% O& f- f& w; ?2 M; Y4 @2 ?! S- ^4 s
使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容& ^) c9 f* x" u) K, z: D W
& D# V d. g. Z% R5 ]: u Y; h- @; @
问题代码示例:
6 x4 K r4 o( D2 {4 U: f2 r4 R# -*- coding:utf-8 -*-
T8 [$ u N+ F: Timport smtplib }6 P7 V |' n8 Z" d
from email.mime.multipart import MIMEMultipart' b5 F) n) Y. v( a8 }5 V! M) Z
from email.mime.text import MIMEText
8 m8 l' q. F" h; B! n6 M! D% }# v( }( a( o9 R% \2 I' T
def send_email_to(fromAdd, toAdd, subject, html_text, filename):7 u6 u1 C3 u. ?) Y1 F& L# a2 k4 N
server = 'mail.****.com'* i. G3 i$ E- \
user = '*****'
$ J" V0 M. d7 i5 S, A e1 p password = '********', p& L& ]! n3 d% r6 ^
2 [1 A/ B/ t2 A strFrom = fromAdd( X5 A' v" n x- J0 K5 o+ s
strTo = toAdd( F7 Z" M2 D7 t
5 G" p+ J0 K5 l3 c* G- J% f: b8 m' ~ msgRoot = MIMEMultipart('related')
" E; A" l. ^+ h' ~, l0 d msgRoot['Subject'] = subject
- |$ y; ^8 p, \& o msgRoot.preamble = 'This is a multi-part message in MIME format.'
2 ~0 s; d! m( u) c) @' Y( A2 H8 X y
msgAlternative = MIMEMultipart('alternative')& R/ M x/ Q* n+ |8 U1 n5 z
msgRoot.attach(msgAlternative)
2 T1 V, Y+ A- i+ M2 g- r5 A9 ]# ]2 l* h1 y* n
msgText = MIMEText(html_text, 'html', 'utf-8')4 \# b/ Y; X! k" v7 h- P
msgAlternative.attach(msgText)
( o ~( C2 w) ^) Y( N# s1 H4 m
0 W! [& j4 L! t) d5 S3 q# a smtp = smtplib.SMTP()3 G/ z' K1 M2 l$ i7 ^8 m
smtp.connect(server)7 l0 T0 n( O' ^. I
smtp.login(user, passwd)/ ?2 p* o& k% q# a1 g: S! c
* N! F) g- I' W3 M2 U( {' |6 j/ i att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')" ]7 c7 @6 _- x# Y. i& z0 {
att5["Content-Type"] = 'application/octet-stream'2 i8 K l, @0 ~9 [- `' x
att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
n6 t0 g7 f0 d: j! L; ] msgRoot.attach(att5)- B$ j" L4 @1 g' Y; j4 U: W& Z
3 S* F1 H) [) t1 X- T" @ smtp.sendmail(strFrom, strTo, msgRoot.as_string())
/ ]8 e; H W# M! Y$ i smtp.quit(). J9 L+ x# R: [; B# c+ }! A4 Z6 P
return1 C( k! ]- Q( a( s( e
) c# S% ^' v$ ~: @2 A' `5 H
# m. {0 Z8 r6 X4 \
成功代码:
: ?1 E1 I2 a) z" n3 k#!/usr/bin/env python
7 q/ X$ i4 N' L& D# b9 X# -*- coding: utf-8 -*-
- ~3 S% O ^$ R( w: J' i/ {
2 \' a, c0 z& L* ~" qimport smtplib) C% `3 V3 H) P o
from email.mime.multipart import MIMEMultipart
& g' x% p+ }- d5 x6 Kfrom email.mime.text import MIMEText
3 U3 g4 W1 s3 l2 u5 ` ]5 Lfrom email.utils import parseaddr
1 @" o, F1 D$ f( o2 k: p; h9 q% j3 Mfrom email.utils import formataddr
: u# a1 J& {/ [* n9 s/ Bfrom email.header import Header1 U3 ^% @/ I0 V! e! B7 u: D" ^
0 W2 P( p. b! P" P* n E7 h+ W3 Z. c, x5 K6 ?
def __format_addr__(addr):/ d: }3 D' H) a( `1 @" L
# 解析邮件地址,以保证邮有别名可以显示
( x6 P: E! G s alias_name, addr = parseaddr(addr)
2 D; ?% t( M+ T4 B z" N7 ^& q # 防止中文问题,进行转码处理,并格式化为str返回0 ^$ `' q! v9 c! [8 N: x) l
return formataddr((Header(alias_name,charset="utf-8").encode(),
" O n1 N. p! h& t- m addr.encode("uft-8") if isinstance(addr, unicode) else addr))0 _3 I! Y$ |8 y+ J9 S! a$ G# _# M
& v7 \8 M3 i, w% k! C% _
5 R8 e4 p/ Y# ^' Q$ g( Y! |def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
- L/ Q0 C! \' r5 B. A+ m5 c$ t2 k: w1 a6 x
SERVER = 'mail.***.com'
% j s" i* Y6 M$ g# W0 T1 s) y USER = '******'
& t' ~5 k3 C8 E' E PASSWD = '***'( {2 R5 v6 [; {
9 b7 p! f" c/ w7 b8 Z$ T
strFrom = __format_addr(fromAdd)
4 Q7 r% e2 S! j O; E9 H
1 S! a, o7 E- q1 G; N3 b- ], S strTo = list() q8 d$ b9 I$ Y- N; m1 n. j
# 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化4 D, y! I; Z% g! S
try:
- n) O& a a- A1 `6 b for a in toAdd:/ }: D9 ^% _& W# S# X
strTo.append(__format_addr(a))' I: S1 {: f* K5 k- \
except Exception as e:
' @8 s/ X* B, t3 K # 没有对a和toadd进行type判断,出错就直接还原
. O7 V3 r( U# S7 w a E strTo = toAdd
. l8 x; M$ E; `
- ^) l1 C$ J# Z c5 ^ msgRoot = MIMEMultipart('related')
E& R4 B5 g1 y* ?; t msgRoot.preamble = 'This is a multi-part message in MIME format.'4 i+ L! ^/ V* M" S0 J
. C9 ^4 [/ c0 m- @% \: u$ X msgAlternative = MIMEMultipart('alternative')
g- e& t6 f. k- C msgRoot.attach(msgAlternative)9 Y9 g6 s3 D* r1 U3 L; W' w4 o; l% C
! n+ i6 Q, u- G; L. a) z # 邮件对象
4 j1 }7 m6 r" ^( n msgText = MIMEText(html_text, 'html', 'utf-8')
5 G) I G: B9 i) K& g4 b$ B; E msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
+ b( N# @4 @6 ]% a9 z! O% G msgRoot['From'] = strFrom # 发件人也是被格式化过的
7 Z# H7 J) T# s0 K! h, R msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”( p; P' ^4 T: y4 U0 i3 W" N
msgAlternative.attach(msgText) H. P$ E( D% ^& K6 w6 r5 f% S6 O1 t
. R" N* T8 V. g1 x
smtp = smtplib.SMTP(SERVER, 11)+ p# Y% f9 r4 [: a6 Y2 I
smtp.set_debuglevel(0)
; |+ S. m/ l3 p$ \ # smtp.connect(SERVER)
" ~5 w' C* _5 F smtp.login(USER, PASSWD)
/ N. C& J1 H/ U, r5 N$ a, _2 e' ]( D # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
0 J: W9 P% D$ Z9 [% X$ n; C smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
2 _) A) S4 }8 k0 v% P9 ? smtp.quit()
: ]7 Z: Y+ ?2 ]5 L总结:
# f6 w& E1 E+ X5 Q9 w+ a& g" K) M a) X( @4 e
看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
* V9 g& d' F* `" u0 {8 t: _# ~# Z/ Q; _" o& g# B' Y6 O0 W* E
实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”4 B+ V H* O9 Z
* b, }, Y) O" }: Y1 {同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
+ I+ u1 A7 S! F9 ^' \
) y; q: R; [) g还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
& z8 ?9 g# b) T) K5 D0 @5 g4 `6 g最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得9 y( o; c! n. V( d9 E
3 n5 G$ T9 X+ }2 A" u, x4 l, u, |
,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
0 m, \% ], c4 U6 z4 | ]( H, }* Z" ~' t! F- ^, U6 c
定时讲解Python技术,分享一些学习的方法和需要留意的小细节
. F% R7 i/ W6 |————————————————
9 V, k) ?1 E; P& _& c原文链接:https://blog.csdn.net/haoxun12/article/details/105162947/ o" r6 G2 a/ [9 j3 d) Y; C- _
) k' R: u/ J$ _5 v( N9 h' }8 \
0 |/ U% `. ?8 b7 v* [7 q1 O9 r+ U0 |+ e7 h7 i; Z% O/ Y/ h# K. K
|
zan
|