- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563377 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174236
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python发送多人邮件没有展示收件人问题的解决方法
7 p; \+ M2 R9 E0 ~( z这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
$ f. N" [/ }2 Y8 u/ v; k背景:
: ~0 y) V4 E( D" t8 F5 `8 [& S' A% m5 W ^3 c- @
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
9 z7 ?; {: W0 Q2 d
# S6 p+ v" v8 i+ S/ W3 h6 Q5 l问题:
; e% c! c* R3 _" @6 t1 W( h
* Z0 p7 ?; {+ X' ?& b使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
4 o W+ Y7 i% u$ \
% j I# i% J2 J9 _# t0 l4 T9 ]: B% x! V问题代码示例:
. q, X# o ?! e+ \5 B# -*- coding:utf-8 -*-( B% _ H* I3 A, P9 n1 n
import smtplib
7 y% ^$ F. h6 V2 |$ Kfrom email.mime.multipart import MIMEMultipart2 @+ i& B; l6 x( ?& j
from email.mime.text import MIMEText
) @; |1 w; `- I: z& W& \( q) B z
$ P; K4 c2 N+ p% }& @def send_email_to(fromAdd, toAdd, subject, html_text, filename):9 M" V! B9 v5 c# a) O
server = 'mail.****.com'
" [) T6 _2 U4 s6 f# @( C user = '*****'
, c" S8 Q9 ?2 A$ P password = '********'4 }% w- N$ {! C2 b5 q" U4 _
! H5 r1 S6 [+ R. U) v S& o strFrom = fromAdd
f( O' e$ ?( U1 `/ L3 o strTo = toAdd
+ u1 }( W& D* D$ i+ A' f u2 Z% ~" I7 V/ P: D* v0 l, K% j' `
msgRoot = MIMEMultipart('related')
& d/ G8 R# x5 R4 \ msgRoot['Subject'] = subject
% l/ Q8 T9 L) Y4 G/ J; |$ r( @ B2 ] msgRoot.preamble = 'This is a multi-part message in MIME format.'
, Y! d' s$ {7 p7 s, H) v# u/ B
- \7 y9 y9 M n0 f- d msgAlternative = MIMEMultipart('alternative')
8 g& R6 I) W! }' o6 d$ k4 W) | msgRoot.attach(msgAlternative)4 ~' a1 g9 c) I1 j; H& v+ @/ {0 {7 ^6 r
4 T. J4 B( k6 S5 r1 _. f msgText = MIMEText(html_text, 'html', 'utf-8')3 \% Z+ O& r' R
msgAlternative.attach(msgText) a# S" j3 Z, l. F" ?
% J" |! U/ O0 f
smtp = smtplib.SMTP()
) q* I: g1 t k+ R smtp.connect(server)2 T& T B1 s: h6 C$ s
smtp.login(user, passwd)
$ ^: J/ _+ b( v7 x# M2 C6 c3 v1 X# A5 W, C
att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')2 e5 t* k3 U" Q* `
att5["Content-Type"] = 'application/octet-stream'
1 T7 u7 Q' B2 q3 C5 v. ? att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'. c- z* V# F- L7 B
msgRoot.attach(att5)
3 l' D+ D6 I4 h( M+ d' E: ^! {7 }* T, {
smtp.sendmail(strFrom, strTo, msgRoot.as_string())
- p5 _ n5 L' r6 z/ ~ smtp.quit()
d# u: P/ B0 u0 ~, [! { return
6 V8 j$ R* C" c1 l2 y8 @
& s S* S. y: z6 @' y' l& `
0 K1 }6 t- f7 ? N成功代码:, `: h/ f* [- a5 k/ i c
#!/usr/bin/env python
, R' Z3 o7 \3 R# -*- coding: utf-8 -*-
) S% e% [6 [8 N" ?5 F0 |4 w1 ~1 e0 v/ D
import smtplib( h/ \; o& i9 O+ H F6 `' j2 q
from email.mime.multipart import MIMEMultipart
: `; ~8 x# L4 t; `! \, H. efrom email.mime.text import MIMEText9 `& I& P6 U9 Y$ k1 ?
from email.utils import parseaddr* |- b: p$ [) J5 X
from email.utils import formataddr
) W9 V4 _7 b/ ~; vfrom email.header import Header l- J$ \, P) Q& F
( }! i) [2 D6 f0 z0 I$ x' q7 L" M) M3 o! \9 D% N" c( Z G
def __format_addr__(addr): A# ^& X+ p* T$ S: a
# 解析邮件地址,以保证邮有别名可以显示3 E0 ? A6 I# W! m
alias_name, addr = parseaddr(addr)9 @7 X/ q: [) U& F' G- L2 W
# 防止中文问题,进行转码处理,并格式化为str返回
`: c% {5 _$ t return formataddr((Header(alias_name,charset="utf-8").encode(),7 S+ c: g8 m: h2 L) X% x8 J
addr.encode("uft-8") if isinstance(addr, unicode) else addr))
a& d# B) z* x/ |1 F" n9 N0 E) ^+ N: p3 u+ E6 W" C# M" l# _
1 a7 @8 W: L; @: X" \* b J
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
% s& G" S0 b( B1 |/ O6 S
: L$ x+ K2 f6 m+ D, d) T7 P SERVER = 'mail.***.com'6 U6 j: u5 ?7 d2 O+ i' \& f8 M R! C
USER = '******'0 x( U+ J- L1 e% N% ^3 t
PASSWD = '***'
; a& G& L# Y/ X6 q: |1 U! x7 d- ^% M
strFrom = __format_addr(fromAdd)
- e( O4 W' s0 r+ L l
& I) H; A8 g; { strTo = list()
' c3 b" v8 Z% h, D% X& o # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化! B4 S2 D- j3 h6 b/ N m
try:, y/ t( f8 N( u! a
for a in toAdd:6 v# c& v" z0 ^ {3 A, d7 j4 {
strTo.append(__format_addr(a)) `4 q, z, v- q) G6 e8 o
except Exception as e:/ J% f- d! U( |% G, R9 T: H/ a- ]& C
# 没有对a和toadd进行type判断,出错就直接还原3 X( |! }7 T$ Z* c! J2 _
strTo = toAdd
* k+ @! A2 Z9 m: U+ C) w
+ @7 C: }2 e6 J1 l msgRoot = MIMEMultipart('related'), n% J2 ~* f$ F
msgRoot.preamble = 'This is a multi-part message in MIME format.'! c2 Q' A R/ J0 q5 Q8 A
$ _! f& @' ?+ m5 ^, f/ v4 M msgAlternative = MIMEMultipart('alternative')
" t7 m1 H( M4 [; Z# @6 j msgRoot.attach(msgAlternative)3 P, L8 B! h8 P( s9 L
- l& Z6 Q3 P$ n # 邮件对象
" X( c1 {, x, k5 C. z msgText = MIMEText(html_text, 'html', 'utf-8')) b2 _' I M( j+ P* E7 u
msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
8 p% S( h" d; s4 g1 T2 k msgRoot['From'] = strFrom # 发件人也是被格式化过的
! b7 W1 d0 S4 D% z& } msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
( U! K' \) h) s; p& j( H msgAlternative.attach(msgText)
! |$ C& J! U. O+ k, I+ N, l* X; o
smtp = smtplib.SMTP(SERVER, 11)
, n! G( i* n1 Y smtp.set_debuglevel(0)9 J, |2 a9 `$ D( h1 v# K
# smtp.connect(SERVER)
- ?/ c: J, r7 I6 [2 H5 G% \ smtp.login(USER, PASSWD)9 L6 P2 r0 G+ J
# 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别- n7 V* B' s; ]7 {! Y" @
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
- E( i( \5 q" L+ L3 x9 y& M; y( Q smtp.quit()
& A% u4 w. h8 Y( J" x" m总结:: h1 t6 l; v. a8 y
: m" }' c3 H* s! u, b看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo* p0 D5 w" q& X3 I# o1 O6 n
! n A/ E) N4 ^3 E+ c+ S8 W实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”) o( `* f& _* i/ J$ D( V
2 C$ F$ ~8 O7 S, T( ?
同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型* j L9 _; T _" g) x' S0 v4 ?
% u |1 Z7 d& @4 j4 M: n
还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
: z' n3 q# K, T' j最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
. y: M3 o% F7 I; {
7 K6 R, @7 V) o,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员6 m# a, V7 N9 J6 e
8 R7 G N: t( x6 J* L定时讲解Python技术,分享一些学习的方法和需要留意的小细节3 y; n( F* |2 c1 o2 K2 o4 P
————————————————
' h1 m% a' I& F6 }原文链接:https://blog.csdn.net/haoxun12/article/details/105162947; `$ T# p' M" T, x* x! v, n% x
/ T, O8 D* R* G; F3 ^0 y# F+ G
8 V! g. A0 L+ \: k- W
: d8 M0 X- q7 l2 [! q! E- T
|
zan
|