目录
1.Intro
眼看就到了12月中旬,除了帮朋友码竞赛题,前半个月可以说是划水摸鱼抓梦jio。
这段时间面试了几个人,赶脚什么人都敢往开发靠啊兄弟,
第一个是某传媒学校毕业的,自学了几年Java,然后干了几年的收银和消防救火员.... Pass
第二个都37了(大哥你确定要从基层做起???),学历牌子很硬,但工作后没有什么像样的项目成果 Pass
第三个前某科技公司的CTO...CTO......你干的好好的离什么职哦,来应聘研发总监,原来做电商的,后来搞大数据,写过人脸识别的算法,我多嘴的问了几句关于Map Reduce的具体实现,包括怎么用Yarn来调度资源,是否有用到Spark参与计算以及人脸识别框架和算法的技术细节等等,就是这种外行问题,人家说他负责搭建环境和整个项目的协同管理,一看公司名,再看他的专业(材料化学),哦,然后我就明白了。Pass
还有不少.....
2.Details
用smtplib和email库进行邮件发送,在之前写的爬虫模块里就有了,这里单独做一个具体的介绍。
如何开启邮箱的SMTP服务?
以QQ为例:
3.Theory
(1) smtplib
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,是在Internet传输email的事实标准,是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。说白了,就是email要在网上传输,需要遵循SMTP协议和规范,就和TCP/IP协议、HTTP协议一个道理。
Python的smtplib提供了一种很方便的途径发送电子邮件,对smtp协议进行了简单的封装。
创建 SMTP 对象:
import smtplib email = smtplib.SMTP(host, port, local_hostname) 参数说明: 1.host:可选。一般要指定。SMTP服务器主机,可以指定主机ip地址或域名,如 smtp.qq.com、smtp.163.com 等。 2.port:可选。host指定了就需要指定端口号,一般端口号为25,QQ邮箱的ssl端口为465。 3.local_hostname:可选。如果SMTP服务器设置在了本机上,就指定服务器地址为localhost。 Eg: smtp_server = 'smtp.qq.com' email = smtplib.SMTP_SSL(host=smtp_server, port=465)
登录SMTP服务器:
login_code = email.login(from_mail, mail_pass) 参数说明 1.from_mail:发送方的邮箱地址 2.mail_pass:SMTP服务授权码(在邮箱里开启SMTP服务时生成) 返回一个元组,包含登录状态码和登录结果。 Eg: login_code = email.login(from_mail, mail_pass) # 返回(235, 'Authentication successful')
发送邮件:
email.sendmail(from_mail, to_mail, msg) 1.from_mail:邮件发送者地址 2.to_mail:邮件接收者地址 3.msg:发送消息 Eg: email.sendmail(from_mail, to_mail, msg.as_string()) email.quit()
2.email
email软件包是用于管理电子邮件、处理邮件消息的库,包括MIME和其他一些基于RFC 2822的消息文档。
这里主要用到的是MIME扩展类型,即MIME消息格式,可支持非ASCII字符文本,非文本格式附件,由多部分组成的消息体和包含非ASCII字符的头信息。
(1)字符文本:邮件主体,即邮件主要内容。
(2)附件:本机文件,可以是二进制、图像、音频、视频等,不要超过邮件服务器声明的最大上传大小。
(3)消息体:有text/plain(纯文本)、text/html(超文本)、image/jpeg(jpg图片)、video/mp4(mp4视频)等多种独立类型,在邮件头部用“Content-Type”域作为标识,其中这些消息体可以分为多段,称作multipart,每个段包括段头段尾,它分为三种类型,分别是multipart/mixed(附件)、multipart/alternative(文本)、multipart/related(内嵌)。
(4)头信息:包括发件人、收件人、主题、日期、邮件内容类型等信息。
4.Environment
Environment:Windows All
Language:Python 2.7.14
IDE:Pycharm 2018
5.Source
import smtplib # SMTP库
from email.mime.text import MIMEText # 文本邮件对象
from email.mime.multipart import MIMEMultipart # 多个对象的组合,包括文本、附件等
from email.header import Header # 邮件名对象
from email import encoders # 编码器
from email.mime.base import MIMEBase # 附件构造对象
from email.utils import parseaddr, formataddr # 邮件规约与格式化
class Data_Sender(object):
def __init__(self):
print("[*] Initialize email send module..")
def format_address(self, address):
'''
格式化邮件地址
:param address: 邮件地址
:return: 格式化后的邮件地址
'''
print("[+] Formatting email address..")
name, addr = parseaddr(address)
print("[+] Format done.")
return formataddr((Header(name, 'utf-8').encode(), addr))
def send_mail(self, body, attachment):
'''
发送邮件
:param body: 邮件正文
:param attachment: 附件地址
:return: 发送成功返回True
'''
print("[+] Begin to send email...")
# 要发送的服务器
smtp_server = 'smtp.qq.com' # 可以选择别的服务器,如 smtp.163.com
# 要发送的邮箱用户名/密码
from_mail = '发送方的邮箱'
mail_pass = 'SMTP服务密码'
# 接收的邮箱
to_mail = '接收方的邮箱'
# 构造一个 MIMEMultipart 对象代表邮件本身
msg = MIMEMultipart()
# Header 对中文进行转码
msg['From'] = self.format_address('发件人地址标识 <%s>' % from_mail).encode()
msg['To'] = to_mail
msg['Subject'] = Header('邮件名', 'utf-8').encode()
# # plain 代表纯文本
msg.attach(MIMEText(body, 'plain', 'utf-8'))
# 二进制方式模式文件
if len(attachment) != 0:
for file_path in attachment:
with open(file_path, 'rb') as picture:
# MIMEBase 表示附件的名字
mime = MIMEBase(file_path[str(file_path).rfind('\\') + 1: -4], 'xls',
filename=file_path[str(file_path).rfind('\\') + 1:])
# filename 是显示附件名字
mime.add_header('Content-Disposition', 'attachment',
filename=file_path[str(file_path).rfind('\\') + 1:])
# 获取附件内容
mime.set_payload(picture.read())
encoders.encode_base64(mime)
# 作为附件添加到邮件
msg.attach(mime)
print("[+] Connecting SMTP server")
# 创建SMTP对象
email = smtplib.SMTP_SSL(smtp_server, 465)
print("[+] Connect successfully.")
print("[+] Licensing SMTP server")
# 登录SMTP服务器
login_code = email.login(from_mail, mail_pass)
if login_code[0] is 235:
print("[+] Successfully!")
else:
print("[-] Failed!")
return False
try:
# as_string()把 MIMEText 对象变成 str
print("[*] Sending email..")
# 发送邮件
email.sendmail(from_mail, to_mail, msg.as_string())
email.quit()
print("[+] Successfully!")
return True
except Exception as e:
print("[-] Failed!")
print("ERROR: " + str(e.message))
return False
6.Conclusion
不发GIS开发相关,天天不务正业说的就是本猿。