QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6146|回复: 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发送多人邮件没有展示收件人问题的解决方法
    0 e9 x; z* R6 r  I这篇文章主要为大家详细介绍了python发送多人邮件没有展示收件人问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下- J7 y1 J$ B; n' z* o8 I
    背景:- |  S& @+ b+ T; k% g/ U
    . n! X9 I! |; ^4 t6 z
    工作过程中需要对现有的机器、服务做监控,当服务出现问题后,邮件通知对应的人
    ) g) u- y( `* }& @
    $ F. l2 j% b7 l( q' L5 v- |0 a问题:
    & J% O& f- f& w; ?2 M; Y4 @2 ?! S- ^4 s
    使用python 2.7自带的email库来进行邮件的发送,但是发送后没有展示收件人列表内容& ^) c9 f* x" u) K, z: D  W
    & D# V  d. g. Z% R5 ]: u  Y; h- @; @
    问题代码示例:
    6 x4 K  r4 o( D2 {4 U: f2 r4 R# -*- coding:utf-8 -*-
      T8 [$ u  N+ F: Timport smtplib  }6 P7 V  |' n8 Z" d
    from email.mime.multipart import MIMEMultipart' b5 F) n) Y. v( a8 }5 V! M) Z
    from email.mime.text import MIMEText
    8 m8 l' q. F" h; B! n6 M! D% }# v( }( a( o9 R% \2 I' T
    def send_email_to(fromAdd, toAdd, subject, html_text, filename):7 u6 u1 C3 u. ?) Y1 F& L# a2 k4 N
    server = 'mail.****.com'* i. G3 i$ E- \
    user = '*****'
    $ J" V0 M. d7 i5 S, A  e1 p password = '********', p& L& ]! n3 d% r6 ^

    2 [1 A/ B/ t2 A strFrom = fromAdd( X5 A' v" n  x- J0 K5 o+ s
    strTo = toAdd( F7 Z" M2 D7 t

    5 G" p+ J0 K5 l3 c* G- J% f: b8 m' ~ msgRoot = MIMEMultipart('related')
    " E; A" l. ^+ h' ~, l0 d msgRoot['Subject'] = subject
    - |$ y; ^8 p, \& o msgRoot.preamble = 'This is a multi-part message in MIME format.'
    2 ~0 s; d! m( u) c) @' Y( A2 H8 X  y
    msgAlternative = MIMEMultipart('alternative')& R/ M  x/ Q* n+ |8 U1 n5 z
    msgRoot.attach(msgAlternative)
    2 T1 V, Y+ A- i+ M2 g- r5 A9 ]# ]2 l* h1 y* n
    msgText = MIMEText(html_text, 'html', 'utf-8')4 \# b/ Y; X! k" v7 h- P
    msgAlternative.attach(msgText)
    ( o  ~( C2 w) ^) Y( N# s1 H4 m
    0 W! [& j4 L! t) d5 S3 q# a smtp = smtplib.SMTP()3 G/ z' K1 M2 l$ i7 ^8 m
    smtp.connect(server)7 l0 T0 n( O' ^. I
    smtp.login(user, passwd)/ ?2 p* o& k% q# a1 g: S! c

    * N! F) g- I' W3 M2 U( {' |6 j/ i att5 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')" ]7 c7 @6 _- x# Y. i& z0 {
    att5["Content-Type"] = 'application/octet-stream'2 i8 K  l, @0 ~9 [- `' x
    att5["Content-Disposition"] = 'attachment; filename="fail_7_storage.txt"'
      n6 t0 g7 f0 d: j! L; ] msgRoot.attach(att5)- B$ j" L4 @1 g' Y; j4 U: W& Z

    3 S* F1 H) [) t1 X- T" @ smtp.sendmail(strFrom, strTo, msgRoot.as_string())
    / ]8 e; H  W# M! Y$ i smtp.quit(). J9 L+ x# R: [; B# c+ }! A4 Z6 P
    return1 C( k! ]- Q( a( s( e
    ) c# S% ^' v$ ~: @2 A' `5 H
    # m. {0 Z8 r6 X4 \
    成功代码:
    : ?1 E1 I2 a) z" n3 k#!/usr/bin/env python
    7 q/ X$ i4 N' L& D# b9 X# -*- coding: utf-8 -*-
    - ~3 S% O  ^$ R( w: J' i/ {
    2 \' a, c0 z& L* ~" qimport smtplib) C% `3 V3 H) P  o
    from email.mime.multipart import MIMEMultipart
    & g' x% p+ }- d5 x6 Kfrom email.mime.text import MIMEText
    3 U3 g4 W1 s3 l2 u5 `  ]5 Lfrom email.utils import parseaddr
    1 @" o, F1 D$ f( o2 k: p; h9 q% j3 Mfrom email.utils import formataddr
    : u# a1 J& {/ [* n9 s/ Bfrom email.header import Header1 U3 ^% @/ I0 V! e! B7 u: D" ^

    0 W2 P( p. b! P" P* n  E7 h+ W3 Z. c, x5 K6 ?
    def __format_addr__(addr):/ d: }3 D' H) a( `1 @" L
    # 解析邮件地址,以保证邮有别名可以显示
    ( x6 P: E! G  s alias_name, addr = parseaddr(addr)
    2 D; ?% t( M+ T4 B  z" N7 ^& q # 防止中文问题,进行转码处理,并格式化为str返回0 ^$ `' q! v9 c! [8 N: x) l
    return formataddr((Header(alias_name,charset="utf-8").encode(),
    " O  n1 N. p! h& t- m      addr.encode("uft-8") if isinstance(addr, unicode) else addr))0 _3 I! Y$ |8 y+ J9 S! a$ G# _# M

    & v7 \8 M3 i, w% k! C% _
    5 R8 e4 p/ Y# ^' Q$ g( Y! |def send_email_to(fromAdd, toAdd, subject, html_text, filename=None):
    - L/ Q0 C! \' r5 B. A+ m5 c$ t2 k: w1 a6 x
    SERVER = 'mail.***.com'
    % j  s" i* Y6 M$ g# W0 T1 s) y USER = '******'
    & t' ~5 k3 C8 E' E PASSWD = '***'( {2 R5 v6 [; {
    9 b7 p! f" c/ w7 b8 Z$ T
    strFrom = __format_addr(fromAdd)
    4 Q7 r% e2 S! j  O; E9 H
    1 S! a, o7 E- q1 G; N3 b- ], S strTo = list()  q8 d$ b9 I$ Y- N; m1 n. j
    # 原来是一个纯邮箱的list,现在如果是一个["jayzhen<jayzhen@jz.com>"]的list给他格式化4 D, y! I; Z% g! S
    try:
    - n) O& a  a- A1 `6 b  for a in toAdd:/ }: D9 ^% _& W# S# X
       strTo.append(__format_addr(a))' I: S1 {: f* K5 k- \
    except Exception as e:
    ' @8 s/ X* B, t3 K  # 没有对a和toadd进行type判断,出错就直接还原
    . O7 V3 r( U# S7 w  a  E  strTo = toAdd
    . l8 x; M$ E; `
    - ^) l1 C$ J# Z  c5 ^ msgRoot = MIMEMultipart('related')
      E& R4 B5 g1 y* ?; t msgRoot.preamble = 'This is a multi-part message in MIME format.'4 i+ L! ^/ V* M" S0 J

    . C9 ^4 [/ c0 m- @% \: u$ X msgAlternative = MIMEMultipart('alternative')
      g- e& t6 f. k- C msgRoot.attach(msgAlternative)9 Y9 g6 s3 D* r1 U3 L; W' w4 o; l% C

    ! n+ i6 Q, u- G; L. a) z # 邮件对象
    4 j1 }7 m6 r" ^( n msgText = MIMEText(html_text, 'html', 'utf-8')
    5 G) I  G: B9 i) K& g4 b$ B; E msgRoot['Subject'] = Header(subject) # 这是邮件的主题,通过Header来标准化
    + b( N# @4 @6 ]% a9 z! O% G msgRoot['From'] = strFrom  # 发件人也是被格式化过的
    7 Z# H7 J) T# s0 K! h, R msgRoot['to'] = ','.join(strTo) # 这个一定要是一个str,不然会报错“AttributeError: 'list' object has no attribute 'lstrip'”( p; P' ^4 T: y4 U0 i3 W" N
    msgAlternative.attach(msgText)  H. P$ E( D% ^& K6 w6 r5 f% S6 O1 t
    . R" N* T8 V. g1 x
    smtp = smtplib.SMTP(SERVER, 11)+ p# Y% f9 r4 [: a6 Y2 I
    smtp.set_debuglevel(0)
    ; |+ S. m/ l3 p$ \ # smtp.connect(SERVER)
    " ~5 w' C* _5 F smtp.login(USER, PASSWD)
    / N. C& J1 H/ U, r5 N$ a, _2 e' ]( D # 这里要注意了,这里的fromadd和toAdd和msgRoot['From'] msgRoot['to']的区别
    0 J: W9 P% D$ Z9 [% X$ n; C smtp.sendmail(fromAdd, toAdd, msgRoot.as_string())
    2 _) A) S4 }8 k0 v% P9 ? smtp.quit()
    : ]7 Z: Y+ ?2 ]5 L总结:
    # f6 w& E1 E+ X5 Q9 w+ a& g" K) M  a) X( @4 e
    看到 msgRoot[‘to’] = ‘,’.join(strTo) 与 msgRoot[‘to’] = strTo
    * V9 g& d' F* `" u0 {8 t: _# ~# Z/ Q; _" o& g# B' Y6 O0 W* E
    实验过程中发现这个[“to”]一定要是一个str,不然会报错“AttributeError: ‘list’ object has no attribute ‘lstrip’”4 B+ V  H* O9 Z

    * b, }, Y) O" }: Y1 {同时也发现[“to”]的数据类型与sendmail(from_addrs,to_addrs,…)的to_addrs不同;前者为str类型,多个地址使用逗号分隔,后者为list类型
    + I+ u1 A7 S! F9 ^' \
    ) y; q: R; [) g还有就是MIMEText、MIMEMultipart他们之间的关系,可以看一哈源码,他们算是兄弟关系,都是继承MIMEBase,那么这是时候,[“From”]、[“to”]等这些属性给谁都行。
    & z8 ?9 g# b) T) K5 D0 @5 g4 `6 g最后给大家推荐一个口碑不错的python聚集地【点击进入】,这里有很多的老前辈学习技巧,学习心得9 y( o; c! n. V( d9 E
    3 n5 G$ T9 X+ }2 A" u, x4 l, u, |
    ,面试技巧,职场经历等分享,更为大家精心准备了零基础入门资料,实战项目资料,每天都有程序员
    0 m, \% ], c4 U6 z4 |  ]( H, }* Z" ~' t! F- ^, U6 c
    定时讲解Python技术,分享一些学习的方法和需要留意的小细节
    . F% R7 i/ W6 |————————————————
    9 V, k) ?1 E; P& _& c原文链接:https://blog.csdn.net/haoxun12/article/details/105162947/ o" r6 G2 a/ [9 j3 d) Y; C- _

    ) k' R: u/ J$ _5 v( N9 h' }8 \
    0 |/ U% `. ?8 b7 v* [7 q1 O9 r+ U0 |+ e7 h7 i; Z% O/ Y/ h# K. K
    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-4 03:55 , Processed in 0.472675 second(s), 61 queries .

    回顶部