QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 5394|回复: 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发送多人邮件没有展示收件人问题的解决方法  x( E5 b/ z8 u. d' t. U2 Q
    这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下$ W: Y3 E' }5 ?" c5 o
    背景:2 t- l5 U7 g$ j; n! o
    % K" Q- a/ [, m& n8 Z9 p
    工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
    - O4 G5 R8 U% Z: L6 W* g, T' b5 }) x# l: P+ q. S' K- f; Y6 L: {3 b
    问题:
    , U0 l1 e# a. R$ f5 \
    / }. a) L- a6 G. g使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容. i' _, z' g9 t$ o+ u& D2 d

    7 ?* B/ S2 i* O5 O" B问题代码示例:
    6 t: C% U; Q$ [: t; X/ _% p# -*- coding:utf-8 -*-
    5 a* g: T( ~3 q, \import smtplib
    & q5 g% f, N, }" d9 sfrom email.mime.multipart import MIMEMultipart! e7 ]$ B- j% S
    from email.mime.text import MIMEText
    . z, N/ _* p; Y2 w: n6 d' O7 q) i. F" T
    , _, F) {5 J# i, A$ ^1 Jdef send_email_to(fromAdd, toAdd, subject, html_text, filename):9 Y- }4 X. b6 R
    server = 'mail.****.com'
    6 X) {. }, S! d$ }0 ` user = '*****'8 e2 ]  {$ h' e* `# O" B: O
    password = '********'* t( e7 ?' k7 W) ?: T
      k2 F, h. y% g2 j) z- _
    strFrom = fromAdd, o% l2 r0 q& Y6 _
    strTo = toAdd5 q. q, d( a& N* L

    5 e) ~  i3 w& C2 O$ ^ msgRoot = MIMEMultipart('related')
    " n( g* z- _! g8 G% o msgRoot['Subject'] = subject" E; d. ]$ I! s* i$ i
    msgRoot.preamble = 'This is a multi-part message in MIME format.'
      @2 b* S2 s+ x9 ^! t: P* L% A) K  \
    msgAlternative = MIMEMultipart('alternative')' s, o; g7 X  f: ?; u
    msgRoot.attach(msgAlternative)
    ; ~( S/ R) M% {( V* ?  U& u' d+ e  Q- @: Y& p% o
    msgText = MIMEText(html_text, 'html', 'utf-8'); ^3 ~% }3 n6 z* `. S$ D1 B3 [4 U
    msgAlternative.attach(msgText)
    ! J5 ?/ J2 ?- i+ r. u: j$ `! B' j, k4 C. S0 r* C2 J! T- I
    smtp = smtplib.SMTP()
    0 ^3 i# J+ z6 t0 D smtp.connect(server)6 U& @8 o* S* @, Y  Y6 [" T5 N
    smtp.login(user, passwd)7 O9 G! _, x: z8 e& E
    ( f) J( N5 f% l2 a3 f( ~+ T; s& Q
    att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
    & a0 f( {. U- I* A  j% q att5["Content-Type"] = 'application/octet-stream'% o" P) ~3 K: S$ \8 S
    att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'. `( [* u" Z5 [1 i5 j3 \9 W' r
    msgRoot.attach(att5)! i$ d+ m3 u) m

      d0 |& n, O6 D. \$ L# I smtp.sendmail(strFrom, strTo, msgRoot.as_string())
    + o- X9 T$ A0 g& t smtp.quit()' m+ z1 L# j$ ]8 o; |. q
    return/ [. V5 X5 R( ]( U9 U
    / u! M, r  |: K

    . b- I4 H4 j" F) K; I4 T成功代码:
    : c* V( v9 Y9 l3 U! b; X. {#!/usr/bin/env python
    / R. N# |4 J& s  o' P+ Y# -*- coding: utf-8 -*-1 r+ h' S5 D& f4 a) w; ]

    4 z2 |) i* F6 Himport smtplib7 i% o* i" ^9 D* ?
    from email.mime.multipart import MIMEMultipart# j) T! g" M7 z. _* s
    from email.mime.text import MIMEText
    0 b* ^5 e. j# f; pfrom email.utils import parseaddr
    ! A0 B. E% Q  }; V! Q0 j9 k. _from email.utils import formataddr
    ' V* i$ m( F5 Vfrom email.header import Header! t0 G( E5 f& i' r7 h7 }  g/ ^

    3 X8 C% X; g3 B- C3 [( n3 T
    6 Y. |5 u7 ]( P: {; D& Tdef __format_addr__(addr):6 r2 s- E+ u/ T3 z% ^$ @( ]! [
    # 解析邮件地址,以保证邮有别名可以显示7 V' P! I1 F9 s
    alias_name, addr = parseaddr(addr)
    , K( `3 q. u: U6 o4 e$ b7 R' H # 防止中文问题,进行转码处理,并格式化为str返回
    6 {( i# T3 E& P! m return formataddr((Header(alias_name,charset="utf-8").encode(),
    - c* u2 |" e$ R6 _& Y      addr.encode("uft-8") if isinstance(addr, unicode) else addr))
    . \, ~4 @3 |- z8 P" m# k1 n3 ^2 p! Q0 n2 Z9 X

    7 r1 `3 T, M+ J* Q& Idef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):6 g4 V4 q( e8 k$ q" H2 t0 @

    / A( i' @/ b" h" P2 M& a SERVER = 'mail.***.com'
    . D4 d( w  ]6 z. x USER = '******'! ]% c. `+ D& ]8 s
    PASSWD = '***'" ]$ _. F9 U4 l  K8 j- S* J0 F" c

    # H, K! j7 G5 l3 v8 ] strFrom = __format_addr(fromAdd)* i8 Z: D% Y$ a

    ( F0 l3 a2 ]$ M: k0 g8 c strTo = list()8 S8 V; g2 t! w% ]2 ^5 \5 w
    # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
    + m1 p% t( b: m! O# o# @7 R try:
    ; v! `6 l5 k, }4 ~  A  for a in toAdd:+ b3 A; Q& O: [8 O! G( @
       strTo.append(__format_addr(a))2 X8 |% ^  i$ ^" D4 a2 T) o! l
    except Exception as e:
    / O' o% I7 C/ H9 P# M  # 没有对a和toadd进行type判断,出错就直接还原) @- j4 x3 S! T7 Z
      strTo = toAdd% e9 ?4 G. N" Y! s9 b

    5 k% h+ @" E3 S7 t  o msgRoot = MIMEMultipart('related')
    9 k& T+ ~, q' d8 `  S msgRoot.preamble = 'This is a multi-part message in MIME format.'8 D* i5 N5 b" {4 `  L
    ( |7 i+ Q4 e. m) P( G& [
    msgAlternative = MIMEMultipart('alternative')
    # v8 n' q. S* W msgRoot.attach(msgAlternative)
    ' q( @1 c5 Q) O& m7 v8 N
    , k$ l# J# Y5 B7 P5 e # 邮件对象 ; q, i+ |0 b9 @0 t
    msgText = MIMEText(html_text, 'html', 'utf-8'). M# K$ e* W! Z& E% \
    msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
    ; x; F; @7 ]7 |& Y msgRoot['From'] = strFrom  # 发件人也是被格式化过的
    / @# S; U" A4 d" q1 |# S) r% y- B msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”0 C1 q3 Q2 Z/ ?1 u) V* C9 R
    msgAlternative.attach(msgText)& D( m; |' F+ c, R

    ! ^4 J% _3 p( A3 E/ G smtp = smtplib.SMTP(SERVER, 11)1 N: {. ~2 O% P- G" _( G" z
    smtp.set_debuglevel(0)2 x/ S8 p4 ^, n0 p7 P1 R8 m7 P
    # smtp.connect(SERVER)
    : v2 y. ~" l& Q  S# [9 U: `0 V+ d smtp.login(USER, PASSWD)
      M  M: Y' e) _. r1 t% H0 g # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别. A' V3 g3 M4 f9 y. M# O
    smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())4 S' A9 J% @! g9 w
    smtp.quit()
    ) X3 D9 Z* P/ P/ N; ]: ~7 [总结:
    7 K1 @0 c" ?3 Z2 q% J5 B6 J, t6 x% C: p: ]' H5 c( D
    看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
    5 Z& ^/ H( u$ J$ g& t& q6 K( q0 Y# s# o9 R6 K- Q8 d
    实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”
    $ U( F) s' }6 G$ R* v. T
    8 U/ ~% H- F: v# O$ y, ?- \同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型7 B! W& ^4 s  H, q

    2 I% p+ Z! j# [& q2 d& J) O( b' c还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
      f- B( c+ `" |: K5 \5 A最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
    / M& f' b/ v8 P4 r9 C- u7 f' M- s8 C& E8 d9 [2 [* H$ a
    ,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
    4 C! b2 `+ d/ p/ Y% d7 q
    4 v" c4 ^6 @  x7 R3 [定时讲解Python技术,分享一些学习的方法和需要留意的小细节
    1 J& J5 B# U2 c2 F1 D# d. I————————————————
    8 _9 B0 J+ c! L8 v6 Z4 m原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
    & W0 v6 n  W! R2 v4 }8 q2 S5 C& C
    $ Z4 ?2 G9 n+ Y5 g/ m2 D
    9 w- }6 G, R, X9 t4 T' W0 l. r7 f% ?3 h: a' @! P( d
    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, 2025-8-19 18:58 , Processed in 0.438737 second(s), 61 queries .

    回顶部