QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6105|回复: 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发送多人邮件没有展示收件人问题的解决方法* r. Q. g: l, Y
    这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下4 ]2 i* B6 k* x% h# V0 ?
    背景:3 G$ d( M/ V4 b' V

      p% f+ d8 T7 R工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
    1 f- H8 Y' x* w, D; q5 o, i& B4 u+ v% s! x- j* u# P% g
    问题:
    8 T+ W% d+ h. B$ ?. ?8 e1 S( v- X1 j$ I* g4 h7 q/ v
    使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容
    9 c0 ?5 L: t0 A1 i  Y/ z$ W2 b# r4 r* A, N: _7 W
    问题代码示例:: o% j1 M+ y* T
    # -*- coding:utf-8 -*-" a" v0 D9 X3 v1 Y9 y1 J8 o$ A
    import smtplib% k  d. ^6 i9 A: ~
    from email.mime.multipart import MIMEMultipart
    * M# t2 v4 {! y; }& V% ~from email.mime.text import MIMEText
    6 S& \' Z4 U& ^7 C. H6 V
    3 D* n4 I. k7 f" q5 t  Qdef send_email_to(fromAdd, toAdd, subject, html_text, filename):, q! X$ B. \" K3 j& z/ o/ T
    server = 'mail.****.com'* T" ?7 o# M. O& `. S* p: u4 D/ |
    user = '*****'
    # v2 J/ \& P: W password = '********'
    , ~/ I# ^5 O6 ~, M( j& p2 W7 |* l( J" `9 o
    strFrom = fromAdd1 |( b: `7 |; ^
    strTo = toAdd
    ( A& Z4 i! {& D3 \* l8 [
    % ?. J; Q1 ?" I/ z9 c; {6 E& ? msgRoot = MIMEMultipart('related')% P' a# k, e" x1 \
    msgRoot['Subject'] = subject
    ) R) U) o4 n6 u0 p2 c% s' ] msgRoot.preamble = 'This is a multi-part message in MIME format.'; Q& ?% f9 p+ m
    ! \- i" W# Z  t7 M# g# L( U& L; Y
    msgAlternative = MIMEMultipart('alternative')
    7 N/ |7 e$ X3 { msgRoot.attach(msgAlternative)
    7 {6 a! Y# G# J8 g/ p& w
    5 G) J: |0 f! z/ c. u0 ]9 z5 i1 d* e! z msgText = MIMEText(html_text, 'html', 'utf-8')
    4 z$ C; p, W/ v; z& n; `" Y msgAlternative.attach(msgText), q+ I1 [7 b! P7 ^( H5 F

    $ |( Q1 m3 |6 p7 a$ Z9 H0 a2 o smtp = smtplib.SMTP()
    6 @- A& F) \8 g( m# i. g smtp.connect(server)  D0 `( f7 l( K+ C1 k
    smtp.login(user, passwd)) [8 g/ h7 Y- y1 W( n- ~9 V

    7 {/ \5 F; N& v att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
    ( X5 A$ p8 c* `5 S$ D/ i1 F att5["Content-Type"] = 'application/octet-stream'
    ' W, E  q' g' H- \6 J% |2 P att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
    & j" g/ j& {; C/ a# K3 R msgRoot.attach(att5)' k& W' h6 w6 F6 t4 W* I) v, y$ v

    0 q4 j6 E1 [( C9 G& s smtp.sendmail(strFrom, strTo, msgRoot.as_string())
    7 B( a* {- d2 i4 O" u- {8 @: q smtp.quit()4 U+ s3 B5 `( u+ f) ]
    return
    . |7 p' a+ C' e& A$ f' B
    ' M  |" z9 c7 ~+ J) O# z5 ^  I  k1 u5 [$ B
    成功代码:
    ; N0 o6 f: ^# ]#!/usr/bin/env python
    ( L+ L+ M6 j  E8 c/ X3 K& Q# -*- coding: utf-8 -*-9 ~7 d1 D2 w1 x

    & I1 f& m9 ~4 A" C1 R: M; oimport smtplib5 ~2 ?( z9 Q2 O$ M
    from email.mime.multipart import MIMEMultipart6 I8 K( w$ ~% E
    from email.mime.text import MIMEText, f2 x: t4 e# a! U9 \
    from email.utils import parseaddr
    # |; _# o# `9 ?& Mfrom email.utils import formataddr+ {5 B2 \2 _1 J! U- ]9 f% c
    from email.header import Header
      G8 ~0 T! u3 t( h
    + f/ b2 t3 \1 L# @: x3 z9 y5 u# _" C7 n/ R" `
    def __format_addr__(addr):5 C. U1 k1 ]& A) Y2 K
    # 解析邮件地址,以保证邮有别名可以显示) ^& u5 V! B. h  i& ^
    alias_name, addr = parseaddr(addr)8 K/ P) s/ Q. \* Y2 ?
    # 防止中文问题,进行转码处理,并格式化为str返回
    2 A2 ~0 I. M& u( W return formataddr((Header(alias_name,charset="utf-8").encode(),4 J; f& w/ s4 o2 @! E+ w; }0 y
          addr.encode("uft-8") if isinstance(addr, unicode) else addr))
    ' }, _" g* }6 h- ?" g) q
    9 z9 M0 ]" p6 ?" n6 O& H8 S% K
    ; P$ Y7 l  ?; {* \3 Idef send_email_to(fromAdd, toAdd, subject, html_text, filename=None):: i9 J/ C" w3 p$ M
    * ~) E0 B# b4 j" @
    SERVER = 'mail.***.com'
    & C& B: O% T, G7 r: @' G1 D7 u, i USER = '******'
    6 a9 |. S2 o6 I: y1 [; ?1 z PASSWD = '***'
    0 S$ K% q6 a$ I
    2 w, ^8 \+ r* |8 a$ g strFrom = __format_addr(fromAdd)# m7 r" I* d6 g. P0 K
    2 A7 @' ~# F' F  @* }/ k1 b
    strTo = list()
    4 h% D$ U$ ]; d # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
    3 j! d' [. k: t" ]7 O4 s. c try:) Q+ Z* [( q4 B% @
      for a in toAdd:& I: I% I+ R! y/ s" ?
       strTo.append(__format_addr(a))1 E  F5 G, O7 |: [1 z
    except Exception as e:) {9 {: {; N1 R  J) q0 ]
      # 没有对a和toadd进行type判断,出错就直接还原1 _/ t6 ?, }, ?. d- [) n
      strTo = toAdd+ [" O: R3 O4 ^- d2 I$ \, P7 o

    * [4 C- G/ c$ |" t6 k1 t. a7 i msgRoot = MIMEMultipart('related')- x* |& q. Y* j) F
    msgRoot.preamble = 'This is a multi-part message in MIME format.'
    2 D9 ~$ w# T; A& t- q/ F7 {( M! g/ K; x
    msgAlternative = MIMEMultipart('alternative'). ^" q& N: p* s4 Z
    msgRoot.attach(msgAlternative)
    6 x  y6 ^9 N/ @8 u3 _  T# j, l, l, U% Y8 b
    # 邮件对象 # @+ `9 X1 L5 u% G  M( D
    msgText = MIMEText(html_text, 'html', 'utf-8')  _  o* r' [# l8 Q9 y
    msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化4 i4 Z, I7 `& S4 {
    msgRoot['From'] = strFrom  # 发件人也是被格式化过的
    ! w  |; P* m. ^ msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
    1 Y0 n: Q' o" F1 g msgAlternative.attach(msgText)/ @' }3 u. I  g& ]% `! r2 ?( P

    ; y  _- s! d9 j' v, X smtp = smtplib.SMTP(SERVER, 11)4 Q' H& o2 y- v8 G
    smtp.set_debuglevel(0)
    - O  V2 ]0 u' C4 v3 @1 H # smtp.connect(SERVER)
    2 e& R# Z# Z8 y1 P  @ smtp.login(USER, PASSWD)
    ; F! F& s6 O. o" S" k& Y # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
    & }" `5 K4 t+ X% [ smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())  B8 P0 k: s/ A$ y
    smtp.quit()
    4 j( h/ ^8 E7 T* l9 r, P( P总结:
    ' M% E2 h8 h% M* I  M& G" u2 r( c; C9 K) M
    看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
    0 X3 A! w) M: G, r( L& n
    1 ]0 J8 r6 ^# \" a8 [/ Z- A实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”6 Z. q+ S( z3 v. ^6 J) S! A

    ( v9 _  w# L& W  _3 q1 Q% w0 V同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型) b" c) T" N: h9 S, U6 S

    ( b$ h* N" ], k2 |, L0 ]还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。. h: j2 H! G; ^: _( R! G
    最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
    $ f# X3 }3 {4 r: f- O1 T4 w+ M
    ! B# ?' k/ y$ G,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
    8 F3 i7 e0 j) I7 P
    0 U" \  B/ Z( l定时讲解Python技术,分享一些学习的方法和需要留意的小细节
    ( f, i2 S$ N4 p$ S0 s0 T% S/ @————————————————7 R/ a5 I5 d6 k- K& \- \6 [2 E
    原文链接:https://blog.csdn.net/haoxun12/article/details/1051629473 B; ?, Y4 @4 i8 ^
    ; I$ {: ?; F6 Q+ p% d( |
    . S; Y2 x0 k- q+ _, T) `, I2 c: ]
    % Q: x6 Q' 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, 2026-7-18 02:39 , Processed in 0.511885 second(s), 60 queries .

    回顶部