- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563387 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174239
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
python发送多人邮件没有展示收件人问题的解决方法) [2 I) e3 A; j1 n E$ ^
这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
J2 I6 h1 R3 n+ N7 a. A- \背景:
/ d4 ~8 ?5 s1 I p' f9 H
9 x# r! X9 R+ H工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
8 t. M4 V' c! \# N |
4 n. X$ F0 Y0 }" u) G8 S% C& e问题:
8 {7 g' V4 i; {( r# }5 S& a1 [" ?' ~7 L$ y* ?
使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
0 M& ]; e: c! P! _1 x8 ~
9 m: t6 M# |5 h9 f/ U4 l" x( E问题代码示例:
# ?+ c4 s4 ?, l0 j4 D' u7 E# -*- coding:utf-8 -*-3 v- ?8 C- |7 m! e0 @6 k+ I
import smtplib) p; t* V' r0 i2 |5 W9 L( D" h
from email.mime.multipart import MIMEMultipart
- t5 t# l& ^0 d$ B* ^from email.mime.text import MIMEText, A# m( X7 m/ \( C- d5 _
3 \% e3 R& ~3 A5 } ]def send_email_to(fromAdd, toAdd, subject, html_text, filename):3 }% e* p4 `0 r$ V0 _) \
server = 'mail.****.com'
8 V' P) ?1 ^4 Y" |. b' M: z6 a user = '*****'$ h4 `5 Y1 [7 P. T' [ V9 H- ~& N
password = '********'
3 F) A. Z$ {' `# V! \( |1 v* ?4 g9 i7 s$ T1 X1 n. I& u
strFrom = fromAdd
5 K8 I9 W) N9 s3 E3 O' t strTo = toAdd5 v& Z; W+ c! T+ D
+ e4 Z/ H+ q9 j3 i* { msgRoot = MIMEMultipart('related')
2 p3 X8 s5 ~8 M: ] msgRoot['Subject'] = subject
8 @. v6 F& ^ m+ d( p) Z msgRoot.preamble = 'This is a multi-part message in MIME format.'
+ }9 K% q; B; }. V" s! j* Q4 s. ^4 z5 d1 b; m" r9 q) \
msgAlternative = MIMEMultipart('alternative')
& ?4 m# q1 w' T7 n! B/ o I msgRoot.attach(msgAlternative)$ q' b0 N6 w) ~: P0 f
# |4 U- o/ f, Z* [3 P$ f+ l# W
msgText = MIMEText(html_text, 'html', 'utf-8')# E8 W |/ U$ M* \9 |) j) k0 o
msgAlternative.attach(msgText)5 F3 I) }3 G0 w% S% V4 S
8 p) T; n. I3 T' Q4 r smtp = smtplib.SMTP()+ X K; B- |% ~) D! i6 _3 v$ O' ~
smtp.connect(server)% g& K5 R( F" c6 P
smtp.login(user, passwd)+ e0 F& l1 b; C
- l2 \( d. E: W4 c9 S att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
' ~& A1 i# F$ E/ s$ I att5["Content-Type"] = 'application/octet-stream', M# K I; U6 m; |: T$ E. w1 c
att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'8 D z+ _2 p/ W. O
msgRoot.attach(att5)
2 k% y! M0 [, `2 z8 V( o9 Z, u: [8 S& Z1 j/ r
smtp.sendmail(strFrom, strTo, msgRoot.as_string())( I: @ D7 l* d
smtp.quit()) A" g6 V7 t4 c% ~1 ^% Y
return
6 M! s2 E0 ]* j, w8 ^8 Y, _+ {0 d. K$ m1 Y# A0 y7 d( Y
7 }' l- x0 W2 n% Z5 E
成功代码:
* M5 i, [7 x7 i) ~( R0 K' k8 C#!/usr/bin/env python* S3 y1 k: ^& S
# -*- coding: utf-8 -*-
. F! P3 l: X. M( t4 Y, N$ x% G( l+ k2 j9 ?' ?- J$ P" ?- D# ?" D
import smtplib
0 @3 ^8 P4 S% ?+ y1 u. gfrom email.mime.multipart import MIMEMultipart4 m! ^. [& i" d& a
from email.mime.text import MIMEText- E* ^) B" j( w1 p- V) n
from email.utils import parseaddr, R. f U( z3 _$ o1 \
from email.utils import formataddr
0 I7 ?, h2 ?6 R1 k% Rfrom email.header import Header/ F6 s# T s0 T' F. ^
2 v6 Z: \! w2 Y+ i: q0 B+ e& d" x1 A# U' O6 q- ]1 B
def __format_addr__(addr): N1 P/ G ?- R& j2 N6 \/ y
# 解析邮件地址,以保证邮有别名可以显示 D: L3 x- r; ~0 i" k% n
alias_name, addr = parseaddr(addr)5 a9 o' T1 k, x+ a
# 防止中文问题,进行转码处理,并格式化为str返回# G i! c4 T! A1 O1 z' [3 c
return formataddr((Header(alias_name,charset="utf-8").encode(),9 `9 @! S% D8 ~* K, i+ f5 u
addr.encode("uft-8") if isinstance(addr, unicode) else addr))
: X* e, a9 i7 w- P1 z: L. g2 w* d5 k6 u' O$ P) N9 V
/ D1 f0 m- o* P a5 c+ U5 t+ t: r
def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
7 o! J+ q3 B3 A: @, {- r4 U# p9 t2 J) Z/ E
SERVER = 'mail.***.com'
3 Q7 F7 C' |$ b% b- g USER = '******'' \) F2 Q" ^" y, w' g
PASSWD = '***'7 ~' R9 Y$ |1 A# I. {- w
, `" H/ h j _0 T. U; @8 ~
strFrom = __format_addr(fromAdd)
* K: R: J! g/ B1 n: N- P! ?7 {( [" O. l: a
strTo = list()! \% A/ L# h4 Q' a2 k& {
# 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化8 \2 N$ O N% ?7 L8 @) O& v
try:
# Z( B$ A* v! u+ T- ] for a in toAdd: \" P3 u4 F9 C9 T# j2 f! V6 J! O
strTo.append(__format_addr(a))8 X4 {) _+ |* X+ S
except Exception as e:
3 N3 A9 m3 _" t6 f7 u # 没有对a和toadd进行type判断,出错就直接还原* S, S% I. \/ @" v; n' w
strTo = toAdd
5 l4 `& Z2 n' x8 }1 b. e3 B4 y0 ~8 j" x$ u& A
msgRoot = MIMEMultipart('related')" J' Y) ?- r: F }8 G( P: N9 \1 a
msgRoot.preamble = 'This is a multi-part message in MIME format.'% N. x! b1 M4 n# [
5 _$ g. e9 f) Q0 {! z msgAlternative = MIMEMultipart('alternative'): O9 c$ ^# F. _+ j+ C4 @5 E
msgRoot.attach(msgAlternative)
! [5 N& G( I2 x7 d$ e
% ]( ^/ O m' w& X # 邮件对象 1 X. w, P$ C2 r
msgText = MIMEText(html_text, 'html', 'utf-8')# J; D& j2 U; n" m& G
msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
5 F2 _4 h; e4 J( s0 J msgRoot['From'] = strFrom # 发件人也是被格式化过的* v% t' t; q B8 ^# m
msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”6 @: D/ n( b+ e' N
msgAlternative.attach(msgText)2 y3 k* @# z. y5 f7 @
" ^" t2 z) M n( K% H7 u smtp = smtplib.SMTP(SERVER, 11)
& \5 z' e/ I; n5 A0 C smtp.set_debuglevel(0)
7 w$ H( S* i G6 ]; C, [3 y8 ` # smtp.connect(SERVER)
5 p$ Z: H/ P% C. a smtp.login(USER, PASSWD)
( U; K( ~; _0 J) y # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别7 {* v. }$ A& M2 B) ^0 e, R/ h
smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
4 Z" e# h* j' {4 ^4 ~# w2 Y k smtp.quit()
* |# L+ F0 g9 c5 o( \) E, n9 o总结:
8 W6 @1 C( v, i7 S8 N% h8 ^; S( R# c# h+ H9 B. F) W$ W
看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
# G3 Z4 E6 L7 u1 K; I. t4 N& P* k3 l: x7 O+ P2 W
实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”( W6 R) f8 T3 k
1 g: L5 {. _* J" b! e同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
, _0 a1 u$ }- N8 U" s9 r8 U7 n1 @! b8 a2 e( R8 z
还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
1 z. v8 y3 b. L" r) D5 c) Z最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得% V- m6 u* m# p
+ ~1 a7 K1 c% D3 r9 ^
,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员% Z* e' E( X% C& R/ g9 v9 @
! s+ Q- H s$ G- I+ v" J定时讲解Python技术,分享一些学习的方法和需要留意的小细节+ H! Q* r! W! u# S" \0 M
————————————————
9 K1 }7 w9 M/ [, e' ^原文链接:https://blog.csdn.net/haoxun12/article/details/1051629475 Q0 h+ L6 ]4 h
8 }3 i& }! l0 U1 I$ W2 K
2 _' t& Y# U) J8 J
( ~6 q# G6 Z6 x |
zan
|