QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6054|回复: 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发送多人邮件没有展示收件人问题的解决方法$ W: u5 k6 w8 g% m
    这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    . K. I. r. }# x6 I9 F背景:
    6 c) H& H$ Q, G; V' r$ _7 Z, O# p- [8 i, a7 a# ~5 l8 O
    工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
    / {( A% ^$ i. l  ]8 ^+ ^% {2 P/ O& l/ X
    问题:
    1 w$ r6 p4 g# L; Y) |2 @2 s
    7 ^% R) z' k. ^" k使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容0 C; g1 Q3 d  F

    % p! k8 K* e7 ~0 J' h! s" k0 c问题代码示例:
    2 |* l/ d6 t- Z3 f( v5 l8 ?$ s# {# -*- coding:utf-8 -*-1 t6 V& f2 n$ D1 P8 Z
    import smtplib, H% l+ r" J9 @
    from email.mime.multipart import MIMEMultipart
    , T7 r. d' N5 Z4 ^from email.mime.text import MIMEText0 A; Q, H5 B0 W6 B

    ) X) w( u  x8 U1 t" {def send_email_to(fromAdd, toAdd, subject, html_text, filename):
    6 N9 X$ V/ h! Y0 H server = 'mail.****.com'# x% y6 E+ V& w2 }: B
    user = '*****'
    ! U# V9 g9 X* p) H password = '********'
    5 I8 x3 r7 n6 v6 A, N' s! d& N6 Y0 F
    ! Y/ a4 i5 D4 q6 c: j) m strFrom = fromAdd
    3 I2 N* [1 w2 ~3 ?' z strTo = toAdd
    ! D$ k4 E/ B# q9 _, h
    8 T2 Z$ {, D1 u1 C2 j# y msgRoot = MIMEMultipart('related')
    $ q0 @! H' O' s3 D; j msgRoot['Subject'] = subject/ C% P$ c* @! v2 b7 H) }' b
    msgRoot.preamble = 'This is a multi-part message in MIME format.'$ c4 L9 \) Y' Y8 J  T" o
    6 j& _, ~* \2 a
    msgAlternative = MIMEMultipart('alternative')
    1 u# g0 c$ N1 w" a2 c msgRoot.attach(msgAlternative)9 K. R8 d' ^; l, M7 y, G6 y

    ) u! a- {4 c& ?$ z) Z msgText = MIMEText(html_text, 'html', 'utf-8')8 f. p- p2 K9 p. [4 h) [/ w# V
    msgAlternative.attach(msgText)
    2 a& p* O2 L, [  s! A
      ?7 A2 c; y; t* `2 |" } smtp = smtplib.SMTP()) E1 O) Q: g, \6 s/ ~
    smtp.connect(server)* Y6 o" B2 S4 I9 P* \7 O) n
    smtp.login(user, passwd)1 @- [) \: u, r

    , _6 O" q# r2 W& W/ a) Y6 I1 e att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')4 {* g0 X; G9 n2 g* {
    att5["Content-Type"] = 'application/octet-stream'5 o. u# d0 u$ O# C& B' {. t+ Q
    att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'7 c. s9 s' r. e/ D
    msgRoot.attach(att5)
    ) ?; v8 d1 ^7 H+ [$ e$ t3 U' }6 ?5 U6 H$ a0 s" m+ P& _
    smtp.sendmail(strFrom, strTo, msgRoot.as_string())8 h1 O; L3 Z" ~4 S7 `" R$ d
    smtp.quit()
    3 u7 B2 w* E  P$ | return
    : I  a% F! d) L, K1 C4 S  [( [+ }
    ! `3 _# U: s3 o9 a4 w9 z* Z4 A) b/ s7 M( ?6 s
    成功代码:
    ! O. ]: I# K4 [3 k+ _4 w- _#!/usr/bin/env python
    0 T5 m# ?# ?  y( z. J8 _; F# -*- coding: utf-8 -*-% ]( V0 ~! F* U5 e* R
    6 D4 e+ P& j# v) t3 @
    import smtplib6 Y% I$ M  d& X" v; Y4 u, z: I/ K
    from email.mime.multipart import MIMEMultipart  R# D6 P6 D1 {' {& K" h
    from email.mime.text import MIMEText
    $ D7 M! h0 ]; Ofrom email.utils import parseaddr
    6 p8 s, \! Y4 qfrom email.utils import formataddr
    - r, H! A/ @, q0 p( Afrom email.header import Header
    6 P8 @+ v  F* y! F& j5 N. \
    ' q( L1 ^4 H1 X  Q* \3 l- d! ~0 O9 @; d  \# E& Y
    def __format_addr__(addr):
    , L* E& c" y! S2 D3 U # 解析邮件地址,以保证邮有别名可以显示
    / a/ u$ G& t# d" ?8 o4 B5 X alias_name, addr = parseaddr(addr)9 I) ?- P* n; c  n6 P
    # 防止中文问题,进行转码处理,并格式化为str返回
    # R8 i! f/ q+ b$ m3 q% [ return formataddr((Header(alias_name,charset="utf-8").encode(),9 ?, {; v4 x8 S8 \; S; {  b4 H
          addr.encode("uft-8") if isinstance(addr, unicode) else addr))
    + y( E0 C4 l) n. h% w* |. h8 s3 Q+ q) _! X/ {) i$ [
    7 ^. s9 E3 s7 m0 U! U
    def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):: D" z6 i% ~5 q( L. L2 k1 c. Z

    / l, o0 R8 T! y% l6 d SERVER = 'mail.***.com'9 Z: x/ L0 k0 k+ A  S# d
    USER = '******'
    $ i2 u0 j& h6 j3 @2 u- M! _ PASSWD = '***'
    / F/ d1 m; d5 e
    " {% ?6 _8 H5 _3 t8 ] strFrom = __format_addr(fromAdd)
    . ^1 Y6 _1 D3 W9 f
    : W5 }' {4 P4 E4 [; J strTo = list()
    ; Q, Y6 ?$ S+ c0 P6 z5 q# C. X7 p' V2 l# E # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化
    " z7 R% `# o- u; Q, ?2 }! ~ try:
    " _9 N. N8 Y( s5 r+ i  for a in toAdd:9 g. x7 ?: q. q- V0 G
       strTo.append(__format_addr(a))% @7 ^$ ?# M) V# o
    except Exception as e:2 s) e- R6 ^- Q- O
      # 没有对a和toadd进行type判断,出错就直接还原
    . N* b  b4 ^7 u/ C( P9 F* I( g  strTo = toAdd
    9 ?/ ?  _2 B2 R! m* o6 L
    + C% D& b6 V5 x) y1 W& U msgRoot = MIMEMultipart('related')( D2 F) k! q' H% ?7 E# A. n* h8 [
    msgRoot.preamble = 'This is a multi-part message in MIME format.'
    % n. }/ l9 h: {  s. W' ]' }5 ~3 T0 y- l7 Z' x6 \
    msgAlternative = MIMEMultipart('alternative')# g" V/ @5 O  _
    msgRoot.attach(msgAlternative)
    5 O2 R2 f9 p& T. F
    + t( e! o0 P$ p # 邮件对象 0 f) X! w4 J0 _' x0 _6 {" `0 S
    msgText = MIMEText(html_text, 'html', 'utf-8')
    7 a+ l$ Q5 X% i6 w$ G: u8 @/ v msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
    9 G+ J* f+ Y+ |; ^6 k msgRoot['From'] = strFrom  # 发件人也是被格式化过的
    7 ]) H6 [/ r. |+ d& h/ F msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”
    5 Z6 F; \+ s% L+ P msgAlternative.attach(msgText)* A9 p, G$ N  a7 C
    3 K0 z( L# [% d# R8 O3 Q
    smtp = smtplib.SMTP(SERVER, 11); y" u/ \0 R+ i2 _
    smtp.set_debuglevel(0)! G" w) o  u9 C
    # smtp.connect(SERVER)' y7 D! ~4 q. R% D( c) o$ g2 o
    smtp.login(USER, PASSWD)
    0 M8 M6 g6 R6 j2 I # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
    6 s2 I2 W# J, _0 S, K; b smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())* y* k' L. _3 n" h% _( Y& R4 _
    smtp.quit()  r# d, D. u' [$ p! Q
    总结:  b+ h: T, Q2 T! b: p% T7 w: m

    9 S9 @9 V4 d$ S4 d看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
    4 B' m. n0 ~+ ?+ E! ]+ d. R4 k
    实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”2 G; j& C/ k4 G7 r+ K+ G+ }9 N' j

    ( @- c6 _; T) p# j! |同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
    6 n6 E" ]3 i7 J  E" `7 O( X$ ]+ Y9 j4 f' K  |0 U, D
    还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
    / o8 x5 z& E: ~最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得
    9 x* z4 J6 v: i7 [3 L6 O- q. Y
    9 t: C7 s! K5 F; w0 M,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
    5 `% G2 C! E0 N/ r1 R- V3 b% W. l% ?& u
    定时讲解Python技术,分享一些学习的方法和需要留意的小细节
    0 }4 a. x" x  \————————————————
    % d& E7 q# h2 d  J原文链接:https://blog.csdn.net/haoxun12/article/details/105162947* M: Q8 }2 V, f6 g% b) Q
    ' ~9 s4 M7 ?- x# |  _& S- `

    * o$ M" h2 N" \
    . m7 d/ m' i; f0 o# P4 d6 G
    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-4-18 09:18 , Processed in 0.431359 second(s), 61 queries .

    回顶部