- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563374 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174235
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python发送多人邮件没有展示收件人问题的解决方法. N5 k* t9 q2 x4 \: J, x% A- ~
这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
1 ^3 w* `$ x( T" |2 o Y背景: A9 }9 u. c' j5 [# d
( k/ p5 W; q% a; i
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人# n( P, T. Q6 i4 ^7 M7 D
; s8 w {/ z) i, l' j/ |8 ~问题:
" q( Q _- u% v5 V+ G8 [0 j
n4 M+ K9 ~- w- @使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
; t1 Q6 A+ ^1 m W4 H% T2 }3 m" [0 a6 {3 B- q' |' Z& p
问题代码示例:' q9 ~- o, e! I7 j$ G
# -*- coding:utf-8 -*-" @5 B8 g7 Z3 n: U [# S7 N5 z% \+ D
import smtplib, Y5 X( ]/ _: z- j) W8 a% a
from email.mime.multipart import MIMEMultipart0 Q4 T* J' n9 v3 Z/ @
from email.mime.text import MIMEText
5 m! J& m8 V6 J5 d$ f& @( E: B/ r% f" u7 J2 C2 b' }
def send_email_to(fromAdd, toAdd, subject, html_text, filename):
% C4 k! w5 Y( a8 T8 ]' H, f server = 'mail.****.com'
7 s. f. }9 V& v& K. q user = '*****'
" @" Y0 C3 x o% v" g# ?1 g password = '********'" d& x d: |, H. [0 b" _: U: U
+ Z) _; g8 g( L strFrom = fromAdd
, m/ ?0 K. Z& e strTo = toAdd- y' H; v, Z" s1 }/ @
, b2 I" k1 |, @( P( w% C" g msgRoot = MIMEMultipart('related')
- o) b! f# J5 D/ J msgRoot['Subject'] = subject
; K: h8 C/ g1 p6 F msgRoot.preamble = 'This is a multi-part message in MIME format.'
S7 w4 u2 S, [$ o e
" z: O& y1 U% n8 R2 Z4 o msgAlternative = MIMEMultipart('alternative')
0 [- V+ {. I% y) V5 [5 n% i- X6 D msgRoot.attach(msgAlternative)
( n% h) t" p7 v0 R' q5 {( a) i3 n% g9 E, N* O0 v
msgText = MIMEText(html_text, 'html', 'utf-8')# J4 }" c9 t7 p A0 b$ `: T
msgAlternative.attach(msgText)
6 x) U6 M( `8 c5 A. Y; |6 t- m1 N8 l3 r; [: K7 v
smtp = smtplib.SMTP(): [' e7 v0 @+ l& |
smtp.connect(server)0 T1 Q' O3 S# f- `7 U" C8 r
smtp.login(user, passwd)
. H/ C1 I: Q) ?8 B0 u! K+ y2 c% ~' L7 h8 s! A. Z
att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
1 E" y* h* P3 g6 j att5["Content-Type"] = 'application/octet-stream') Q* D: ?4 @0 U; i4 r: r, v+ U
att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'( p- I) M% c) L4 X
msgRoot.attach(att5)/ x) W& y" s3 t1 F3 K
' h- [! J2 T9 y9 W6 ?3 v' J5 m2 x# V7 i7 U
smtp.sendmail(strFrom, strTo, msgRoot.as_string())# D# _- [) V5 Q3 N$ I0 S
smtp.quit()
. N. c7 b r6 N return
( w/ f% T' u) x% F( _$ f1 k9 z" S$ P5 s
$ t' ^% G N0 N$ y; M成功代码:
/ V, C' ?# m( D- z#!/usr/bin/env python E. p$ u7 s- A
# -*- coding: utf-8 -*-1 a1 R- b% C! l+ {8 G! ?1 U+ _3 X
$ _: @$ n9 J' B3 Q( E9 ^
import smtplib: ?3 V F! h3 F, D3 g9 D1 G$ a( ^7 f) ?6 M
from email.mime.multipart import MIMEMultipart
4 I$ L d9 s' f7 u0 l4 Sfrom email.mime.text import MIMEText& n4 w, F" O8 n
from email.utils import parseaddr
# R7 v- M5 ^6 Z! Efrom email.utils import formataddr& ]9 B" L. C2 q9 B$ p
from email.header import Header
8 K5 U/ @; o/ T, y$ c5 u i0 w9 h6 X6 h1 ]9 ^3 d
# v1 I/ l7 k% q cdef __format_addr__(addr):
/ E0 L" i. x8 g# G6 o' c # 解析邮件地址,以保证邮有别名可以显示
/ {9 h3 j z# P& Q alias_name, addr = parseaddr(addr): b( A8 M4 e) H5 Z
# 防止中文问题,进行转码处理,并格式化为str返回
' n3 P O n6 g: z+ e" p, D. q1 J return formataddr((Header(alias_name,charset="utf-8").encode(),
5 y4 G2 y: `& x( F) U addr.encode("uft-8") if isinstance(addr, unicode) else addr))
# \: J! J5 n4 a, s/ A' v
' k# q# C& `# r* q( T* K8 L- q D6 @, y4 ~. E" r& q- u
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):4 C4 b1 w8 P# e% t9 I' Z
7 N9 _9 ?- p$ M" m
SERVER = 'mail.***.com'4 H, b" y% q. ?8 h, p: N
USER = '******'
/ O- P" W% ~4 f7 f& L PASSWD = '***'
$ {9 k1 Z1 N3 @+ o4 R! e* l1 [4 t; T: z6 @2 t
strFrom = __format_addr(fromAdd)) f+ ?( d) q# O& R: I1 l. X" f
+ n" {3 W# n9 Z& E, Q strTo = list()
1 ^5 l: Y1 ^1 C- Z # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化1 }$ e' l. j& d! V) j
try:
" N' I' V- o, T3 I8 p0 \ for a in toAdd:0 m& t' K; T* z$ P4 s
strTo.append(__format_addr(a))6 t1 T: n6 z, w; t. i
except Exception as e:! w5 e+ ^: h3 N& @ V' c6 }
# 没有对a和toadd进行type判断,出错就直接还原) b1 D# @ G# P& M1 }
strTo = toAdd% P1 I4 ~+ |& s
' `6 f: ~8 _$ l: K msgRoot = MIMEMultipart('related')
" v! s9 w9 K: X$ T" Q msgRoot.preamble = 'This is a multi-part message in MIME format.'
$ G& [/ J/ Q2 L, w7 k9 m: ]4 Z' {
msgAlternative = MIMEMultipart('alternative')
" l; w3 \$ G" k7 e* p6 Y% ] msgRoot.attach(msgAlternative)' d8 e8 D4 M* F4 m8 d) d6 \) R" W) Q
" J0 I& o8 v2 Y5 m/ X9 L3 n- H # 邮件对象 ' H; ?/ \( `3 b) i4 |1 i% J/ t
msgText = MIMEText(html_text, 'html', 'utf-8')8 m; N. e8 g8 E0 H& `7 R1 }; Z
msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
9 L" ~% Y% a7 I0 Q0 u. n1 y msgRoot['From'] = strFrom # 发件人也是被格式化过的
: G1 G, L8 }; |! R msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”* \2 i( a8 a3 n K; g) Z$ @, `
msgAlternative.attach(msgText)$ Z( W) D G) T5 i$ C* t5 v( m
9 u% C; n) H; g* b smtp = smtplib.SMTP(SERVER, 11)
0 K$ X: S- {$ L# Z, a/ p1 ^) T" ]5 D smtp.set_debuglevel(0)3 z8 T& C7 f* @% Y$ Y2 l7 L
# smtp.connect(SERVER)
' W% D6 F/ I5 R# X$ [) r smtp.login(USER, PASSWD)
1 P) J n" k8 y! v # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别4 w! O/ r- P4 a3 u( d% x1 h5 b
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())2 x: V, \7 @8 J N2 q) Q4 o
smtp.quit()
: Y1 ^' z( W4 V; i总结:# @ b) H3 [( L+ Q8 {
! }4 F. ~) {! R' d9 a3 S. f看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
1 q) ^- n2 n' L, k9 C3 I
3 {. E/ ~* [! T: E$ j实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”) G9 q9 L0 z: g6 ?: r
- O% y% W- }, D' a, W同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
) T$ B" {" n+ s/ z
5 Z* A' B3 Q, u# C还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
6 R# ~/ G5 R2 u% o最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
, V. z) _/ b# V/ o1 @( K0 P
8 [' d% s/ i$ e3 P,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员( E8 u- J$ K9 a4 Q; {. i# V
4 y* d p+ q% o2 k% y; F
定时讲解Python技术,分享一些学习的方法和需要留意的小细节7 L) K# D8 y! ?% E: c, s+ z
————————————————: R1 c- \2 t) M' H, }( `# u
原文链接:https://blog.csdn.net/haoxun12/article/details/105162947# L) p3 I- Q* e0 L
% s4 p; G1 i& n. V9 Z8 j
# W) f) A# J+ T* t
# C0 P S/ [* L* ^
|
zan
|