- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566430 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175152
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python发送多人邮件没有展示收件人问题的解决方法
+ r8 h8 k# T$ k% ~; z! d) a, U这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下5 l/ v& P+ T! `$ j6 q
背景:
, E( G/ K( h5 J% |6 l) U2 w3 c( w/ s& S' m6 _
工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人% d5 U/ [$ p9 C: I7 I9 K
$ M; R2 L8 y- G# d* y; R问题:
: l9 c$ W3 o% \1 A9 a1 B( O
: l a1 n. n8 i2 ^3 G" l使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容+ z7 d8 i* J, W) S7 `( ?, B+ s
. z+ ?- k; d% [* v0 s问题代码示例:
/ I3 G; |: [. @' m* b2 e& O& A- [# -*- coding:utf-8 -*-5 M8 m8 p+ X5 S
import smtplib
- A& M5 g0 V% w5 yfrom email.mime.multipart import MIMEMultipart
, u+ ]5 s" L! O. ?- p' qfrom email.mime.text import MIMEText
' W G3 h* U" Q1 J, f
, A2 L d$ I$ C, x8 c* z2 Edef send_email_to(fromAdd, toAdd, subject, html_text, filename):
5 y; i6 |' H, U& x) p. g3 p2 i ~ server = 'mail.****.com'5 |4 c* C/ M6 ~) L/ a- X& e0 ~6 P
user = '*****') u9 o# l( i w3 A, h6 l1 o
password = '********'
$ U$ s7 q* M, a: \# s
. c: a5 O( P" M% ]* `" | strFrom = fromAdd
; m7 s: z" u' E1 i strTo = toAdd
+ D+ E: {% ]1 W. f+ L- b& T7 J% [ b
msgRoot = MIMEMultipart('related')/ [; [+ k9 [! Y' m+ W6 m$ t" M$ j
msgRoot['Subject'] = subject' d9 `9 G* K' T7 E9 V
msgRoot.preamble = 'This is a multi-part message in MIME format.'# M. i7 P4 ]6 [ H; R
* R8 Z ^7 T7 e$ v8 F msgAlternative = MIMEMultipart('alternative'), T4 O( y9 d7 b; Y4 t
msgRoot.attach(msgAlternative)
6 W, [% l5 |' w' \2 z% [' W( E- [: O2 |' H6 n
msgText = MIMEText(html_text, 'html', 'utf-8') ^; o4 p' R# y/ j$ N/ M( M! f
msgAlternative.attach(msgText) V8 F4 _& b2 u! r* X5 ~1 C
: u0 u1 z# T, z/ ?* G) ? smtp = smtplib.SMTP()5 s+ d" v3 Z( R2 v! k- n9 }
smtp.connect(server)4 A2 S# R; p: @4 n
smtp.login(user, passwd)
4 A# m+ C& H2 o- d, ^* L
* u9 z4 e. y+ p" e att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
9 y$ M5 s$ B! ~/ N' | att5["Content-Type"] = 'application/octet-stream', ]' c! i* j1 [# t! n
att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
5 l0 ^/ l8 d# H% x( B4 | msgRoot.attach(att5)$ u; Q9 |$ c( E, S
, E3 p" A( {7 g3 m2 Z
smtp.sendmail(strFrom, strTo, msgRoot.as_string())1 c' {, J8 J9 ]
smtp.quit()
0 I `% E8 `% E3 m. H) ?3 p return1 O# Y, y. @- i: {) }/ n( y4 D
4 f3 a- G: w9 p0 T( X8 Q4 J; o
: t) E8 J+ b0 t成功代码:
. ^3 B9 ]" o, t& ^#!/usr/bin/env python
: ]. G7 M% B8 o+ v% Q# -*- coding: utf-8 -*-; [2 j% O* k6 o0 B& B% v
% A: V6 L( l/ m0 Pimport smtplib
* _! E' m. Q: F3 Wfrom email.mime.multipart import MIMEMultipart" j, h6 C# u0 y% X
from email.mime.text import MIMEText
8 U% {. |- U- mfrom email.utils import parseaddr. n$ i4 \5 _9 s, C" D
from email.utils import formataddr0 ~, L# M& t7 ]* U7 L* }
from email.header import Header. G# ?0 H8 H* f* x# ~8 m+ r) ~) F
& i( e$ \6 b! E" ]& v" ]; ?3 U t
9 M9 `2 p3 P3 L" ~; T1 E+ Y! _$ c8 Zdef __format_addr__(addr):
5 C- t! t ^! a; q6 e: J& T # 解析邮件地址,以保证邮有别名可以显示$ V7 y8 u3 K, p/ \
alias_name, addr = parseaddr(addr)) n. ?2 x6 j _8 i
# 防止中文问题,进行转码处理,并格式化为str返回! e* E) r+ \6 G4 i
return formataddr((Header(alias_name,charset="utf-8").encode(),# z! A _8 f% @8 K" h' d
addr.encode("uft-8") if isinstance(addr, unicode) else addr))
( j @+ C% j. \, |; K" F4 X: } D6 x5 g. {
5 @5 i4 t9 f. J7 W0 V* A' |
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):; \8 Y% B; i, g$ T( Z+ n9 [- R4 Q
! z% V5 V/ ^( s4 u4 }2 q
SERVER = 'mail.***.com'$ _& K0 `3 K1 l1 a- E* D7 N
USER = '******'9 D$ y3 q2 E0 x& v+ A
PASSWD = '***'
' t/ K# l! z9 a' ~' U3 _
; G2 x8 @ c! A, F5 p1 ] strFrom = __format_addr(fromAdd)2 X3 _+ m, `. y
0 v' {+ S/ X1 F/ H$ j R6 C0 O- x strTo = list()
+ \) U1 K3 P6 s6 E # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
6 c$ J& B D: S v5 X, n6 z try:
1 g# m! @- y: U c) j for a in toAdd:
0 C3 u( d$ Z/ z strTo.append(__format_addr(a)): @+ W9 |) U* S- L
except Exception as e:
: c2 Q" J2 B! \# y # 没有对a和toadd进行type判断,出错就直接还原: y) ?$ l& z5 z* B9 x8 x. k
strTo = toAdd
3 c, {# g3 f. x: p( V3 z- Y
: Y' r/ @; i% R _4 ] ] msgRoot = MIMEMultipart('related')
+ g- h$ P+ b+ ?% G" y: M- }7 T msgRoot.preamble = 'This is a multi-part message in MIME format.'
# Y; w2 y- J& K2 {4 ^0 g) z0 X7 [# M5 y9 ]$ S
msgAlternative = MIMEMultipart('alternative')
$ l. `1 k, y2 G# c( Q$ V msgRoot.attach(msgAlternative)9 H) Q+ U t9 a3 L1 Q' w) J! ]
; r4 }1 F% T6 j3 {' {3 Y
# 邮件对象
8 ~2 L7 ?: q# \& g& V/ V2 T msgText = MIMEText(html_text, 'html', 'utf-8')! \1 G% {7 I0 r( o: M' N" z5 f
msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
' F- ]- a5 n5 a4 D* f7 w/ U# j" B msgRoot['From'] = strFrom # 发件人也是被格式化过的9 o+ j9 Z- q" D3 u% Q
msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”+ x$ r; a& `$ r6 ]
msgAlternative.attach(msgText)
. h/ j+ Z# |2 l5 l8 m
4 ^* `5 k9 F# @- A' M8 ~- Y smtp = smtplib.SMTP(SERVER, 11)
% J3 T$ C# b6 b smtp.set_debuglevel(0)
; p/ Z; U& K& h+ H/ }7 q" W # smtp.connect(SERVER)
% V7 f; b. @ m$ d7 W6 a2 ] smtp.login(USER, PASSWD)7 Y9 {8 B$ m7 t1 I0 E$ q# k: h
# 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
" L/ l; _# s: ^$ C: n2 e! r& Q smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())$ K, d! t, C5 |0 c# `8 {
smtp.quit()
( g- J' N% M) i* a* N' B- ~总结:
. N$ S+ E# ^( a, h/ O
+ z$ s1 c$ n6 [看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo+ j I: F( X$ K( ~. t
C( _- c$ I3 a8 M
实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”
) E& S+ z3 O P+ q
- X; ]* d# z* _, V9 b# c. `5 S, K同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
6 o( W0 y" n5 D
$ ^0 k. q, f& B* P还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
# O0 s3 M$ _* y3 q. z最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得6 y B) s2 i4 p# e8 p0 |
. U9 O' G9 P2 ]$ G* x2 e
,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员0 k; n$ N9 M8 e9 q. O% G& ^9 L
$ ?5 t: N0 @, H4 _; `! t定时讲解Python技术,分享一些学习的方法和需要留意的小细节
& @) `* T+ Y* o- _. R————————————————
% G# E2 l6 s/ U$ j原文链接:https://blog.csdn.net/haoxun12/article/details/105162947 L, D9 y1 h+ c) c! e
+ Z7 A6 Z% X$ y' c& K0 H9 @. r6 i+ }5 r, M! x
. l2 z. s0 f) u. j" y
|
zan
|