通过 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.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接 ...
随机推荐
- Project Settings之Quality翻译
(版本是2018.4......翻译是自己的渣翻译水平) Unity allows you to set the level of graphical quality it attempts to r ...
- postman传递当前时间戳
有时我们在请求接口时,需要带上当前时间戳这种动态参数,那么postman能不能自动的填充上呢. 1请求动态参数(例如时间戳) 直接在参数值写 {{$timestamp}} 如下: 我们也可以使用pos ...
- 使用“1”个参数调用“DownloadString”时发生异常:“操作超时”
我今天在终端美化时间遇到一个问题是这样的 使用“1”个参数调用“DownloadString”时发生异常:“操作超时” 然后网我看了下,访问链接属于https的东西,根据直觉我觉得是这样的,是由于访问 ...
- Ndarry对象
创建一个 ndarray 只需调用 NumPy 的 array 函数即可: numpy.array(object, dtype = None, copy = True, order = None, s ...
- [apue] 一个查看当前终端标志位设置的小工具
话不多说,先看运行效果: >./term input flag 0x00000500 BRKINT not in ICRNL IGNBRK not in IGNCR not in IGNPAR ...
- request session
例子 url = 'http://beanhome.com/user/login' header = { "Content-Type": 'application/json', & ...
- numpy初识 old
一.创建ndarrary 1.使用np.arrary()创建 1).一维数组 import numpy as np np.array([1, 2, 3, 4]) 2).二维数组 np.array([[ ...
- Java入门 - 语言基础 - 02.开发环境配置
原文地址:http://www.work100.net/training/java-environment-setup.html 更多教程:光束云 - 免费课程 开发环境配置 序号 文内章节 视频 1 ...
- php变量中两种特殊类型
第一种----资源 资源(resource):资源是由专门的函数来建立和使用的,例如打开文件.数据连接.图形画布.我们可以对资源进行操作(创建.使用和释放).任何资源,在不需要的时候应该被及时释放.如 ...
- java面试| 精选基础题(3)
每天进步一点点,距离大腿又近一步! 阅读本文大概需要6分钟 系列文章 java面试| 精选基础题(1) java面试|精选基础题(2) 1.float f=3.4;是否正确? 答:不正确,编译无法通过 ...