搭建邮件日报实战
1、我们需要一个开源的Linux系统
然后通过shell脚本,自动生成要发送的内容
2、我们通过python 编写邮件发送程序
发送邮件的协议是SMTP,首先我们先到邮箱的设置页面开启我们的服务
发送邮箱
# -*- coding: utf-8 -*-
from email.mime.text import MIMEText
from email.header import Header
from smtplib import SMTP_SSL
import xlrd
import sys
def send_mail(receiver):
host_server = 'smtp.qq.com' # QQ邮箱的SMTP服务器
sender_qq = '960751327' # 发件人的QQ号码
pwd = '*******' # QQ邮箱的授权码
sender_qq_mail = '960751327@qq.com' # 发件人邮箱地址
data = xlrd.open_workbook('filename.xlsx') # 打开文件
table = data.sheets()[0]
content = []
content = table.row_values(0)
mail_content = str(content[0]) + ' ' + str(content[1]) + ' ' + str(content[2]) + ' ' + str(content[3]) # 邮件正文内容
mail_title = '测试文件' # 设置邮件标题
smtp = SMTP_SSL(host_server) # SSL 登录
smtp.set_debuglevel(0) # set_debuglevel()是用来调试的。参数值为1表示开启调试模式,参数值为0关闭调试模式
smtp.ehlo(host_server) # 连接服务器
smtp.login(sender_qq, pwd) # 邮箱登录
msg = MIMEText(mail_content, "plain", 'utf-8') # 填写正文内容
msg["Subject"] = Header(mail_title, 'utf-8') # 填写邮件标题
msg["From"] = sender_qq_mail # 发送者邮箱地址
msg["To"] = receiver # 接收者邮件地址
try:
smtp.sendmail(sender_qq_mail, receiver, msg.as_string()) # 发送邮件函数
smtp.quit() # 发送邮件结束
print("Successfully Send!") # 输出成功标志
except:
print("The sever is busy,please continue later.")
if __name__ == "__main__":
try:
receiver = sys.argv[1]
except:
receiver = '313281592@qq.com' # 收件人邮箱地址
send_mail(receiver) # 调用函数,发送邮件
接收邮箱
import poplib
# 解析邮件
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
# 解析消息头中的字符串
# 没有这个函数,print出来的会使乱码的头部信息。如'=?gb18030?B?yrXWpL3hufsueGxz?='这种
# 通过decode,将其变为中文
def decode_str(s):
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
# 解码邮件信息分为两个步骤,第一个是取出头部信息
# 首先取头部信息
# 主要取出['From','To','Subject']
'''
From: "=?gb18030?B?anVzdHpjYw==?=" <justonezcc@sina.com>
To: "=?gb18030?B?ztLX1Ly6tcTTys/k?=" <392361639@qq.com>
Subject: =?gb18030?B?dGV4dMTjusM=?=
'''
# 如上述样式,均需要解码
def get_header(msg):
for header in ['From', 'To', 'Subject']:
value = msg.get(header, '')
if value:
# 文章的标题有专门的处理方法
if header == 'Subject':
value = decode_str(value)
elif header in ['From', 'To']:
# 地址也有专门的处理方法
hdr, addr = parseaddr(value)
name = decode_str(addr)
# value = name + ' < ' + addr + ' > '
value = name
print(header + ':' + value)
# 头部信息已取出
# 获取邮件的字符编码,首先在message中寻找编码,如果没有,就在header的Content-Type中寻找
def guess_charset(msg):
charset = msg.get_charset()
if charset is None:
content_type = msg.get('Content-Type', '').lower()
pos = content_type.find('charset=')
if pos >= 0:
charset = content_type[pos + 8:].strip()
return charset
# 邮件正文部分
# 取附件
# 邮件的正文部分在生成器中,msg.walk()
# 如果存在附件,则可以通过.get_filename()的方式获取文件名称
def get_file(msg):
for part in msg.walk():
filename = part.get_filename()
if filename != None: # 如果存在附件
filename = decode_str(filename) # 获取的文件是乱码名称,通过一开始定义的函数解码
data = part.get_payload(decode=True) # 取出文件正文内容
# 此处可以自己定义文件保存位置
path = filename
f = open(path, 'wb')
f.write(data)
f.close()
print(filename, 'download')
def get_content(msg):
for part in msg.walk():
content_type = part.get_content_type()
charset = guess_charset(part)
# 如果有附件,则直接跳过
if part.get_filename() != None:
continue
email_content_type = ''
content = ''
if content_type == 'text/plain':
email_content_type = 'text'
elif content_type == 'text/html':
print('html 格式 跳过')
continue # 不要html格式的邮件
email_content_type = 'html'
if charset:
try:
content = part.get_payload(decode=True).decode(charset)
except AttributeError:
print('type error')
except LookupError:
print("unknown encoding: utf-8")
if email_content_type == '':
continue
# 如果内容为空,也跳过
print(email_content_type + ' ----- ' + content)
# get_file(msg)
if __name__ == '__main__':
email = '960751327@qq.com'
password = '********'
server = poplib.POP3_SSL('pop.qq.com')
server.user(email)
server.pass_(password)
# 登录的过程
resp, mails, octets = server.list()
index = len(mails) # 邮件的总数
# 此处的循环是取最近的几封邮件
for i in range(index - 2, index + 1):
resp, lines, octets = server.retr(i) # 取邮件
msg_content = b'\r\n'.join(lines).decode('utf-8', 'ignore')
msg = Parser().parsestr(msg_content)
# http-server.dele(index) 删除邮件
get_header(msg)
get_file(msg)
get_content(msg)
server.quit()