通过 python 处理 email - Email via Python
Email via Python
1 MIME - Multipurpose Internet Mail Extensions
SMTP - Simple Message Transport Protocol 邮件的发送,
例子 - send email
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate, make_msgid
mess = 'hello there'
mesgobj = MIMEText(mess)
mesgobj['To'] = 'testrecevier@example.com'
mesgobj['From'] = 'testsender@example.com'
mesgobj['Subject'] = 'Greeting'
mesgobj['Date'] = formatdate(localtime=1) # Date header, formatdate() 生成 email 专门日期格式
mesgobj['Message-ID'] = make_msgid() # make_msgid() 方法生成唯一的 Message-ID,
print(mesgobj.as_string())
print(mesgobj.as_bytes()) s = smtplib.SMTP('SMTP-SERVER-ADDR')
s.send_message(mesgobj)
s.quit() 邮件的解析,
例子 - parsing email,
from email.parser import Parser
headers = Parser().parsestr(mesgobj.as_string()) # mesgobj 为上例中对象.
for h,v in headers.items():
print("Header[%s] - " % h,v)
print('Emial content - ', mesgobj.get_payload()) # 打印邮件正文. 带有附件的邮件发送处理 - Packing MIME,
邮件的附件有 音频, 图像, 压缩文件等等, 通过 python doc 的上的例子看一下儿
对邮件的附件的处理方式,
例子 - send email with attachments,
* an example of how to send the entire contents of a directory as an email message import os
import sys
import smtplib
# For guessing MIME type based on file name extension
import mimetypes
from optparse import OptionParser
from email import encoders
from email.message import Message
from email.mime.audio import MIMEAudio
from email.mime.base import MIMEBase
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText COMMASPACE = ', ' def main():
parser = OptionParser(usage='''\
Send the contents of a directory as a MIME message. Usage: %prog [options] Unless the -o option is given, the email is sent by forwarding to your local
SMTP server, which then does the normal delivery process. Your local machine
must be running an SMTP server.
''')
parser.add_option('-d', '--directory',
type='string', action='store',
help='''Mail the contents of the specified directory,
otherwise use the current directory. Only the regular
files in the directory are sent, and we don't recurse to
subdirectories.''')
parser.add_option('-o', '--output',
type='string', action='store', metavar='FILE',
help='''Print the composed message to FILE instead of
sending the message to the SMTP server.''')
parser.add_option('-s', '--sender',
type='string', action='store', metavar='SENDER',
help='The value of the From: header (required)')
parser.add_option('-r', '--recipient',
type='string', action='append', metavar='RECIPIENT',
default=[], dest='recipients',
help='A To: header value (at least one required)')
opts, args = parser.parse_args()
if not opts.sender or not opts.recipients:
parser.print_help() # SMTP server 只处理地址有效的 sender 跟 recipients
sys.exit(1)
directory = opts.directory
if not directory:
directory = '.' # 之前的代码的功能是通过 OptionParser 没款完成对命令行参数的解析
# Create the enclosing (outer) message
outer = MIMEMultipart() # 构建一个带附件的 email 对象
outer['Subject'] = 'Contents of directory %s' % os.path.abspath(directory)
outer['To'] = COMMASPACE.join(opts.recipients)
outer['From'] = opts.sender
outer.preamble = 'You will not see this in a MIME-aware mail reader.\n' for filename in os.listdir(directory): # 按附件类型做相应的处理
path = os.path.join(directory, filename)
if not os.path.isfile(path):
continue
# Guess the content type based on the file's extension. Encoding
# will be ignored, although we should check for simple things like
# gzip'd or compressed files.
ctype, encoding = mimetypes.guess_type(path) # 附件类型的判断
if ctype is None or encoding is not None:
# No guess could be made, or the file is encoded (compressed), so
# use a generic bag-of-bits type.
ctype = 'application/octet-stream' # zip, pdf 等附件的类型
maintype, subtype = ctype.split('/', 1)
if maintype == 'text': # 处理的 文本text 类型的附件
fp = open(path)
# Note: we should handle calculating the charset
msg = MIMEText(fp.read(), _subtype=subtype)
fp.close()
elif maintype == 'image': # 处理的 图像image 类型的附件
fp = open(path, 'rb')
msg = MIMEImage(fp.read(), _subtype=subtype)
fp.close()
elif maintype == 'audio': # 处理的 音频audio 类型的附件
fp = open(path, 'rb')
msg = MIMEAudio(fp.read(), _subtype=subtype)
fp.close()
else:
fp = open(path, 'rb') # 处理的其他类型的附件:如 zip, pdf 等
msg = MIMEBase(maintype, subtype)
msg.set_payload(fp.read())
fp.close()
# Encode the payload using Base64
encoders.encode_base64(msg)
# Set the filename parameter
msg.add_header('Content-Disposition', 'attachment', filename=filename)
outer.attach(msg)
# Now send or store the message
composed = outer.as_string()
if opts.output: # 保存到文件 store
fp = open(opts.output, 'w')
fp.write(composed)
fp.close()
else:
s = smtplib.SMTP('localhost') # SMTP server 发送处理
s.sendmail(opts.sender, opts.recipients, composed)
s.quit() if __name__ == '__main__':
main() MIME 的解包 - Unpacking MIME 接收方对收到的 MIMEMultipart 的处理,
'''Unpack a MIME message into a directory of files.''' import os
import sys
import email
import errno
import mimetypes
from optparse import OptionParser
def main():
parser = OptionParser(usage='''\
Unpack a MIME message into a directory of files. Usage: %prog [options] msgfile
''')
parser.add_option('-d', '--directory',
type='string', action='store',
help='''Unpack the MIME message into the named
directory, which will be created if it doesn't already
exist.''')
opts, args = parser.parse_args()
if not opts.directory:
parser.print_help()
sys.exit(1) try:
msgfile = args[0]
except IndexError:
parser.print_help()
sys.exit(1) try:
os.mkdir(opts.directory)
except OSError as e:
# Ignore directory exists error
if e.errno != errno.EEXIST:
raise fp = open(msgfile)
msg = email.message_from_file(fp)
fp.close() counter = 1
for part in msg.walk():
# multipart/* are just containers
if part.get_content_maintype() == 'multipart':
continue
# Applications should really sanitize the given filename so that an
# email message can't be used to overwrite important files
filename = part.get_filename()
if not filename:
ext = mimetypes.guess_extension(part.get_content_type())
if not ext:
# Use a generic bag-of-bits extension
ext = '.bin'
filename = 'part-%03d%s' % (counter, ext)
counter += 1
fp = open(os.path.join(opts.directory, filename), 'wb')
fp.write(part.get_payload(decode=True))
fp.close() if __name__ == '__main__':
main() Reference,
https://docs.python.org/3/library/email.html
通过 python 处理 email - Email via Python的更多相关文章
- python auto send email
/*************************************************************************** * python auto send emai ...
- Python深入:Distutils发布Python模块--转载
https://blog.csdn.net/gqtcgq/article/details/49255995 Distutils可以用来在Python环境中构建和安装额外的模块.新的模块可以是纯Pyth ...
- Python 标准库一览(Python进阶学习)
转自:http://blog.csdn.net/jurbo/article/details/52334345 写这个的起因是,还是因为在做Python challenge的时候,有的时候想解决问题,连 ...
- python经典书记必读:Python编程快速上手 让繁琐工作自动化
所属网站分类: 资源下载 > python电子书 作者:熊猫烧香 链接:http://www.pythonheidong.com/blog/article/69/ 来源:python黑洞网,专注 ...
- python trojan development 1st —— use python to send mail and caputre the screen then combine them
import smtplib from email.mime.text import MIMEText msg_from='1@qq.com' #发送方邮箱 passwd='bd' #填入发送方邮箱的 ...
- Python学习【day02】- Python基础练习题
#!/usr/bin/env python # -*- coding:utf8 -*- # 执行Python 脚本的两种方式 # 答:①在windows的cmd窗口下 > D:/Python/p ...
- Python深入:Distutils发布Python模块
Distutils可以用来在Python环境中构建和安装额外的模块.新的模块可以是纯Python的,也可以是用C/C++写的扩展模块,或者可以是Python包,包中包含了由C和Python编写的模块. ...
- 【python之路1】python安装与环境变量配置
直接搜索 Python,进入官网,找到下载,根据个人电脑操作系统下载相应的软件.小编的是windows os .下载python-2.7.9.msi 安装包 双击安装程序,进入安装步骤.在安装过程中 ...
- 使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接
使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接: 使用requests获取html后,分析html中的标签发现所需要的链接在& ...
- 【Python网络编程】利用Python进行TCP、UDP套接字编程
之前实现了Java版本的TCP和UDP套接字编程的例子,于是决定结合Python的学习做一个Python版本的套接字编程实验. 流程如下: 1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...
随机推荐
- TensorFlow——tensorflow编程基础
0.tensorflow中的模型运行基础 tensorflow的运行机制属于定义和运行相分离,在操作层面可以抽象成两种:模型构建和模型运行. 在模型构建中的常见概念: 张量(tensor):数据,即某 ...
- 编写SQL查询范围分区类型,MAX分区范围
需求 对于分区表,对于范围分区类型来说,查询MAX分区及对应的分区范围. ==查询分区表对应的最大分区信息 ==排除了自扩展分区(如果是自扩展分区,但是最大的分区不是自扩展的并未排除在外) ==排除了 ...
- Java 数据结构快速入门
数据结构:栈 简介 栈(stack),又称堆栈,它是运算受限的线性表. 限制 栈(stack)的限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加.查找.删除等操作. 采用该结构的 ...
- vue的param和query两种传参方式及URL的显示
路由配置: // 首页 { path: '/home', name:'home', component:Home }, // 行情 { path: '/markets', name:'market', ...
- C语言编译成dll
首先c语言在开始要加上 #ifdef __cplusplus extern "C" { #endif …被导出的方法名称 #ifdef __cplusplus } #endif 不 ...
- CentOS 7.2 搭建Jenkins
1,准备阶段 jenkins下载 https://jenkins.io/download/ 这里我们选择稳定版本 (本文介绍的是通过tomcat来部署的,由于jenkins内部也集成了容器,也可直接通 ...
- Gitlab应用——开发人员fetch分支,合并到master主分支申请
创建开发仓库 打开git Bash,删除之前root管理创建的仓库目录 rm -rf admin-test 选择项目进行拷贝 克隆 # git -c http.sslVerify=false c ...
- 2.Java程序运行机制
1.编译型:compile,把所有东西翻译好,若有更新需要重新全部翻译.执行速度够快,对操作系统要求比较低.开发操作系统时用到编译型语言,例如c/c++...运行时需编译整个程序 2.解释性:运行一个 ...
- 技术交流群和CSDN免费下载服务
1.最近很多新读者的关注,如果还没认识我或不清楚本公号能为你带来什么,可点击阅读你.我 2.本篇文章只为告诉新读者与不知道这些福利的旧读者 本公号其中为你提供的两大价值之处: 一个好的学习环境:技术交 ...
- django cms 5月第一弹
官方文档: ##http://django-cms.readthedocs.io/en/latest/index.html #截图 #生存的项目结构