QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6108|回复: 2
打印 上一主题 下一主题

python发送多人邮件没有展示收件人问题的解决方法

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-3-30 11:14 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    python发送多人邮件没有展示收件人问题的解决方法
    ! S" s4 z# C' h5 H2 Q这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下7 q4 {0 E# \' z0 u( R% _; K
    背景:
    ; c( _  V  c2 e9 V' w
    4 o8 S" p3 b, N/ ]2 ~工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人4 U  T! m. K0 G7 o  E

    * X8 j$ {6 o3 m问题:; O3 Y8 r3 H  H! u7 V* C" u

    4 a$ `+ v+ t6 w0 U6 v4 @0 j) {. P使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
    " n" T8 g: v% N1 `
    % ]% L5 j& b; M) z问题代码示例:
    / J, G2 j& Z3 E# N- E9 `. b6 @# -*- coding:utf-8 -*-
    % Y5 a; [( h( o3 d* Mimport smtplib3 Z+ F. H4 x) W! i
    from email.mime.multipart import MIMEMultipart
    5 e3 E! R" c  V7 Ofrom email.mime.text import MIMEText
    , Q( W6 V2 s0 S( t5 q. r- k: M- g* D+ i5 K8 o
    def send_email_to(fromAdd, toAdd, subject, html_text, filename):8 ~3 ]! s" v" G0 E2 y: T
    server = 'mail.****.com'3 Z! o5 B8 j; W, E; S
    user = '*****'* T* i1 |! k% r0 c* y  c
    password = '********'; X/ E: f2 ^& i* n* O
    , F+ s9 y- ?* d) v# T! d& `
    strFrom = fromAdd
    7 ?# @' D, j6 t& T# Y& U) }1 Q4 R strTo = toAdd2 D& J; n" h. _* s8 ~
    4 l0 ?; v( N1 w5 V& \' R
    msgRoot = MIMEMultipart('related')
    : K- r, S! |. m; N) M6 H4 N* ` msgRoot['Subject'] = subject8 i7 C+ }1 x2 o1 x
    msgRoot.preamble = 'This is a multi-part message in MIME format.'; Z7 N( F# M" a6 c' q5 l4 }
    0 L. G! G6 ^2 Z/ w7 g# C
    msgAlternative = MIMEMultipart('alternative')
    ) z" j3 H# w" \ msgRoot.attach(msgAlternative), E+ t. Y: ]5 l
    ; `' x) g6 Y& \( J- m; X" M
    msgText = MIMEText(html_text, 'html', 'utf-8')" T1 \! q6 f' Z" D9 E5 T
    msgAlternative.attach(msgText)
    / I2 n9 u2 f) \: C3 j  r& s# K, B
    , X$ G4 N$ }( U, \+ A1 _ smtp = smtplib.SMTP()* }- a1 D" ~9 X2 L  c5 J& ^
    smtp.connect(server)
    3 c9 O  w! E8 j: ~! g smtp.login(user, passwd)! u$ i* @( m5 i9 l5 J

    1 K9 E8 j7 {9 q6 y. E1 |3 r att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
    5 N+ p: m7 s$ a+ i( f att5["Content-Type"] = 'application/octet-stream'. q. E" n' a0 ]0 T. X- x# v
    att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
    ! ~% s& h: o# f msgRoot.attach(att5)
    + d# D% p0 @+ U4 C5 Z' e6 I) s' H( @9 }; N/ D
    smtp.sendmail(strFrom, strTo, msgRoot.as_string())
    6 d/ A2 k' k8 t- z; ^ smtp.quit()
    . Q3 {0 n8 F6 n# `" o. `7 \ return
    & P  k* r1 B9 i2 w6 S6 j* |1 d, v
    4 D! }# L# M5 y& [( n: `& g/ X
    , \& u/ x( ]. `' q4 @  k1 w/ a; K成功代码:! l: `) Y+ H  p8 U7 u( |
    #!/usr/bin/env python
    ) K8 U: m; z8 \* u$ h# -*- coding: utf-8 -*-! n0 {5 m; R4 m
    9 ?" T3 q* z9 |' y
    import smtplib
    8 ~( a; P5 q* j) N# S1 |from email.mime.multipart import MIMEMultipart+ P7 X2 n: x+ S' i6 e2 h: A  I9 A3 S
    from email.mime.text import MIMEText
    / {& }! Z; ~3 C6 R7 V+ f6 w3 Pfrom email.utils import parseaddr
    ; h& Q/ `9 O4 }# T: efrom email.utils import formataddr% ?6 a: ~3 d' z  Q( d) F
    from email.header import Header- Q- _- d. C; J: [, |' C

    # z! {) ?( j; ?! k% S4 Z9 H, V/ S! ?  P6 d
    def __format_addr__(addr):
    ( d7 Y- b6 L. y6 c# ?# M # 解析邮件地址,以保证邮有别名可以显示
    $ b! |" ~$ X, e' f alias_name, addr = parseaddr(addr)
    : T' Y  \2 }3 ]2 \ # 防止中文问题,进行转码处理,并格式化为str返回5 i+ e1 ~8 b) T0 g
    return formataddr((Header(alias_name,charset="utf-8").encode(),
    5 M& ~! F# W) g, @2 J' ^1 G      addr.encode("uft-8") if isinstance(addr, unicode) else addr))
    8 `4 A8 G/ z5 U  l: L- C# `: Y+ w2 @- W+ w

    % `. [# e' r% ndef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
    8 k7 X) Z% B. ?$ {
    $ k& a/ t" \  U: J6 G SERVER = 'mail.***.com'
    - w# e6 O  F: Q USER = '******'* H! x! O3 \$ g) q$ I' c
    PASSWD = '***'
    ) s- e8 M4 q5 ~+ P
    ) \+ T$ L7 J% ]' s strFrom = __format_addr(fromAdd)1 a+ S! ?# \6 x( G- V& ^
    , R/ K& s0 U2 H
    strTo = list()4 O  \4 p6 I# Z) v7 m
    # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化2 a# ?6 N' v. y, O1 X; w/ V
    try:
    ' l: u# w: L* V( M) i  for a in toAdd:# {( i; Y! r% k& E' L5 ^9 v3 g; i
       strTo.append(__format_addr(a))* E4 r. O6 L0 g' Q  z
    except Exception as e:- |  r2 P2 @0 X6 t7 y
      # 没有对a和toadd进行type判断,出错就直接还原7 J* R) k$ r. J: u( P. ~
      strTo = toAdd# J; ?; R6 z' x7 |$ _& m* C
    8 X6 X1 Y3 N7 |
    msgRoot = MIMEMultipart('related')7 o9 j+ P: {' w" w+ ~
    msgRoot.preamble = 'This is a multi-part message in MIME format.'
    : I0 I: `4 \) L2 N- v$ D3 F
    3 O; _6 x( \' r, C msgAlternative = MIMEMultipart('alternative'); q0 C' b- f9 J7 W
    msgRoot.attach(msgAlternative)
    " @6 X* q+ F; T; h7 Q" S" B: ]! [6 n) n' T
    # 邮件对象 & {9 ~0 l9 @- N
    msgText = MIMEText(html_text, 'html', 'utf-8')% T/ r( _3 w  o; P
    msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化/ H' A6 \! t/ V  T9 n
    msgRoot['From'] = strFrom  # 发件人也是被格式化过的
    3 [8 X' ?7 C" o" A' g8 G msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
    $ \* f! n  V  k1 f msgAlternative.attach(msgText)
    1 f; x5 l; J8 ^+ k8 i* Z1 [
    $ [/ G0 {( z3 C% d smtp = smtplib.SMTP(SERVER, 11)2 u  B) a! T, G+ T: M
    smtp.set_debuglevel(0)
    1 r1 O# l6 @- m% n. Y1 A # smtp.connect(SERVER)5 q9 y% r# j# o4 i. p- ^
    smtp.login(USER, PASSWD)
    ' ?& y* s# g: i6 U( U. T: k, O% `" m # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
    ( l' J* ]1 }! _+ S6 F- Z smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
    ! F; E/ T8 f* j* T smtp.quit()
    ) Y  H# l. t- @总结:
    ) ~4 d: r6 s% h3 H% J( k3 |2 @
    0 Z' T% [# T$ b" f  F( d看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
    # H& I! X" b9 B& k
    6 N8 K9 t! `0 p) i实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”0 \: s% R7 _3 V2 D+ P* Z/ `0 ?
    5 w$ a+ U. @' J$ ^
    同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型8 }# i/ E5 `/ M' `3 A, y9 `

    3 {. d: l- D, {9 F还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。7 |5 h) a4 F4 ^: r$ B, g! a% ~
    最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得( T# G4 {& J4 z

    . ?8 A$ p6 S# H* v/ p,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员; v; d8 L  c3 {) W
    6 i; R! L: q; ]! I+ D( h* E5 H
    定时讲解Python技术,分享一些学习的方法和需要留意的小细节& \0 o" J' c& w# t
    ————————————————$ U' t7 E2 T" {# w! X
    原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
    ; v; E! T5 _  X6 V) s- }
    " s* B$ ^  l- S/ A. ^5 x+ v9 r$ a6 {

    ! [+ V) ~0 L% C$ d! W/ l) R
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

    0

    主题

    3

    听众

    92

    积分

    升级  91.58%

  • TA的每日心情
    慵懒
    2020-5-25 19:07
  • 签到天数: 2 天

    [LV.1]初来乍到

    群组2019美赛冲刺课程

    回复

    使用道具 举报

    0

    主题

    3

    听众

    92

    积分

    升级  91.58%

  • TA的每日心情
    慵懒
    2020-5-25 19:07
  • 签到天数: 2 天

    [LV.1]初来乍到

    群组2019美赛冲刺课程

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-7-18 08:41 , Processed in 0.303041 second(s), 61 queries .

    回顶部