本文以第三方QQ邮箱服务器演示如何使用python的smtplib+email完成邮箱发送功能

一、设置开启SMTP服务并获取授权码

开启QQ邮箱SMTP服务

开启的最后一步是发送短信验证,获取 authorization。 QQ官方获取授权码的帮助文档

使用SMTP服务有POP和IMAP(Internet Message Access Protocol)两种协议,我们选择使用IMAP,具体差异查看QQ邮箱帮助文档

使用IMAP服务的SSL加密方式的通用配置如下:
接收邮件服务器:imap.qq.com,使用SSL,端口号993
发送邮件服务器:smtp.qq.com,使用SSL,端口号465或587
账户名:您的QQ邮箱账户名(如果您是VIP帐号或Foxmail帐号,账户名需要填写完整的邮件地址)
密码:您的QQ邮箱authorization
电子邮件地址:您的QQ邮箱的完整邮件地址

二、发送文本类型的邮箱

import smtplib
from email.mime.text import MIMEText # 1.连接邮件服务器
smtpHost = "smtp.qq.com" # 邮件服务器地址
port = 465 # 邮件服务器端口
server = smtplib.SMTP_SSL(smtpHost, port) # 2.登录服务
sender = '418***167@qq.com' # 发件人邮箱账号
authorization = 'spi********idj' # QQ邮箱授权码
server.login(sender, authorization) # 括号中对应的是发件人邮箱账号、邮箱密码 # 3.构造邮件内容
# 3.1 创建邮箱容器
mailboxContainer = MIMEText('Hello Python!', "plain", "utf-8") # 创建文本类型容器 # 3.2 定义容器内容
mailboxContainer['Subject'] = "python发送的邮件" # 邮箱主题
mailboxContainer['From'] = sender # 邮箱发送人
receiver_to = ['y****@****.com']
mailboxContainer["To"] = ",".join(receiver_to) # 邮箱接收人
receiver_cc = []
mailboxContainer['Cc'] = ",".join(receiver_cc) # 邮箱抄送人 # 4.发送邮件
receiver = receiver_to + receiver_cc # 接收邮箱的人(包含接收和抄送)
server.sendmail(sender, receiver, mailboxContainer.as_string()) # 5.关闭连接
server.quit()

收件结果如下:

三、发送HTML类型的邮件

import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText # 1.连接邮件服务器
smtpHost = "smtp.qq.com" # 邮件服务器地址
port = 465 # 邮件服务器端口
server = smtplib.SMTP_SSL(smtpHost, port) # 2.登录服务
sender = '418XXXX167@qq.com' # 发件人邮箱账号
authorization = 'spiXXXXXXXidj' # QQ邮箱授权码
server.login(sender, authorization) # 括号中对应的是发件人邮箱账号、邮箱密码 # 3.构造邮件内容
# 3.1 创建邮箱容器
# mailboxContainer = MIMEText('邮件正文内容', "plain", "utf-8") # 创建文本类型容器
mailboxContainer = MIMEMultipart() # 创建混合类型容器 # 3.2 定义容器内容
mailboxContainer['Subject'] = "测试python发送邮件" # 邮箱主题
mailboxContainer['From'] = sender # 邮箱发送人
receiver_to = ['yXXo@XXXXX.com']
mailboxContainer["To"] = ",".join(receiver_to) # 邮箱接收人
receiver_cc = []
mailboxContainer['Cc'] = ",".join(receiver_cc) # 邮箱抄送人
# 混合类型,添加html内容
mail_msg = """
<p>Python 邮件发送测试...</p>
<p>图片演示:</p>
<p><img src="cid:image1"></p>
"""
mailboxContainer.attach(MIMEText(mail_msg, 'html', 'utf-8')) # 读取图片信息
with open(r".\h5_img.jpg", "rb") as f:
msg = f.read()
msgImage = MIMEImage(msg) # 定义图片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', '<image1>')
mailboxContainer.attach(msgImage) # 4.发送邮件
receiver = receiver_to + receiver_cc # 接收邮箱的人(包含接收和抄送)
server.sendmail(sender, receiver, mailboxContainer.as_string()) # 5.关闭连接
server.quit()

接收结果如下:

四、发送带附件的邮件

import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText # 1.连接邮件服务器
smtpHost = "smtp.qq.com" # 邮件服务器地址
port = 465 # 邮件服务器端口
server = smtplib.SMTP_SSL(smtpHost, port) # 2.登录服务
sender = '41XXXX7@qq.com' # 发件人邮箱账号
authorization = 'spXXXXXXdj' # QQ邮箱授权码
server.login(sender, authorization) # 括号中对应的是发件人邮箱账号、邮箱密码 # 3.构造邮件内容
# 3.1 创建邮箱容器
# mailboxContainer = MIMEText('邮件正文内容', "plain", "utf-8") # 创建文本类型容器
mailboxContainer = MIMEMultipart() # 创建混合类型容器 # 3.2 定义容器内容
mailboxContainer['Subject'] = "带附件的邮箱" # 邮箱主题
mailboxContainer['From'] = sender # 邮箱发送人
receiver_to = ['yXXX@XXXXX.com']
mailboxContainer["To"] = ",".join(receiver_to) # 邮箱接收人
receiver_cc = []
mailboxContainer['Cc'] = ",".join(receiver_cc) # 邮箱抄送人
# # 混合类型,添加文本内容
mailboxContainer.attach(MIMEText('测试带附件的邮箱', "plain", "utf-8")) # 构造文本附件
with open(r".\text.txt", "rb") as f:
msg = f.read()
att1 = MIMEText(msg, 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="text.txt"' # 这里的filename可以任意写,写什么名字,邮件附件中显示什么名字
mailboxContainer.attach(att1) # 构造图片附件
with open(r".\h5_img.jpg", "rb") as f:
msg = f.read()
att2 = MIMEText(msg, 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
# att2["Content-Disposition"] = 'attachment; filename="h5_img"' # 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att2.add_header('content-disposition', 'attachment', filename='h5.jpg') # 与上面注释代码功能一样
mailboxContainer.attach(att2) # 4.发送邮件
receiver = receiver_to + receiver_cc # 接收邮箱的人(包含接收和抄送)
server.sendmail(sender, receiver, mailboxContainer.as_string()) # 5.关闭连接
server.quit()

接收结果如下:

五、初步封装

import os
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from utils.file import file class SMTP:
def __init__(self, smtp_host="smtp.qq.com", port=465):
# 连接邮件服务器
self.__server = smtplib.SMTP_SSL(smtp_host, port)
self.__sender = None # 发件人邮箱账号
self.__mailboxContainer = MIMEMultipart() # 创建邮箱容器
self.__receiver = [] def quit(self):
self.__server.quit() def login(self, account, authorization):
"""登录邮箱服务器"""
self.__sender = account
self.__server.login(account, authorization) # 括号中对应的是发件人邮箱账号、邮箱密码 def add_subject(self, subject):
"""添加邮件主题"""
self.__mailboxContainer['Subject'] = subject # 邮箱主题 def add_receiver(self, receiver_to: list, receiver_cc: list = None):
"""
添加邮件接收人
receiver_to:收件人
receiver_cc:抄送人
"""
self.__mailboxContainer["From"] = self.__sender
self.__mailboxContainer["To"] = ",".join(receiver_to) # 邮箱接收人
self.__mailboxContainer['Cc'] = ",".join(receiver_cc) # 邮箱抄送人
self.__receiver = receiver_to + receiver_cc def add_content(self, content, mail_type="plain", append_imgs: list = None):
"""
添加邮箱内容
content:邮箱内容
mail_type:内容的类型
append_imgs:当为html类型时追加图片内容
"""
if mail_type != "html" and append_imgs is not None:
raise ValueError(f"main_type的值不为html,但append_img不是空") if mail_type == "html" and append_imgs is not None:
for append_img in append_imgs:
img_tag = f"<p><img src='cid:image{append_imgs.index(append_img)}'></p>"
content += img_tag
# 读取图片信息
with open(append_img, "rb") as f:
msg = f.read()
msgImage = MIMEImage(msg) # 定义图片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', f'<image{append_imgs.index(append_img)}>')
self.__mailboxContainer.attach(msgImage)
self.__mailboxContainer.attach(MIMEText(content, mail_type, "utf-8")) def add_attach(self, file_path):
"""添加单个附件"""
if not os.path.exists(file_path):
raise ValueError(f"文件【{file_path}】不存在") if not os.path.isfile(file_path):
raise ValueError(f"【{file_path}】不是文件") # 构造文本附件
with open(file_path, "rb") as f:
msg = f.read()
att = MIMEText(msg, 'base64', 'utf-8')
att["Content-Type"] = 'application/octet-stream'
filename = file.get_path_last_name(file_path)
att["Content-Disposition"] = f'attachment; filename="{filename}"' # 这里的filename可以任意写,写什么名字,邮件附件中显示什么名字
self.__mailboxContainer.attach(att) def add_attachs(self, file_paths: list):
"""添加多个附件"""
for file_path in file_paths:
self.add_attach(file_path) def send(self):
"""发送邮件"""
self.__server.sendmail(self.__sender, self.__receiver, self.__mailboxContainer.as_string()) if __name__ == '__main__': mailbox = SMTP() # 登录邮箱服务器
account = '418XXXX167@qq.com'
authorization = 'spiXXXXXidj' # QQ邮箱授权码
mailbox.login(account, authorization) # 添加邮箱主题
mailbox.add_subject("使用SMTP封装类发送的邮件") # 添加邮箱接收人
receiver_to = ['yXXXo@XXX.com'] # 收件人
receiver_cc = ['41XXX7@qq.com'] # 抄送人
mailbox.add_receiver(receiver_to, receiver_cc) # 添加邮箱内容
mail_content = """
<p>Python 邮件发送测试...</p>
<p>追加图片如下</p>
"""
append_imgs = [r".\h5_img.jpg", r".\doudou.png"]
mailbox.add_content(mail_content, mail_type="html", append_imgs=append_imgs) # 添加附件
mailbox.add_attach("text.txt")
mailbox.add_attachs([r".\h5_img.jpg", r".\doudou.png"]) # 发送邮箱
mailbox.send()

发送结果如下

Python_使用smtplib+email完成邮件发送的更多相关文章

  1. 使用Springboot Email实现邮件发送

    在springboot配置文件增加emai配置(此种方式不支持QQ邮箱): spring.datasource.type=com.alibaba.druid.pool.DruidDataSource ...

  2. python实现邮件发送完整代码(带附件发送方式)

    实例一:利用SMTP与EMAIL实现邮件发送,带附件(完整代码) __author__ = 'Administrator'#coding=gb2312 from email.Header import ...

  3. C#实现邮件发送功能

    发送邮件所用的核心知识点 微软封装好的MailMessage类:主要处理发送邮件的内容(如:收发人地址.标题.主体.图片等等) 微软封装好的SmtpClient类:主要处理用smtp方式发送此邮件的配 ...

  4. Python_使用smtplib和email模块发送邮件

    [http://blog.csdn.net/menglei8625/article/details/7721746] SMTP (Simple Mail Transfer Protocol) 邮件传送 ...

  5. 【Python】 发邮件用 smtplib & email

    smtplib & email ■ 概述 发邮件主要用到smtplib以及email模块.stmplib用于邮箱和服务器间的连接,发送的步骤.email模块主要用于处理编码,邮件内容等等.主要 ...

  6. Python3+smtplib+poplib+imaplib实现发送和收取邮件(以qq邮箱为例)

    一.说明 1.1 程序说明 (1)smtp是邮件发送协议:pop和imap都是邮件接收协议,两者的区别通常的说法是imap的操作会同步到邮箱服务器而pop不会,表现上我也不是很清楚 (2)本程序实现使 ...

  7. Python+request+ smtplib 测试结果html报告邮件发送(下)《六》

    目录结构如下: 1.cfg.ini的配置信息写法如下: [email] ;--------------------------使用腾讯企业邮箱作为发件人的操作如下------------------- ...

  8. Python+request+ smtplib 测试结果html报告邮件发送(上)《五》

    此方法通用适合所有邮箱的使用,只需注意几个点,如下: QQ邮箱.其他非QQ邮箱的写法,区别点如下: #--------------------------使用腾讯企业邮箱作为发件人的操作如下----- ...

  9. C# Email邮件发送,功能是密码找回或者重置功能。

    原文:C# Email邮件发送,功能是密码找回或者重置功能. 最近根据公司需求,写个邮件发送.   这里面的传入的地址信息的参数都是经过加密的.  主要是保证用户信息的安全. 帮助类   using ...

随机推荐

  1. window 查看端口占用情况

    查看哪个进程在用 netstat -aon|findstr "8080" TCP    0.0.0.0:8080           0.0.0.0:0              ...

  2. excel数据导入mySql数据库

    1.将excel数据保存好 2.打开数据库,在表上点击右键,选择导入向导 3.点击下图中红色部门,点击下一步 4.选择excel文件的位置,下方的表空间内,会出现excel中的sheet页,选择要导入 ...

  3. Win10 Chrome 在DPI缩放下导致界面放大问题 解决方案

    支持:54.0.2840.59 m (64-bit) 以下大多数版本,具体未测试.如有问题可以反馈一下. 方法1:为程序设置"高DPI设置时禁用显示缩放. 方法2:为程序添加启动参数: /h ...

  4. 注册页面的servlet

    package cn.itcast.travel.web.servlet;import cn.itcast.travel.domain.ResultInfo;import cn.itcast.trav ...

  5. C/C++ Qt 数据库SqlRelationalTable关联表

    在上一篇博文中详细介绍了SqlTableModle组件是如何使用的,本篇博文将介绍SqlRelationalTable关联表组件,该组件其实是SqlTableModle组件的扩展类,SqlRelati ...

  6. 三维引擎导入obj模型不可见总结

    最近有客户试用我们的三维平台,在导入模型的时候,会出现模型全黑和不可见的情况.上一篇文章说了全黑的情况.此文说下不可见的情况. 经过测试,发现可能有如下两种情况. 导入的模型不在镜头视野内 导入的模型 ...

  7. [IDEA] chapter_reader - idea看小说插件 idea阅读插件 idea摸鱼插件

    目录 1. 简述: 2. 使用说明: 2.1 版本说明: 2.2 重要说明: 2.3 简单使用方法: 2.4 目前支持的网站有 (新↓): 2.5 菜单介绍: 2.6 快捷键设置及推荐: 2.7 在线 ...

  8. linux小应用 —— 日志过滤

    先说问题,统计一个日志文件中去重之后的ip地址的个数.其实这是一个非常常见也比较简单的问题,其中我个人认为最主要的应该是匹配ip地址是这个问题的核心.剩下的就是对linux命令的熟练程度的问题了.首先 ...

  9. [BUUCTF]REVERSE——[BJDCTF2020]easy

    [BJDCTF2020]easy 附件 例行检查,无壳,32位程序 32位ida载入,main函数和字符串理都没有找到有关flag的提示 根据main函数的提示,有关flag的函数应该被藏起来了,在左 ...

  10. [BUUCTF]PWN——xdctf2015_pwn200

    xdctf2015_pwn200 附件 步骤 例行检查,32位程序,开启了nx保护 本地试运行一下程序,看看大概的情况 32位ida载入,习惯性的检索程序里的字符串,没有发现什么铭感的地方,直接看ma ...