QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6138|回复: 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发送多人邮件没有展示收件人问题的解决方法
    + 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
    转播转播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-9-1 21:44 , Processed in 0.437184 second(s), 60 queries .

    回顶部