欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python发送简单SMTP邮件

程序员文章站 2022-07-08 11:10:37
...

一篇电子邮件基本上包含以下几个部分:
(1) 源邮件地址/目的邮件地址,就是你自己的邮箱账号和对方的邮箱账号。
(2) 发件人/收件人,这个类似于下面这种图:
Python发送简单SMTP邮件

好像在QQ邮箱或163邮箱内可以自己设置名称。
(3) 主题,这个不用说了,可以为空。
(4) 正文。
(5) 附件
以下我们根据以上部分,使用python的smtplib和email模块模拟一封验证码邮件的发送。

一、介绍

1、smtplib模块

这个模块是Python自带模块,可直接导入。该模块使用了邮件中的SMTP协议,并进行了简单封装,常用以下函数:
(1) SMTP()函数,创建smtp对象
(2) login()函数,登录邮箱
(3) sendmail()函数,发送邮件
(4) quit()函数,结束当前会话

2、email模块

也是Python的自带模块。本篇中,我们主要使用mime(Multipurpose Internet Mail Extensions)模块,称为多用途互联网邮件扩展类型,用于建立邮件体对象(主题、正文、附件等)。
(1) MIMEMultipart(),建立一个邮件体对象,为总体,其他小的部分(图片、文字、文件等都要往里面添加)。
(2) MIMEText(),建立文本对象。
(3) MIMEImage,建立图片对象。
(4) MIMEApplication,建立文件附件封装对象。

3、具体需要导入的模块
import random
import smtplib
from email.utils import formataddr
from email.header import Header
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication

二、总体框架

发送一篇邮件的总体框架分为以下几个步骤:
(1) 创建smtp对象
(2) 登录自己的邮箱
(3) 建立邮件主体对象。
(4) 发送邮件

try:
    smtp_obj = smtplib.SMTP(mailserver, port)  # 创建smtp操作对象
    smtp_obj.login(sender_mail, sender_code)  # 登录邮箱
    smtp_obj.sendmail(sender_mail, receive_mail, main_part.as_string())  # 发送
    smtp_obj.quit()  # 结束对话
 
except Exception as ex:
    print(ex)

其中,mailserver为你所使用的SMTP服务器地址,如QQ邮箱的为smtp.qq.com,其他的可以自己百度搜索;port为端口号,一般用25;sender_mail为发件人的邮箱地址,receive_mail为收件人的邮箱地址;
main_part为MIMEMultipart邮件主体对象,可以搭载附件。例如:

sender_mail = "aaa@qq.com"  # 发送方邮箱
receive_mail = "aaa@qq.com"  # 接收方邮箱(例子)
sender_code = "abcdefg"  # 发送方邮箱授权码(例子)
mailserver = "smtp.qq.com"  # 使用QQ的smtp服务器地址
port = 25  # 端口号
main_part = MIMEMultipart("mixed")  # MIMEMultipart实例

三、细节部分

1、收件人/发件人

你可以自己定义,也可以空着,即邮件中不显示这一部分。

main_part['From'] = formataddr(("收件人名", sender_mail), "utf-8")
main_part['To'] = formataddr(("发件人名", receive_mail), "utf-8")

2、主题

自己定义,同样可以空着。

subject = "测试邮件"
main_part["Subject"] = Header(subject, 'utf-8')

3、正文
verify_code = str(random.randrange(0, 10)) + \
              str(random.randrange(0, 10)) + str(random.randrange(0, 10)) \
              + str(random.randrange(0, 10))  # 模拟验证码
mytext = "你的验证码为" + verify_code  # 编写你的正文
text_attach = MIMEText(mytext, "plain", "utf-8")  # 建立MIME对象
main_part.attach(text_attach)  # 添加到主体对象

4、在正文中添加HTML文本和链接
myhtml = """
<p><a href="http:www.apple.com/cn/">请进入苹果中国官网</a></p>
"""  # 你要显示的HTML内容
html_attach = MIMEText(myhtml, "html", "utf-8")  # 建立MIMe对象
main_part.attach(html_attach)  # 加入链接

5、添加附件

(1) 图片

myimage = open("临时/test.png", "rb")  # 你的图片文件路径
image_attach = MIMEImage(myimage.read())  # 建立MIME对象
myimage.close()  # 关闭刚刚打开的文件
image_attach.add_header("Content-ID", "<图片2>")
image_attach.add_header("Content-Disposition", "attachment", filename = "test.png")
main_part.attach(image_attach)  # 添加到主体对象

(2) 文档

mytxt = open("临时/myfile.txt", "r")  # 你的文档路径
txt_attach = MIMEText(mytxt.read(), "base64", "utf-8")  # 编码格式
mytxt.close()
txt_attach["Content-Type"] = "application/octet-stream"
txt_attach.add_header("Content-Disposition", "attachment", filename = "myfile.txt")  # 以附件形式,附件名称可自己定义
main_part.attach(txt_attach)  # 添加到主体对象

(3) 压缩文件

myzip = open("临时/测试.zip", "rb")  # 压缩文件路径
zip_attach = MIMEApplication(myzip.read(), "base64")
myzip.close()
zip_attach.add_header("Content-Disposition", "attachment", filename = "测试.zip")  # 以附件形式,附件名称可自己定义
main_part.attach(zip_attach)  # 添加到主体对象

四、测试

全部代码

import random
import smtplib
from email.utils import formataddr
from email.header import Header
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication


sender_mail = "aaa@qq.com"  # 发送方邮箱
receive_mail = "aaa@qq.com"  # 接收方邮箱
sender_code = "abcdefg"  # 发送方邮箱授权码
mailserver = "smtp.qq.com"  # 使用QQ的smtp服务器地址
port = 25  # 端口号

# MIMEMultipart实例
main_part = MIMEMultipart("mixed")
#msg_alternative = MIMEMultipart("alternative")
#main_part.attach(msg_alternative)
main_part['From'] = formataddr(("收件人名", sender_mail), "utf-8")
main_part['To'] = formataddr(("发件人名", receive_mail), "utf-8")

# 一、主题
subject = "测试邮件"
main_part["Subject"] = Header(subject, 'utf-8')


# 二、正文
# 1、文本
verify_code = str(random.randrange(0, 10)) + \
              str(random.randrange(0, 10)) + str(random.randrange(0, 10)) \
              + str(random.randrange(0, 10))  # 模拟验证码
mytext = "你的验证码为" + verify_code
text_attach = MIMEText(mytext, "plain", "utf-8")
main_part.attach(text_attach)


# 2、HTML链接和图片(正文中添加图片只能通过HTML方式)
myhtml = """
<p><a href="http:www.apple.com/cn/">请进入苹果中国官网</a></p>
"""
html_attach = MIMEText(myhtml, "html", "utf-8")
main_part.attach(html_attach)  # 加入链接


# 三、附件
# 1、图片
myimage = open("临时/test.png", "rb")
image_attach = MIMEImage(myimage.read())
myimage.close()
image_attach.add_header("Content-ID", "<图片2>")
image_attach.add_header("Content-Disposition", "attachment", filename = "test.png")
main_part.attach(image_attach)

# 2、文本文件
mytxt = open("临时/myfile.txt", "r")
txt_attach = MIMEText(mytxt.read(), "base64", "utf-8")
mytxt.close()
txt_attach["Content-Type"] = "application/octet-stream"
txt_attach.add_header("Content-Disposition", "attachment", filename = "myfile.txt")
main_part.attach(txt_attach)

# 3、压缩文件
myzip = open("临时/测试.zip", "rb")
zip_attach = MIMEApplication(myzip.read(), "base64")
myzip.close()
zip_attach.add_header("Content-Disposition", "attachment", filename = "测试.zip")
main_part.attach(zip_attach)

# 四、发送邮件
try:
    smtp_obj = smtplib.SMTP(mailserver, port)  # 创建smtp操作对象
    smtp_obj.login(sender_mail, sender_code)  # 登录邮箱
    smtp_obj.sendmail(sender_mail, receive_mail, main_part.as_string())
    smtp_obj.quit()
    print("邮件已发送。")
    print("请核对验证码:", verify_code)

except Exception as ex:
    print("发送失败。原因:")
    print(ex)

邮件部分
Python发送简单SMTP邮件

附件部分
Python发送简单SMTP邮件