QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6141|回复: 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发送多人邮件没有展示收件人问题的解决方法
    ! l" H/ D* e# ]; _# P+ ~这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下6 K* V5 |5 M. L7 o
    背景:/ y! Z0 x* n- r! T8 ~" n$ ~

    6 G( }5 K- ?* H! b% u工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
    - T& l) I( f/ H) ~5 r/ S7 o
    # Q9 T1 D; Z$ P& f+ o, f7 ]问题:
    * A! Z) i% r4 w6 n6 t( a
    2 p& H6 R, ?' t$ z- T( x9 s4 `使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容% ~! }- a/ ~' R* G/ J* v! N# N

    9 |+ {1 t% C5 G  A问题代码示例:; E3 A3 [! H- B& R
    # -*- coding:utf-8 -*-
    / ?( t* W- G7 e; g1 B9 C0 yimport smtplib
    $ S$ A  l% p$ _5 n9 n/ K& u) `2 a; zfrom email.mime.multipart import MIMEMultipart
    " F2 s) ?9 Y7 h5 a/ `# w  P6 k6 Ffrom email.mime.text import MIMEText! w. Y. L+ K' {/ ^
    3 [1 b4 d/ ~9 j
    def send_email_to(fromAdd, toAdd, subject, html_text, filename):0 l! g$ L9 B3 G6 V2 n  Z. w1 \3 B
    server = 'mail.****.com'2 Z2 F* s$ m' Y. ~6 _7 P0 l
    user = '*****'5 d* @+ j( P5 A- q9 H6 o
    password = '********'
    * }/ S' x% J) u! p/ u' P$ ^; |, ?8 }
    + w9 Q) V+ d1 B5 e& w1 W strFrom = fromAdd
    9 l" G  E) `4 Q/ a# J) u+ x strTo = toAdd
    4 X# f) z3 ~% [8 e9 j6 T$ F+ {$ ?2 T4 W, ~: _' w6 t
    msgRoot = MIMEMultipart('related')
    & j; F, p2 Y" t7 k$ s2 N6 O4 @ msgRoot['Subject'] = subject$ m' n; y# H- z$ H8 L7 s
    msgRoot.preamble = 'This is a multi-part message in MIME format.'
    4 c1 L; p' s1 Z# G1 l/ S* y" H9 Z% F$ L  F
    msgAlternative = MIMEMultipart('alternative')* ?9 n- R! e. n2 B+ Y$ W
    msgRoot.attach(msgAlternative)
    ' z6 }$ D! w+ e; B$ y  P+ o
    / S( y7 |& L9 W* J/ P msgText = MIMEText(html_text, 'html', 'utf-8')
    7 X6 k* j* F5 M! R msgAlternative.attach(msgText). f2 E0 e4 ]0 W* E3 C" @8 O' P

    " }. L7 T! U2 v7 j' g; r smtp = smtplib.SMTP()2 Y; F1 \3 o6 `8 G# }& Q: F
    smtp.connect(server), q% T. d# W! d
    smtp.login(user, passwd)
    4 L# [" W. ]; A$ t$ j$ O
    ' ^" r/ D8 Z/ q) P  G- \5 D- Z  l: t att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')" b5 l% n+ e# x- o' v! F, H
    att5["Content-Type"] = 'application/octet-stream'! Z+ u3 i, R+ C
    att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
    ; N1 _7 Y! Q- h msgRoot.attach(att5)* t3 [4 a2 z( x0 k) @

    5 {6 L* d% Y6 q9 A4 B smtp.sendmail(strFrom, strTo, msgRoot.as_string())
    , J6 H* V3 C+ `5 P smtp.quit()
    / z. N5 l! {; r* E& c. L return7 r; p( u  \& @$ H# |2 o

    7 V' U; \$ {% u$ n1 l0 `! B& _6 e
    成功代码:
    % ]& ?) k7 `" X/ Z8 n( c) `! j#!/usr/bin/env python  l+ t9 {  Y# H$ N  f
    # -*- coding: utf-8 -*-
    2 d- l/ W4 e! A7 B$ r8 F# a
    ! ]+ E! L6 V4 C% G. Z5 aimport smtplib
    % B9 c0 b$ q' y( j' Y* k9 U' yfrom email.mime.multipart import MIMEMultipart
    + s4 m7 Q. t3 B$ E  p2 n, c; lfrom email.mime.text import MIMEText3 V1 a. w! W+ b/ p
    from email.utils import parseaddr
    7 v: E0 j+ X# W6 Afrom email.utils import formataddr# s' F3 }! i1 b+ }7 E
    from email.header import Header
    # s% ^: v% a6 J5 b) k
    % B( z. b& R) b2 H( _/ o+ p+ M
    , w% b4 H2 b+ f2 C# _8 qdef __format_addr__(addr):/ L* s2 m6 u/ z) T( f: a
    # 解析邮件地址,以保证邮有别名可以显示
    # X1 U+ ?8 V2 X8 @1 t5 }+ a alias_name, addr = parseaddr(addr)
    . T+ y7 `  g' V # 防止中文问题,进行转码处理,并格式化为str返回  y  B% O0 I/ N5 r
    return formataddr((Header(alias_name,charset="utf-8").encode(),
    4 d' R& d5 c0 ^# K9 h# E2 S      addr.encode("uft-8") if isinstance(addr, unicode) else addr))
    : |% t0 B2 V% B0 f" G" x( F3 _, [) }& f4 v8 Q5 @  j0 B7 \
    1 H* s# h4 c4 a) x7 Q
    def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
    ) {1 t+ h8 ~0 g, Z8 s" E+ m( C# Z9 T( R, i
    SERVER = 'mail.***.com'
    ( a  ]0 ?. ]# O* k  Y4 b4 R  o USER = '******'  c& e; m. y4 p% P) C! o
    PASSWD = '***'
      ^" Q/ j; K, M  C+ F  ]) Y' p/ V6 f& g5 s8 u/ k
    strFrom = __format_addr(fromAdd)# n' W9 c* V2 h4 Z2 b8 c+ E( F& K
    , P0 ?' {, V; Q8 _- N
    strTo = list()
    $ ?2 M$ F( b) F) B/ x% _ # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
    1 P0 b8 x$ b8 v( i; y try:: N! y. b' j* ~# ?9 o3 `+ {4 A
      for a in toAdd:# @. q+ f* E) V+ c6 J
       strTo.append(__format_addr(a))% K- n' Q7 ^/ z! j  i4 y% [
    except Exception as e:
    + N7 ]. P; `, i# @1 Q+ F, i  # 没有对a和toadd进行type判断,出错就直接还原
    / k3 Q& T  J2 Q# L- g; s2 C( H  strTo = toAdd
    " [, G9 ]& Y& J9 b% v8 L# g6 H" N
    / j- w! x/ z. ]1 w! G1 y! s1 L msgRoot = MIMEMultipart('related')0 G9 I8 E& H+ M' J
    msgRoot.preamble = 'This is a multi-part message in MIME format.'
    ' g% f& \; W+ P+ Y, r4 {; \  b1 o+ j) k0 o" F# Y
    msgAlternative = MIMEMultipart('alternative')# I; k; l! |, l. n
    msgRoot.attach(msgAlternative)
    , u0 A5 z& ~. }, a3 b( ]# S* Z5 f, ~& c9 s& i
    # 邮件对象 5 E  B* Q2 @2 ^9 R
    msgText = MIMEText(html_text, 'html', 'utf-8')+ C7 R- ~. ?9 A4 c5 d
    msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
    0 e2 B- X% g: b( `. ?5 R- l# {3 M msgRoot['From'] = strFrom  # 发件人也是被格式化过的  Z$ Z. C' `* ?% J# F6 I0 p
    msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
    * }8 k  N' I" f msgAlternative.attach(msgText)
    2 q; M) Y1 O9 d$ n2 @. L
      c) E  L/ G  l1 v5 P smtp = smtplib.SMTP(SERVER, 11)4 m4 O) d& H- X. i
    smtp.set_debuglevel(0)
    1 a4 [* i: X8 j: V( u # smtp.connect(SERVER)
      p: H& q, r$ M1 x smtp.login(USER, PASSWD)5 ?, N8 q& @$ E1 L
    # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别( I: k3 H# t$ F# S' `
    smtp.sendmail(fromAdd, toAdd, msgRoot.as_string()). R  ?* T% X: `0 {: z& e
    smtp.quit(), n/ ~* m7 j0 j# U+ v* C6 f( u
    总结:
    + @) v, {$ N9 H
    - ?* p! a+ h9 {  M  d看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
    ) r% }* Z3 n: u7 }
    ' m; J1 n( O7 G$ {7 p/ o/ @7 d/ o实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”7 B7 @" N& U0 F' k2 `

    ( S  e2 C' K& [同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
    # A4 P5 ]* H( X1 D: L" W
    ' J3 J6 v' i& r# \2 o/ V还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
      g; u" i  n  T/ S- O2 b7 K最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
    ; E1 V/ V4 \  h
    . j' c% e) B2 h. n9 J" i2 R% `,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员2 a, m" B8 Z$ f1 h% h) z
    7 Y. ]; @. F9 v
    定时讲解Python技术,分享一些学习的方法和需要留意的小细节
    . L- z: s+ a: |. ], S" K0 K) I3 T————————————————
    % K0 B6 d% }, Z# `# G原文链接:https://blog.csdn.net/haoxun12/article/details/105162947
    9 e4 B% {  p  z/ |$ K: f
    ' g# J2 d& R( y- H, t! `
    # m4 g" k* {% j! F4 j% l5 i0 D4 G2 n0 j* b8 ?8 }4 J
    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-2 06:31 , Processed in 0.422091 second(s), 61 queries .

    回顶部