数学建模社区-数学中国

标题: python发送多人邮件没有展示收件人问题的解决方法 [打印本页]

作者: 杨利霞    时间: 2020-3-30 11:14
标题: python发送多人邮件没有展示收件人问题的解决方法
python发送多人邮件没有展示收件人问题的解决方法
/ W* Z0 b. y0 _2 l) j这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下  U) ^# a4 p* O9 Q
背景:
. }3 E5 R$ @& F  O
1 L; e& K& l- @工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
: W- f& S; x  O! m" r8 R4 J/ X9 d' E! L4 S
问题:& s9 L7 n, Y1 s& G- ?
9 B( W4 X3 h* }& i4 O
使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容" f0 [8 R& x/ u9 \
& g9 o2 s9 U4 R/ k4 R
问题代码示例:
7 n  v# f" \) I. z8 R8 {3 _' X" U2 t1 E# -*- coding:utf-8 -*-( E" @2 V% H$ e' p9 ?: B
import smtplib4 k$ x' A6 @( M
from email.mime.multipart import MIMEMultipart
9 A7 g9 v( j# ~; g. Efrom email.mime.text import MIMEText
3 d3 ]' K! _- l, _0 M0 g# U4 n9 s# V8 D, g- e! a# f
def send_email_to(fromAdd, toAdd, subject, html_text, filename):
+ V$ u+ |4 r  ?. V server = 'mail.****.com'6 w/ c) a% t( I0 y+ [2 ]$ T8 M
user = '*****'
* {( {9 z1 e$ u; |$ ?( R9 g# k password = '********'
3 t; {" c, r6 B2 n+ b+ _# K( C
3 ?7 }4 }+ T' A& i) d. w strFrom = fromAdd( q0 T) i# P9 B' r7 _
strTo = toAdd" \8 s6 d8 I% n4 W: g3 a: @% N( f% L

& q" Y8 J2 T% q5 M msgRoot = MIMEMultipart('related')* t- t1 R8 y- F4 `
msgRoot['Subject'] = subject
& A  e1 Q( J5 o0 O( t1 `+ c msgRoot.preamble = 'This is a multi-part message in MIME format.'. d  [5 B1 i- w  X1 z7 \) E

& @. J4 E$ U' @3 @, _5 x msgAlternative = MIMEMultipart('alternative'): B9 H2 Z* ^+ @6 W# _
msgRoot.attach(msgAlternative)
1 Q4 |/ _% j- {- {2 G) q0 w) M1 Y% B* I3 S' t+ N) o" H5 ~
msgText = MIMEText(html_text, 'html', 'utf-8')
  I6 ?$ h% n; m- s  y msgAlternative.attach(msgText)
/ |# E$ M  Q& X0 r; e) P7 a# C* p; ^) G& v* h0 o
smtp = smtplib.SMTP()% a) B& @+ s: G
smtp.connect(server)
) [& n  B/ a( l9 C smtp.login(user, passwd)
- Z9 t# R, B; w1 O$ ]! A; O9 L3 {! ]( c/ |8 ~4 O& A5 s6 v
att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
2 [8 w/ j( F4 l* n" i' S8 e) v att5["Content-Type"] = 'application/octet-stream'
# R7 V5 _9 R; [8 Y att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
, D7 y* Y0 b  k2 i6 r msgRoot.attach(att5)
3 Q% M+ x+ A, a" _- f5 ]: h1 y; N9 t4 B  L) _( E
smtp.sendmail(strFrom, strTo, msgRoot.as_string())5 ~: T% r  y/ E6 B" i& N- m2 @
smtp.quit()
$ e' U0 O1 y( U  I; r return
9 H9 B. [  j5 E2 l
% X3 }- y6 Z5 Q8 g  K$ p! _% `% x4 H7 j8 J: G9 g$ Q1 p# w! |; g
成功代码:, ]' {7 [' M0 I. o4 W
#!/usr/bin/env python
. v7 R( H8 p1 s7 k" q8 I; T# -*- coding: utf-8 -*-
$ ^3 L* E0 z- x: e) Q0 _. h# p' }# |' ^; j
import smtplib
" c5 A: T6 ?7 Rfrom email.mime.multipart import MIMEMultipart2 ?( h* Y1 r# u
from email.mime.text import MIMEText
2 N) o% o6 M5 K! C0 e, Afrom email.utils import parseaddr
  d, Y; x6 E6 o3 Yfrom email.utils import formataddr9 A, [4 Y- ~% h7 @7 A+ Z9 t
from email.header import Header
$ M3 `1 C. ?# p$ y4 |3 ]3 [
. u* s) t  l2 ?+ k5 s/ ^3 W* U7 p9 s3 {9 f+ a8 u
def __format_addr__(addr):
7 o7 A  K1 I( _3 h # 解析邮件地址,以保证邮有别名可以显示
. b2 m) k" L: n alias_name, addr = parseaddr(addr)
6 v8 D% S" m' p2 d9 Y: p # 防止中文问题,进行转码处理,并格式化为str返回
: l- J2 `' H" q return formataddr((Header(alias_name,charset="utf-8").encode(),% c+ n/ ?1 C! |) u6 m  ?
      addr.encode("uft-8") if isinstance(addr, unicode) else addr))) ]9 _8 o% j- V& R7 J% S

' S/ T& a: r$ B/ g8 ]1 u( V
$ E: q4 I+ v3 s9 u& r4 q. c' Bdef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):2 L8 Y* a4 W" r' H' J
) H6 j; R; Z* M' A
SERVER = 'mail.***.com'
+ h$ y: X/ W6 o8 q6 X4 a" E USER = '******'
6 s8 n' e9 S; Q PASSWD = '***'2 v8 b5 J% X8 R8 n
8 T& j7 T0 o# N* e+ ?
strFrom = __format_addr(fromAdd)
+ f$ c6 m) V% ]" t$ K/ b- h5 \+ d3 V; q. P
strTo = list()- O5 u" D: X1 i* C
# 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化5 x- X3 a) [3 l2 e* u, z
try:
$ D0 g* o& J$ }  for a in toAdd:+ ?- G( ]4 F  M9 ^
   strTo.append(__format_addr(a))
0 r4 ^3 q& G  j: X4 b6 J+ N except Exception as e:- E# \. q1 I/ d, N$ i
  # 没有对a和toadd进行type判断,出错就直接还原
% ]2 n. k3 D- y: l+ z, l  strTo = toAdd
  U' K  O4 L! ^# \" K6 K) U: t" W* o0 c* Q9 T! G6 V/ a2 p
msgRoot = MIMEMultipart('related')( r( T$ ^5 s0 s6 ?; ]. H
msgRoot.preamble = 'This is a multi-part message in MIME format.'- R& J, r9 n* x- [

0 b, B, }& f( c# V- {2 P4 a msgAlternative = MIMEMultipart('alternative')
4 K% D9 L. L0 h# s5 m msgRoot.attach(msgAlternative). T0 u, e4 Z$ x
. x. T8 X/ l4 B3 C2 e# E  Y3 K
# 邮件对象
" a9 L: n* A8 G' `7 U msgText = MIMEText(html_text, 'html', 'utf-8')
% H5 s& l: D1 y% t$ m5 v msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
8 ]+ S( D( l; t- t( o# @ msgRoot['From'] = strFrom  # 发件人也是被格式化过的
) O' o6 l1 M% v8 o( D: F msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
+ Q" {8 ]/ d) s/ \/ I$ n msgAlternative.attach(msgText), X2 \) x0 d& h4 K  k4 q

' g4 t9 v- Y( p4 f' N/ t smtp = smtplib.SMTP(SERVER, 11)/ ]& Z" X: x% L( z1 M4 r2 h* Z9 q
smtp.set_debuglevel(0)
& C/ q: w) U( |# ] # smtp.connect(SERVER)
4 m& j/ h) T; ~' a8 m5 q smtp.login(USER, PASSWD), }  L  t# w. m) y3 U
# 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别5 |; v: T7 {% C* G/ l, a1 y2 ~) m
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
) ?8 n5 L; }% E8 G$ w& T# S smtp.quit()
3 Y1 r5 P! U' h* P# [, P总结:
/ z+ A- w& K1 ^/ q: l4 }+ n8 M" y) b1 r2 j- _
看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo$ G3 c/ O! B) W' M1 {2 a
0 F: f  y( W- B. t7 F5 N, y  a/ F
实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”0 N; z  ~- O0 `. y
* F. |4 M8 ]; j9 |! R, Y9 j
同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型# z  g8 U4 k- \+ Z1 A2 M  U- }0 l2 E! c

5 y4 `; P: A% \2 g: O还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。) O; A- h: o- [! D# ?" N
最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
4 F% K2 @! I. ?& i/ \
& ~+ [, |9 P# i) _- E,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员& U, o4 O. Y1 \$ ~& C4 L

# u9 i+ c" y- I* i定时讲解Python技术,分享一些学习的方法和需要留意的小细节8 d& q, x  C" W6 B, b, Y; [. _
————————————————& i8 p# R1 D# n  T
原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
1 W5 M9 ~9 E  V; a* e% X, L! Q6 \' o
( d) o, h' {8 w- {7 V' \3 ?

4 H! L' P# r7 n$ J' f0 {8 P
作者: 柠檬草lll    时间: 2020-3-31 11:00
发表回复感谢分享  }+ w7 w' h9 K/ B+ N+ {6 u% h7 |

作者: 柠檬草lll    时间: 2020-4-16 22:10
发表回复不错的资源# ?) C- T. m# l$ r% v! {





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5