Python办公自动化

第一章: 搞定Excel自动化

第二章: 搞定Word自动化

第三章: 搞定Email自动化

首页 > Python办公自动化 > 第三章: 搞定Email自动化 > 3.2节: 使用smtplib模块发送邮件

3.2节: 使用smtplib模块发送邮件

薯条老师 2022-09-20 14:49:31 55828 0

编辑 收藏

广州番禺Python, Java小班周末班培训

薯条老师的线下Python小班办得很好,学员的平均就业薪资有11K。线下小班培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6

3.2.1 smtplib模块简介

在Python中,使用smtplib模块来发送邮件。smtplib模块是Python的内置模块,直接通过import来导入。

import smtplib

3.2.2 构造smtp对象

使用smtplib模块来发送邮件,需要先构造smtp对象:

 smplib.SMTP(host='',port=0)

 构造一个已连接的SMTP对象,host表示服务器的主机名,port表示端口号

 smplib.SMTP_SSL(host='',port=0)

 构造一个已连接的SMTP_SSL对象,host表示服务器的主机名,port表示端口号。SMTP_SSL是SMTP的子类,用来建立一个基于SSL的连接。

代码实例:

import smtplib
# 连接腾讯企业邮箱
smtp_server = smtplib.SMTP_SSL("smtp.exmail.qq.com", 465)

3.2.3 登录邮件服务器

获得已连接的smtp对象以后,通过以下方法登录邮件服务器:

smtp.login(user, password)


user表示邮箱的登录账号,password表示邮箱的登录密码。

代码实例:

import smtplib
# 连接腾讯企业邮箱
smtp_server = smtplib.SMTP_SSL("smtp.exmail.qq.com", 465)
smtp_server.login( 'haokaixin@chipscoco.com', '123456')

3.2.4 发送邮件

服务器登录成功以后,再通过sendmail方法发送邮件:

smtp.sendmail(from_addr, to_addrs, msg)

 from_addr为发件人的地址,to_addrs是一个列表,列表中的每一项为收件人的地址。msg表示发送的内容。

代码实例:

import smtplib
# 连接腾讯企业邮箱
smtp_server = smtplib.SMTP_SSL("smtp.exmail.qq.com", 465)
smtp_server.login( 'haokaixin@chipscoco.com', '123456')
smtp_server.sendmail('haokaixin@chipscoco.com', ['123456@qq.com','happy@163.com'], "hello world")

3.2.5 发送html格式邮件

通过email.mime.text 中的MIMEText来发送HTML格式的邮件:

MiMEText(_text, _subtype='plain', _charset=None)


_text表示发送的文本,_subtype用来指定MIME类型,默认为plain,表示普通文本格式,如需发送html,需指定为html。_charset用来指定字符编码。

代码实例:

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

# 设置邮件服务器的登录账号
LOGIN_USERNAME = 'xxx'
# 设置邮件服务器的登录密码
LOGIN_PASSWORD = 'xxxx'

def send_email(nickname, sender, to_addrs, message, subject, mime_type="plain"):
    """
    :param nickname: 发件人的昵称
    :param sender: 发件人的邮箱地址
    :param to_addrs: 列表类型,列表中的每一项为收件人的地址
    :param message: 邮件消息
    :param subject: 邮件主题
    :param mime_type: mime类型,默认为plain,表示普通文本格式的邮件
    :return:
    """
    msg = MIMEText(message, mime_type, 'utf-8')
    # From用来指定发件人的昵称等信息,可通过formataddr来对发件人信息进行格式化
    msg['From'] = formataddr((nickname, LOGIN_USERNAME))
    # Sumject用来指定邮件的主题
    msg['Subject'] = subject
    # SMTP服务器,腾讯企业邮箱端口是465,腾讯邮箱支持SSL(不强制), 不支持TLS
    # qq邮箱smtp服务器地址:smtp.qq.com, 端口号:456
    # 163邮箱smtp服务器地址:smtp.163.com,端口号:25
    smtp_server = smtplib.SMTP_SSL("smtp.exmail.qq.com", 465)
    # 登录服务器,括号中对应的是发件人邮箱账号、邮箱密码
    smtp_server.login(LOGIN_USERNAME, LOGIN_PASSWORD)
    # 发送邮件,括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
    smtp_server.sendmail(sender, to_addrs, msg.as_string())
    # 关闭连接
    smtp_server.quit()
if __name__ == "__main__":
    html_message="<html><body><h1>你中了刘同学的一个爱的抱抱</h1></body></html>"
    sender = "chenzhengqiang@chipscoco.com"
    to_addrs = ["haokaixin@chipscoco.com",]
    send_email(nickname="薯条老师", sender=sender, to_addrs=to_addrs,
              message=html_message, subject="中奖了-爱的抱抱!!", mime_type="html")

3.2.6 添加图片和附件

通过email.mime.multipart模块的MIMEMultipart在邮件中添加图片和附件:

MIMEMultipart(_subtype='mixed')


_subtype表示multipart content type的子类型,默认为mixed,表示混合模式。如需使用内嵌资源的形式,需指定为related。

MIMEMultipart.attach(payoad)

 payload表示待添加的附件内容

代码实例:

import smtplib
# 支持发送图片类型的邮件
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.utils import formataddr

# 设置邮件服务器的登录账号
LOGIN_USERNAME = 'xxx'
# 设置邮件服务器的登录密码
LOGIN_PASSWORD = 'xxx'

def send_email_with_attachment(sender, to_addrs, message, subject, **kwargs):
    """
    :param nickname: 发件人的昵称
    :param sender: 发件人的邮箱地址
    :param to_addrs: 列表类型,列表中的每一项为收件人的地址
    :param message: 邮件消息
    :param subject: 邮件主题
    :param mime_type: mime类型,默认为plain,表示普通文本格式的邮件
    :return:
    """
    # related表示使用内嵌资源的形式
    multipart = MIMEMultipart('related')
    # From用来指定发件人的昵称等信息,可通过formataddr来对发件人信息进行格式化
    nickname=kwargs["nickname"] if "nickname" in kwargs else ""
    multipart['From'] = formataddr((nickname, sender))
    # Subject用来指定邮件的主题
    multipart['Subject'] = subject
    mime_type = "html" if "mime_type" in kwargs else kwargs["mime_type"]
    message = MIMEText(message, mime_type, 'utf-8')
    multipart.attach(message)
    mime_images = kwargs["mime_images"] if "mime_images" in kwargs else {}
    for image_path, cid in mime_images.items():
        # 图片等附件必须以二进制模式打开
        mime_image = MIMEImage(open(image_path, 'rb').read())
        # 添加的Content-ID必须与html消息中的cid一致
        mime_image.add_header('Content-ID', cid)
        multipart.attach(mime_image)  # 添加图片文件到邮件信息中去
    attachments = kwargs["attachments"] if "attachments" in kwargs else []
    for attachment in attachments:
        mime_application = MIMEApplication(open(attachment, 'rb').read())
        # filename表示邮件中显示的附件名
        mime_application.add_header('Content-Disposition', 'attachment', filename='{}'.format(attachment))
        multipart.attach(mime_application)
    # SMTP服务器,腾讯企业邮箱端口是465,腾讯邮箱支持SSL(不强制), 不支持TLS
    # qq邮箱smtp服务器地址:smtp.qq.com, 端口号:456
    # 163邮箱smtp服务器地址:smtp.163.com,端口号:25
    smtp_server = smtplib.SMTP_SSL("smtp.exmail.qq.com", 465)
    # 登录服务器,括号中对应的是发件人邮箱账号、邮箱密码
    smtp_server.login(LOGIN_USERNAME, LOGIN_PASSWORD)
    # 发送邮件,括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
    smtp_server.sendmail(sender, to_addrs, multipart.as_string())
    # 关闭连接
    smtp_server.quit()
if __name__ == "__main__":
    sender = "chenzhengqiang@chipscoco.com"
    to_addrs = ["haokaixin@chipscoco.com",]
    message = '<html><body><h1>你中了刘同学的一个爱的抱抱</h1><img src="cid:hug_of_love"></body></html>'
    send_email_with_attachment(sender=sender, to_addrs=to_addrs, message=message, subject="中奖了-爱的抱抱!!",
                               nickname="薯条老师", mime_type="html",mime_images={"hug_of_love.jpg": "hug_of_love"},
                               attachments=["hug_of_love.jpg", "girl.jpeg", "demo.txt", "福报程序员.xls"])

3.2.7 最具实力的小班培训

来这里参加Python和Java小班培训的学员大部分都找到了很好的工作,平均月薪有11K,学得好的同学,拿到的会更高。由于是小班教学,所以薯条老师有精力把每位学员都教好。打算参加线下小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,免费领取课程大纲
(3) Java后端开发工程师高薪就业班,月薪11K-20K, 免费领取课程大纲
(4) Python大数据分析,量化投资就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取Python学习资料:

扫码领学习资料.jpg



欢迎 发表评论: