[Python] [邮件发送] 用Python的smtplib和email库进行邮件发送

目录

1.Intro

2.Details

3.Theory

4.Environment

5.Source

6.Conclusion


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开发相关,天天不务正业说的就是本猿。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dr_Asada

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值