关闭

Python模块探秘 Smtplib发送带有各种附件的邮件

标签: python邮件带各种附件的有邮件
19582人阅读 评论(4) 收藏 举报
分类:

这两天对Python的邮件模块比较感兴趣,于是就查了查资料。同时在实际的编码过程中也遇到了各种各样的问题。下面我就来分享一下我与smtplib的故事。


前提条件

我的上一篇博文里面讲解了,发送邮件必须的条件。这里同样是适用的。大致就是要开启邮箱的SMPT/POP服务等等。如果不明白,可以看看发送纯文本邮件。里面讲的还不错。 :-)

核心知识点

因为今天主要讲解的是如何发送带有附件的邮件,那么核心肯定是附件了。怎么才能发附件呢?

其实我们换个思路,就不难理解了。因为我们发送邮件,经过了应用层–>> 传输层–>> 网络层–>>数据链路层–>>物理层。这一系列的步骤,全都变成了比特流了。所以无论是纯文本,图片,亦或是其他类型的文件。在比特流的面前,都是平等的。所以我们发送附件,也是按照发送纯文本的模式来做就行,只不过加上一些特殊的标记即可。


\# 首先是xlsx类型的附件
xlsxpart = MIMEApplication(open('test.xlsx', 'rb').read())
xlsxpart.add_header('Content-Disposition', 'attachment', filename='test.xlsx')
msg.attach(xlsxpart)

\# jpg类型的附件
jpgpart = MIMEApplication(open('beauty.jpg', 'rb').read())
jpgpart.add_header('Content-Disposition', 'attachment', filename='beauty.jpg')
msg.attach(jpgpart)

\# mp3类型的附件
mp3part = MIMEApplication(open('kenny.mp3', 'rb').read())
mp3part.add_header('Content-Disposition', 'attachment', filename='benny.mp3')
msg.attach(mp3part)

经过这三小段的代码,想必你已经很清楚了吧。无非就是使用MIMEApplication进行包装一下,然后设置一下内容。最后添加到邮件内容。就是这几步,就搞定了。

完整的代码

# coding:utf-8

#    __author__ = 'Mark sinoberg'
#    __date__ = '2016/5/26'
#    __Desc__ = 实现发送带有各种附件类型的邮件

import urllib, urllib2
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication

username = '156408XXXXX@163.com'
password = 'XXXXXXXX'
sender = username
receivers = ','.join(['10643XXXX2@qq.com'])

# 如名字所示: Multipart就是多个部分
msg = MIMEMultipart()
msg['Subject'] = 'Python mail Test'
msg['From'] = sender
msg['To'] = receivers

# 下面是文字部分,也就是纯文本
puretext = MIMEText('我是纯文本部分,')
msg.attach(puretext)

# 下面是附件部分 ,这里分为了好几个类型

# 首先是xlsx类型的附件
xlsxpart = MIMEApplication(open('test.xlsx', 'rb').read())
xlsxpart.add_header('Content-Disposition', 'attachment', filename='test.xlsx')
msg.attach(xlsxpart)

# jpg类型的附件
jpgpart = MIMEApplication(open('beauty.jpg', 'rb').read())
jpgpart.add_header('Content-Disposition', 'attachment', filename='beauty.jpg')
msg.attach(jpgpart)

# mp3类型的附件
mp3part = MIMEApplication(open('kenny.mp3', 'rb').read())
mp3part.add_header('Content-Disposition', 'attachment', filename='benny.mp3')
msg.attach(mp3part)

##  下面开始真正的发送邮件了
try:
    client = smtplib.SMTP()
    client.connect('smtp.163.com')
    client.login(username, password)
    client.sendmail(sender, receivers, msg.as_string())
    client.quit()
    print '带有各种附件的邮件发送成功!'
except smtplib.SMTPRecipientsRefused:
    print 'Recipient refused'
except smtplib.SMTPAuthenticationError:
    print 'Auth error'
except smtplib.SMTPSenderRefused:
    print 'Sender refused'
except smtplib.SMTPException,e:
    print e.message

验证结果

没有什么比来张图片更有说服力的了。如图
带有各种附件的邮件结果图

错误总结

我遇到的错误如下:

D:\Software\Python2\python.exe E:/Code/Python/MyTestSet/mail/withappedix.py
Traceback (most recent call last):
  File "E:/Code/Python/MyTestSet/mail/withappedix.py", line 51, in <module>
    client.sendmail(sender, receivers, msg.as_string())
  File "D:\Software\Python2\lib\email\message.py", line 137, in as_string
    g.flatten(self, unixfrom=unixfrom)
  File "D:\Software\Python2\lib\email\generator.py", line 83, in flatten
    self._write(msg)
  File "D:\Software\Python2\lib\email\generator.py", line 115, in _write
    self._write_headers(msg)
  File "D:\Software\Python2\lib\email\generator.py", line 164, in _write_headers
    v, maxlinelen=self._maxheaderlen, header_name=h).encode()
  File "D:\Software\Python2\lib\email\header.py", line 410, in encode
    value = self._encode_chunks(newchunks, maxlinelen)
  File "D:\Software\Python2\lib\email\header.py", line 370, in _encode_chunks
    _max_append(chunks, s, maxlinelen, extra)
  File "D:\Software\Python2\lib\email\quoprimime.py", line 97, in _max_append
    L.append(s.lstrip())
AttributeError: 'list' object has no attribute 'lstrip'

Process finished with exit code 1

我的解决办法是
receiver parameter was list type. either it should be list converted to string using join method or if it is a single recipient, then pass it as a string only

是的,就是receivers = ','.join(['10XXXXXXXX@qq.com'])。这样就搞定了。

也许,你遇到的错误不是我这个,那么也不用担心,我这里有一份比较齐全的错误码对照表。你可以对照着你的错误码来查找具体的错误原因。这样有的放矢,效率会更高一点的。

在编码的过程中,我也是遇到了很多意想不到的错误。而这些错误的错误码对我们来说是很有用的。这对我们测试代码以及找到其中出错的原因和有帮助。

企业退信的错误码对照表

(^__^) 嘻嘻……。这下字体够大了吧。

3
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Python SMTP 发送带附件电子邮件

可采用email模块发送电子邮件附件。发送一个未知MIME类型的文件附件其基本思路如下: 1. 构造MIMEMultipart对象做为根容器 2. 构造MIMEText对象做为邮件显示内容并附加到根容器 3. 构造MIMEBase对象做为文件附件内容并附加到根容器   a. 读入文件内容并格式化  ...
  • zm2714
  • zm2714
  • 2012-09-18 22:25
  • 32826

python发送邮件(带附件)、发送给多人、抄送给多人的示例

python发送邮件(带附件)、发送给多人、抄送给多人的示例 #!/usr/bin/env python # -*-encoding: utf-8 -*- import smtplib from email.mime.multipart import MIMEMultipart fro...
  • biboshouyu
  • biboshouyu
  • 2016-11-25 18:12
  • 7124

PYTHON模块学习之smtplib

python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。 smtp协议的基本命令包括:     HELO 向服务器标识用户身份     MAIL 初始化邮件传输 mail from: ...
  • bravezhe
  • bravezhe
  • 2012-06-13 13:45
  • 25402

通过python发送带附件(支持多个附件)的邮件

目的:实现通过邮件,自动发送自动化脚本执行结果给对应的人 记录点:1 发送账号的密码设置,通过QQ发送的时候,目前QQ邮件的smtp设置的时候,都是通过授权码来进行账号认证,如果直接在脚本中写入QQ邮箱的密码,在执行脚本的时候,QQ服务器也会将密码认为是授权码进行编译,这样就导致失败。具体的如果获取...
  • zhouxuan623
  • zhouxuan623
  • 2016-09-20 15:16
  • 3185

python发送邮件sendmail--smtplib【带附件】

#!/usr/bin/env python # -*- coding: UTF-8 -*- from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email.mime.tex...
  • five3
  • five3
  • 2014-05-31 15:21
  • 8336

Python smtplib发送邮件 包含文本、附件、图片等

#!/usr/bin/env python #coding: utf-8 ''' FuncName: smtplib_email.py Desc: 使用smtplib发送邮件 Date: 2016-04-11 14:00 Author: johnny ''&...
  • z_johnny
  • z_johnny
  • 2016-04-13 20:11
  • 5202

smtplib SMTP登錄失敗解決辦法

網上找到的解決方法,貼一下。需要修改smtplib.py代碼  elif authmethod == AUTH_LOGIN: #modi start 添加代碼 (code, resp) = self.docmd("AUTH&...
  • moxien
  • moxien
  • 2009-06-16 17:04
  • 3289

Python 发送带有中文附件的邮件

之前在网上找了半天没找到解决方案,后来通过看
  • HUI_LANG
  • HUI_LANG
  • 2014-05-27 21:37
  • 2041

Python自动发送邮件并添加附件的源代码

  • 2017-03-06 16:35
  • 372KB
  • 下载

python发送邮件脚本(支持多个附件,中文)

本人原创文章,转载请注明来源,合法转载! #!/usr/bin/env python # -*- coding: utf-8 -*- import smtplib import sys from email.mime.text import MIMEText import linecache im...
  • yanshu2012
  • yanshu2012
  • 2015-12-24 18:03
  • 3478
    个人资料
    • 访问:3178472次
    • 积分:34449
    • 等级:
    • 排名:第153名
    • 原创:353篇
    • 转载:35篇
    • 译文:9篇
    • 评论:707条
    友情链接
    我的偶像
    个人主页
      GitHub
    放松一下
    博客专栏
    最新评论
    版权信息
    去除本页广告
    图片炸弹装填中...

        
    [img=赞一个]http://bpic.588ku.com/element_origin_min_pic/16/12/12/0d96da96cf36505736c09d63832eaac8.jpg[/img]