- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 558805 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 173014
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python发送多人邮件没有展示收件人问题的解决方法
/ }4 j6 ]- P& L' Y7 v这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
( A8 U8 f G+ l背景:; e+ i0 V) ^7 T' F8 E/ y
$ g- W6 B5 q4 K" v- Q
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
: P# A: c1 C3 |3 z% a- ^! g5 E0 d0 p
问题:
+ `, ^4 G, e' W
& @4 U" S6 \8 @6 c O/ a6 P$ R使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容# z+ z0 O" \+ c/ Z
6 \8 p- u m' M2 G( e- Q
问题代码示例:" {1 u3 \) ^* c
# -*- coding:utf-8 -*-
: H1 v( N0 W5 [9 C/ himport smtplib2 y. ], h) y' ^
from email.mime.multipart import MIMEMultipart( z# N+ q" f0 {! A$ a# Y
from email.mime.text import MIMEText' u+ W6 X8 A4 g, ~/ @4 M( q
0 u0 ~! L0 f0 \4 w* K
def send_email_to(fromAdd, toAdd, subject, html_text, filename):% D. a7 K8 G8 { M
server = 'mail.****.com'
+ C3 q; `7 h5 r9 r6 \ user = '*****'
4 g) a) \' {1 ?8 {- Z6 A1 j8 _( n% x" Y password = '********'$ q- T3 h, l* R
- Z& R6 E5 ?: H, v8 S/ i strFrom = fromAdd
& r& E0 k' `& I5 D strTo = toAdd
, L% l. s [" p* I/ s3 R6 m- S q6 C- R' W2 v$ }
msgRoot = MIMEMultipart('related')" E1 ?; F" F# K: J
msgRoot['Subject'] = subject
9 `0 O) X+ L+ n/ |; r! ~1 X8 {1 m1 j msgRoot.preamble = 'This is a multi-part message in MIME format.'8 \" B7 j, w% \+ ^
0 q' V F0 x( ]: ? w7 h msgAlternative = MIMEMultipart('alternative')
2 X3 @! t4 z3 b msgRoot.attach(msgAlternative)# f/ q3 h( }9 i* D, d$ \+ G
. d/ O# v4 a# z% c6 L3 u' w) }9 B, b msgText = MIMEText(html_text, 'html', 'utf-8')1 z: F: ?0 o3 }( V: U8 s
msgAlternative.attach(msgText)
3 F% X- s, W- T! M1 ?0 E* X+ N# p
smtp = smtplib.SMTP()
# m& | Q& O y smtp.connect(server)1 w: L; F6 u" h9 ]
smtp.login(user, passwd)
. H/ Y! t/ g6 @5 `4 x& h; H/ U, A2 [( r6 M
att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
7 |( c# f, u! i! ^: C att5["Content-Type"] = 'application/octet-stream'
% @' n2 t8 Q6 Z: H7 Y att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
$ Q& w2 K) W6 T9 h1 _6 V msgRoot.attach(att5)
" o7 D! r. e# [/ I Q( i) p! u; @3 w5 p/ C1 z
smtp.sendmail(strFrom, strTo, msgRoot.as_string()) E2 c' X" v' C! _
smtp.quit()* }: K7 A" r" `- g9 M' _
return
! x; K% r. R. U2 N( x: a0 R2 @/ L5 K* ^3 F/ S+ V- O" r
' i a$ `# {& Q9 w7 E- d成功代码:
7 q7 D" B- C, y1 w* O#!/usr/bin/env python
! g& j) j) J* u, i5 l6 ], ^# -*- coding: utf-8 -*-8 e5 f: E; u9 I' D) A
6 L% M! I. x2 w& y& i& E# Z
import smtplib
& P2 M9 ^* S# j3 o, e7 h& O: Pfrom email.mime.multipart import MIMEMultipart
0 T! C% p+ S9 v) Ufrom email.mime.text import MIMEText! C7 Y% T; \9 Y8 a; n w
from email.utils import parseaddr8 `( o. _! {8 I
from email.utils import formataddr! `( f. L; t8 I8 L8 ~( Z& H1 A2 ^
from email.header import Header1 }5 N' Z0 T0 ~) V: f
# c9 L9 L$ Z; c6 r, ?: F/ _9 e
" \) T& L2 P. a8 o* k) X
def __format_addr__(addr):
$ p7 \2 z! R1 k6 h j: d/ R$ D # 解析邮件地址,以保证邮有别名可以显示/ z2 S5 e' L0 `2 J1 n+ A7 u3 e+ I
alias_name, addr = parseaddr(addr)
5 c/ P. _% g* f3 C& A8 k # 防止中文问题,进行转码处理,并格式化为str返回% R4 s/ j0 I0 F) Z9 K& Q
return formataddr((Header(alias_name,charset="utf-8").encode(),
/ O7 _: O* T9 x addr.encode("uft-8") if isinstance(addr, unicode) else addr)). M9 J7 x1 [" U4 q$ f
: g2 Y8 A# ~' z }+ Z) g% y
) l' X+ C; d' A. |) Q+ r( Idef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):1 Q8 n% B" o: R$ u$ h
/ J$ ?1 V# d2 ~
SERVER = 'mail.***.com'
0 S" ^$ F5 t. w; R7 k USER = '******': @8 k1 @! k& s. u+ `
PASSWD = '***'; M2 Q0 D" [: p6 W' Q
7 g% `0 g9 Q8 h. ^$ U
strFrom = __format_addr(fromAdd)
; h3 D! Q3 H+ k( x Z+ g& x' ?4 R9 m X7 i% s/ w
strTo = list()
: f* _; T* i- e1 g, g0 H # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化0 D6 K' K% v) F5 f3 R0 A9 @2 `
try:( Z2 o1 F, {) t0 {" U
for a in toAdd:
! a6 Z& i5 x9 D1 A2 D! u1 w8 ] strTo.append(__format_addr(a)), e* d* L3 T. d" Z
except Exception as e:
! Z$ d: F/ e9 @9 P/ X A* o # 没有对a和toadd进行type判断,出错就直接还原
9 }. _+ b* Y2 ` u0 J- S9 x# @ strTo = toAdd
2 d& Q2 [# H; c: |" [* ~& l
5 d, P( j& n. W( K msgRoot = MIMEMultipart('related')) F8 \% Z1 {- @
msgRoot.preamble = 'This is a multi-part message in MIME format.'
' g: ]+ n! m& N
( q7 _' ]! |$ |) X7 C2 z7 M msgAlternative = MIMEMultipart('alternative'); G& Z4 Q9 R$ x
msgRoot.attach(msgAlternative)+ d7 K0 e3 I/ E* \3 v1 |9 I
~3 J7 G( K9 }( ~3 T& @
# 邮件对象
" K4 X4 b6 `5 g4 ]" ^# b% F1 ] msgText = MIMEText(html_text, 'html', 'utf-8')) b9 H' Z" i; s% H
msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化6 O% y$ W- ?; y+ _
msgRoot['From'] = strFrom # 发件人也是被格式化过的% ^5 |$ u8 x* n* s4 ^& P% c
msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
T" J& }3 S* Z8 J' ] B! R/ M msgAlternative.attach(msgText)
* r$ \; @) a0 ]8 P: Z5 ~1 ?, ^0 @" V& I/ l1 @$ D2 @# e
smtp = smtplib.SMTP(SERVER, 11)
# h0 g9 Z* @8 i4 \$ X9 @( w% m$ L4 ~6 p smtp.set_debuglevel(0)
* U4 n) c; ~# j% H8 `1 l9 D # smtp.connect(SERVER)
" `8 ], M' ~- V% @ smtp.login(USER, PASSWD)
+ C: w6 `. [8 u! U6 H, W; j& | # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别8 o; X- k7 W- f* g2 |! c& u) c5 f* l
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
; D. Y3 Q% r4 l, _6 G& g smtp.quit()5 N& V* R3 n: D* v9 k5 Q, z
总结:
" s: Q9 a% u& K: c8 L: R' q0 K) }4 U, H- @6 I1 r, a/ z8 d
看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo# b; d+ y6 E2 U; T" z' v
, h( z& j" {1 t- ~2 `- @; F实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”
" ?- q- D( b' F; o+ p$ U: l4 G( p
同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
4 X% z& C. e, M9 T( j0 T$ V4 ^/ h
- {" B7 H5 V" p2 K; X( g还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
d+ T+ t9 }' `, ~+ l* I最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得9 M6 k9 F' f+ j1 f4 I, X
. b' b; ^7 j' }7 `! Y; `5 A,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员$ r! V, a# \6 f0 o- g
8 ?8 M, i) G: E% U定时讲解Python技术,分享一些学习的方法和需要留意的小细节
, k/ v- Y. G9 t0 y' T9 ]# y% e————————————————
+ A( I" j, B; r" z1 X原文链接:https://blog.csdn.net/haoxun12/article/details/105162947" W1 E2 m+ H5 {' c0 A( U) m
8 q# X A; l, P/ e5 p7 K) e8 T* P5 _% G; _, h; d ?
7 _* g N+ A! Y$ b* ^ |
zan
|