- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565359 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174831
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python发送多人邮件没有展示收件人问题的解决方法* r. Q. g: l, Y
这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下4 ]2 i* B6 k* x% h# V0 ?
背景:3 G$ d( M/ V4 b' V
p% f+ d8 T7 R工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
1 f- H8 Y' x* w, D; q5 o, i& B4 u+ v% s! x- j* u# P% g
问题:
8 T+ W% d+ h. B$ ?. ?8 e1 S( v- X1 j$ I* g4 h7 q/ v
使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
9 c0 ?5 L: t0 A1 i Y/ z$ W2 b# r4 r* A, N: _7 W
问题代码示例:: o% j1 M+ y* T
# -*- coding:utf-8 -*-" a" v0 D9 X3 v1 Y9 y1 J8 o$ A
import smtplib% k d. ^6 i9 A: ~
from email.mime.multipart import MIMEMultipart
* M# t2 v4 {! y; }& V% ~from email.mime.text import MIMEText
6 S& \' Z4 U& ^7 C. H6 V
3 D* n4 I. k7 f" q5 t Qdef send_email_to(fromAdd, toAdd, subject, html_text, filename):, q! X$ B. \" K3 j& z/ o/ T
server = 'mail.****.com'* T" ?7 o# M. O& `. S* p: u4 D/ |
user = '*****'
# v2 J/ \& P: W password = '********'
, ~/ I# ^5 O6 ~, M( j& p2 W7 |* l( J" `9 o
strFrom = fromAdd1 |( b: `7 |; ^
strTo = toAdd
( A& Z4 i! {& D3 \* l8 [
% ?. J; Q1 ?" I/ z9 c; {6 E& ? msgRoot = MIMEMultipart('related')% P' a# k, e" x1 \
msgRoot['Subject'] = subject
) R) U) o4 n6 u0 p2 c% s' ] msgRoot.preamble = 'This is a multi-part message in MIME format.'; Q& ?% f9 p+ m
! \- i" W# Z t7 M# g# L( U& L; Y
msgAlternative = MIMEMultipart('alternative')
7 N/ |7 e$ X3 { msgRoot.attach(msgAlternative)
7 {6 a! Y# G# J8 g/ p& w
5 G) J: |0 f! z/ c. u0 ]9 z5 i1 d* e! z msgText = MIMEText(html_text, 'html', 'utf-8')
4 z$ C; p, W/ v; z& n; `" Y msgAlternative.attach(msgText), q+ I1 [7 b! P7 ^( H5 F
$ |( Q1 m3 |6 p7 a$ Z9 H0 a2 o smtp = smtplib.SMTP()
6 @- A& F) \8 g( m# i. g smtp.connect(server) D0 `( f7 l( K+ C1 k
smtp.login(user, passwd)) [8 g/ h7 Y- y1 W( n- ~9 V
7 {/ \5 F; N& v att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
( X5 A$ p8 c* `5 S$ D/ i1 F att5["Content-Type"] = 'application/octet-stream'
' W, E q' g' H- \6 J% |2 P att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
& j" g/ j& {; C/ a# K3 R msgRoot.attach(att5)' k& W' h6 w6 F6 t4 W* I) v, y$ v
0 q4 j6 E1 [( C9 G& s smtp.sendmail(strFrom, strTo, msgRoot.as_string())
7 B( a* {- d2 i4 O" u- {8 @: q smtp.quit()4 U+ s3 B5 `( u+ f) ]
return
. |7 p' a+ C' e& A$ f' B
' M |" z9 c7 ~+ J) O# z5 ^ I k1 u5 [$ B
成功代码:
; N0 o6 f: ^# ]#!/usr/bin/env python
( L+ L+ M6 j E8 c/ X3 K& Q# -*- coding: utf-8 -*-9 ~7 d1 D2 w1 x
& I1 f& m9 ~4 A" C1 R: M; oimport smtplib5 ~2 ?( z9 Q2 O$ M
from email.mime.multipart import MIMEMultipart6 I8 K( w$ ~% E
from email.mime.text import MIMEText, f2 x: t4 e# a! U9 \
from email.utils import parseaddr
# |; _# o# `9 ?& Mfrom email.utils import formataddr+ {5 B2 \2 _1 J! U- ]9 f% c
from email.header import Header
G8 ~0 T! u3 t( h
+ f/ b2 t3 \1 L# @: x3 z9 y5 u# _" C7 n/ R" `
def __format_addr__(addr):5 C. U1 k1 ]& A) Y2 K
# 解析邮件地址,以保证邮有别名可以显示) ^& u5 V! B. h i& ^
alias_name, addr = parseaddr(addr)8 K/ P) s/ Q. \* Y2 ?
# 防止中文问题,进行转码处理,并格式化为str返回
2 A2 ~0 I. M& u( W return formataddr((Header(alias_name,charset="utf-8").encode(),4 J; f& w/ s4 o2 @! E+ w; }0 y
addr.encode("uft-8") if isinstance(addr, unicode) else addr))
' }, _" g* }6 h- ?" g) q
9 z9 M0 ]" p6 ?" n6 O& H8 S% K
; P$ Y7 l ?; {* \3 Idef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):: i9 J/ C" w3 p$ M
* ~) E0 B# b4 j" @
SERVER = 'mail.***.com'
& C& B: O% T, G7 r: @' G1 D7 u, i USER = '******'
6 a9 |. S2 o6 I: y1 [; ?1 z PASSWD = '***'
0 S$ K% q6 a$ I
2 w, ^8 \+ r* |8 a$ g strFrom = __format_addr(fromAdd)# m7 r" I* d6 g. P0 K
2 A7 @' ~# F' F @* }/ k1 b
strTo = list()
4 h% D$ U$ ]; d # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
3 j! d' [. k: t" ]7 O4 s. c try:) Q+ Z* [( q4 B% @
for a in toAdd:& I: I% I+ R! y/ s" ?
strTo.append(__format_addr(a))1 E F5 G, O7 |: [1 z
except Exception as e:) {9 {: {; N1 R J) q0 ]
# 没有对a和toadd进行type判断,出错就直接还原1 _/ t6 ?, }, ?. d- [) n
strTo = toAdd+ [" O: R3 O4 ^- d2 I$ \, P7 o
* [4 C- G/ c$ |" t6 k1 t. a7 i msgRoot = MIMEMultipart('related')- x* |& q. Y* j) F
msgRoot.preamble = 'This is a multi-part message in MIME format.'
2 D9 ~$ w# T; A& t- q/ F7 {( M! g/ K; x
msgAlternative = MIMEMultipart('alternative'). ^" q& N: p* s4 Z
msgRoot.attach(msgAlternative)
6 x y6 ^9 N/ @8 u3 _ T# j, l, l, U% Y8 b
# 邮件对象 # @+ `9 X1 L5 u% G M( D
msgText = MIMEText(html_text, 'html', 'utf-8') _ o* r' [# l8 Q9 y
msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化4 i4 Z, I7 `& S4 {
msgRoot['From'] = strFrom # 发件人也是被格式化过的
! w |; P* m. ^ msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
1 Y0 n: Q' o" F1 g msgAlternative.attach(msgText)/ @' }3 u. I g& ]% `! r2 ?( P
; y _- s! d9 j' v, X smtp = smtplib.SMTP(SERVER, 11)4 Q' H& o2 y- v8 G
smtp.set_debuglevel(0)
- O V2 ]0 u' C4 v3 @1 H # smtp.connect(SERVER)
2 e& R# Z# Z8 y1 P @ smtp.login(USER, PASSWD)
; F! F& s6 O. o" S" k& Y # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
& }" `5 K4 t+ X% [ smtp.sendmail(fromAdd, toAdd, msgRoot.as_string()) B8 P0 k: s/ A$ y
smtp.quit()
4 j( h/ ^8 E7 T* l9 r, P( P总结:
' M% E2 h8 h% M* I M& G" u2 r( c; C9 K) M
看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
0 X3 A! w) M: G, r( L& n
1 ]0 J8 r6 ^# \" a8 [/ Z- A实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”6 Z. q+ S( z3 v. ^6 J) S! A
( v9 _ w# L& W _3 q1 Q% w0 V同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型) b" c) T" N: h9 S, U6 S
( b$ h* N" ], k2 |, L0 ]还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。. h: j2 H! G; ^: _( R! G
最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
$ f# X3 }3 {4 r: f- O1 T4 w+ M
! B# ?' k/ y$ G,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
8 F3 i7 e0 j) I7 P
0 U" \ B/ Z( l定时讲解Python技术,分享一些学习的方法和需要留意的小细节
( f, i2 S$ N4 p$ S0 s0 T% S/ @————————————————7 R/ a5 I5 d6 k- K& \- \6 [2 E
原文链接:https://blog.csdn.net/haoxun12/article/details/1051629473 B; ?, Y4 @4 i8 ^
; I$ {: ?; F6 Q+ p% d( |
. S; Y2 x0 k- q+ _, T) `, I2 c: ]
% Q: x6 Q' D }
|
zan
|