python发送多人邮件没有展示收件人问题的解决方法 * O' ~. s& x5 B5 S% e- q: T这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 - u* a8 o; k2 v1 N背景: % }6 x* d6 x4 ?* c* b! ]1 z0 ^ . s* b0 E4 l# T3 f, d# }工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人 7 n! R+ T$ O; F0 h5 d' P ; H D: z# H, D# k问题:) I, q- m- x) L/ \0 ` D: @
5 A( N3 \# ]: R% h! U
使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容" J$ b- V5 f4 T$ _" W
A3 z3 r5 t- a6 t
问题代码示例:8 A) z* N! [1 j" p5 A
# -*- coding:utf-8 -*- ) }6 c X; b+ z/ F& o6 R- k- z( \8 Eimport smtplib ! J: u0 T. {% ^: q& y Z- T; F, Dfrom email.mime.multipart import MIMEMultipart 9 l6 i3 Q5 P' S- qfrom email.mime.text import MIMEText / y ^4 C. N( P8 @ A' }; [ {8 M- z) } ' ?* h* U1 P9 s6 ]8 U$ \% Vdef send_email_to(fromAdd, toAdd, subject, html_text, filename): - m5 O f! \" \' }7 }' y server = 'mail.****.com' 3 ~* |! f5 K' w; w& B5 [; q user = '*****' 7 Z- G2 Z, x \5 G0 C4 a; _( _ password = '********' 5 x# F: G, U' q5 u4 h/ n . e( L* y% R N& I7 s& `! z0 \ strFrom = fromAdd 3 i9 B6 F8 k+ s1 f9 D strTo = toAdd- n4 A1 [3 L2 x3 M# v
& j) o. x F5 s9 P# U' F msgRoot = MIMEMultipart('related') $ P( p# y+ J, e2 G msgRoot['Subject'] = subject / A2 z: x" N9 m# L0 t# t msgRoot.preamble = 'This is a multi-part message in MIME format.' 5 D, P- Q K% G i) }( J& ^( @7 _3 A+ G msgAlternative = MIMEMultipart('alternative')' Z9 U) c" y+ w9 ^3 V
msgRoot.attach(msgAlternative)+ B' J. c& a5 h; \9 l2 N
5 @6 Y# l+ D$ F
msgText = MIMEText(html_text, 'html', 'utf-8')% r4 k5 z5 v$ ?5 n" B$ L. K
msgAlternative.attach(msgText) : x! ?( Q" r' a$ T. h) l. L. T P$ E6 N% s+ K. q: p' ?. K) y
smtp = smtplib.SMTP() 8 \9 g c6 @3 J( k' C0 u smtp.connect(server) t$ L* S& U/ K
smtp.login(user, passwd), N5 _- j. P$ n5 H; i
8 }+ [$ Z u8 Y att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')6 u& P$ Z6 L e1 H) \9 Y
att5["Content-Type"] = 'application/octet-stream'2 k( m$ S* `( w+ l& T* F! O5 O
att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"' . ?: r L$ f* M- {5 W msgRoot.attach(att5) 0 D& k& d9 k, n9 V: O1 I5 u ^ P/ ]0 |+ i
smtp.sendmail(strFrom, strTo, msgRoot.as_string()) 2 P) c5 g# X" [2 o smtp.quit()1 C3 @3 i2 \9 \' X# R" N
return + p( h: S5 x- n- `- ~! R( M& W% U2 j( t1 Z
5 g/ n3 }& w- J3 ]成功代码:' ?6 |$ b4 N7 ~: j) V
#!/usr/bin/env python/ Z; U! D- ] y* X
# -*- coding: utf-8 -*-, W3 N2 r; I5 e2 E$ g7 I: `
! @% f! f* i9 O6 g5 Z0 {$ y* _$ _
import smtplib * r: r4 \1 `" e& ]from email.mime.multipart import MIMEMultipart1 W- v* _* K3 n% j0 z
from email.mime.text import MIMEText 1 t8 p4 {4 e/ X4 B. dfrom email.utils import parseaddr 4 ~* {' e3 @. @from email.utils import formataddr% a) p' e' _- A- P
from email.header import Header U1 ]! ^- Z, E6 M
% g6 j5 j1 |8 K* `; ]6 c$ l- B3 \* O0 X& p4 C
def __format_addr__(addr):/ W( b) a% W' Q6 j7 K5 l
# 解析邮件地址,以保证邮有别名可以显示% Z/ B4 F# _) m* s
alias_name, addr = parseaddr(addr)" l& Z% C, w3 k8 ~1 m
# 防止中文问题,进行转码处理,并格式化为str返回 0 j& u H. {8 D; u& o return formataddr((Header(alias_name,charset="utf-8").encode(), ]" }/ x8 v* l5 J
addr.encode("uft-8") if isinstance(addr, unicode) else addr))3 {" A E E; @2 T
3 z1 g9 g) n$ M# }. H H, u8 G) E& `) t
5 [6 S) _/ a& X% R
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None): 3 v) L' q9 b0 P* c9 N$ \ c6 S9 |8 B- t: b: l a2 n7 G8 G
SERVER = 'mail.***.com' 3 D' E9 r I, x" k' E$ b0 y, e USER = '******' * x% b }$ Q( z PASSWD = '***'4 E2 w8 M* p2 j
; v/ _4 f- T! p2 r- x
strFrom = __format_addr(fromAdd) & C/ b$ U* Z8 F. h* S* k4 [0 f# i& [- k5 {2 `: _
strTo = list() 3 e$ m0 A" r9 N: k' A8 P' R" ? # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化 0 `9 [7 ]) J6 Q& a5 B9 @ try: 6 z/ o5 J1 t% B& h for a in toAdd:, k2 m8 C; Q* h# I8 C5 }! ?3 R4 ^
strTo.append(__format_addr(a)) 9 c$ g9 E2 z$ }8 V; V& g* J except Exception as e:5 x! l( S# f; F( V
# 没有对a和toadd进行type判断,出错就直接还原 % B) q% Z' x" Q3 N* z% \ strTo = toAdd7 {8 l+ P4 l6 s1 L" T5 g0 S
0 L$ h- O! i, ~7 J1 _
msgRoot = MIMEMultipart('related')5 r4 |6 l' c1 y$ h
msgRoot.preamble = 'This is a multi-part message in MIME format.' + c0 G+ |( A v. p3 M1 g8 _5 t4 Y) M. s5 U: T5 v# Q
msgAlternative = MIMEMultipart('alternative') . t$ V1 w8 R0 T/ u/ F msgRoot.attach(msgAlternative). r0 L5 L' s8 W
4 D! }) u2 q4 f' G' E! Z
# 邮件对象 / k2 H# `/ Z V& ^0 r6 p( u0 L msgText = MIMEText(html_text, 'html', 'utf-8') * |7 Z: u: p* S+ ^3 \' l4 ~( K msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化 6 s6 k6 Z6 W0 G. u4 C# b msgRoot['From'] = strFrom # 发件人也是被格式化过的 ( O) H: D* b+ K# A* A msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'” : m% s0 b c/ A6 C3 ~4 j0 y( z6 Y msgAlternative.attach(msgText)" B4 C) j" I' w
q ?; [6 ^0 v5 Q% l smtp = smtplib.SMTP(SERVER, 11) 0 ]* U9 J% K0 i smtp.set_debuglevel(0)6 _- M8 ]! t) B( Y* u r \
# smtp.connect(SERVER)+ \" a) ]% Q$ n% z& o
smtp.login(USER, PASSWD) ) l" F6 h+ t& f$ }; A8 T, T8 X" ? # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别% l! Q# i, _! X9 t4 x l
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())9 }' c8 S( k5 J; x
smtp.quit()3 [* o8 d: x1 Z$ J6 _7 J3 t
总结: 1 t9 g4 z# ]0 p: c% n/ C9 o 3 x& N# e2 E2 z看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo9 v4 t2 {) _1 A. ?+ |
+ A: T, r6 p8 P; I' v( P5 k
实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’” $ }3 \ t1 v0 t' v: X 2 v) s. r. p9 {( {同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型 0 a" g& G4 `/ g* B0 P& y/ }* J- l( l( q; R6 o
还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。; ]2 W1 B' Z2 X# W
最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得 * p" l2 @. J8 }7 X; ^' x5 h5 \5 e+ ` 3 ^' s4 N" l, u! o4 ~$ V$ Z,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员 5 t% N" B( j8 O5 B6 |. v- k* r. q2 o% W9 X' ~, X; L
定时讲解Python技术,分享一些学习的方法和需要留意的小细节& s( l& Y5 J( s3 u" |" f/ h
———————————————— 8 p9 E' r. e0 g原文链接:https://blog.csdn.net/haoxun12/article/details/105162947 ; u n# H& a; _% E, N! F3 N0 U% l' }
# ]) d- V1 S* {* Y3 h" Z