Python SMTP邮件发送详解

一、前言

SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。
Python对SMTP支持有smtplibemail两个模块

  • email构造邮件
  • smtplib发送邮件

二、模块安装

1. smtplib

smtplib不能直接使用pip install smtplib
通常发送邮件用PyEmail,所以直接pip install PyEmail就行 
PyEmail (0.0.1)              - Python library to send emails using SMTPLIB library
micropython-smtplib (0.0.0)  - Dummy smtplib module for MicroPython
personal (0.1.1)             - Easy, secure self notification via email and sms, using smtplib and twilio
aiosmtplib (0.1.4)           - asyncio version of smtplib
secure-smtplib (0.1.1)       - Secure SMTP subclasses for Python 2
mailclient (0.2.0)           - Simplified use of smtplib for Python. Easy email sending.
smtplibaio (1.0.3)           - An async version of smtplib
easyemail (0.4.0)            - Simple lib abstracting email sending with smtplib.

2. email

pip install emails

三、模块使用简介

1. smtplib模块:

主要通过SMTP类与邮件系统进行交互。使用方法如下:

  1. 实例化一个SMTP对象:
    server = smtplib.SMTP(邮件服务地址,端口号) # 正常连接,可配合server.starttls() 使用
    server = smtplib.SMTP_SSL(邮件服务地址,端口号) # 使用SSL连接

  2. 登陆邮件,权限验证:
    server.login(用户名,密码)

  3. 发送邮件:
    server.sendmail(发件人邮箱,收件人邮箱,发送内容)

  4. 断开连接:
    server.quit()

server = smtplib.SMTP(smtp_server, port)  # 设置服务器和端口号
server.starttls()  # 启动安全传输模式
server.login(from_address, password)  # 邮箱账户登录校验
server.set_debuglevel(1)  # 打印出和SMTP服务器交互的所有信息,如果没有这一语句,将不打印任何信息
    
# 1. msg.as_string()把MIMEText对象变成str(包含utf-8编码信息和Base64编码)
# 2. [to_addr]表示可以有多个收件人。多个收件人,传入list。当然,也可以在前面to_addr处直接用list进行赋值,那么此处就不是传入[to_addr],而是传入to_addr了
server.sendmail(From, To, msg.as_string())  # 邮件发送
server.quit()  # 断开smtp连接

2. email模块:

email模块:支持发送的邮件内容为纯文本HTML内容图片附件
email模块中有几大类来针对不同的邮件内容形式,常用如下:

  • MIMEText:(MIME媒体类型)内容为纯文本、HTML页面。

  • MIMEImage:内容为图片。

  • MIMEMultupart:可包含文本和附件。

    每一类对应的导入方式:

    from email.mime.text import MIMEText
    from email.mime.image import MIMEImage
    from email.mime.multipart import MIMEMultipart
    
2.1 MIMEText (文件 or HTML)
MIMEText(msg,type,chartset)

# 纯文本邮件
MIMEText('文本', 'plain', 'utf-8')
# HTML邮件
MIMEText('HTML字符串', 'html', 'utf-8')
msg  :文本内容
type :文本类型默认为plain(纯文本),HTML类型为html(type为html时msg也要是html的格式)
chartset: 文本编码,通常使用utf-8

构造TEXT格式的消息

msg = MIMEText("hello.text","plain","utf-8") # 构造Text消息

msg["Subject"] = "xxxxx"
msg["From"] = "xxxx"
msg["To"] = "xxxx"

发送以上构造的邮件内容要使用as_string将构造的邮件内容转换为string形式。

server.sendmail(From,To,msg.as_string)
2.2 MIMEImage、MIMEMultipart:
msg = MIMEMultipart()
# 实例化一个文本对象 
msg_sub = MIMEText("hello.text","plain","utf-8")

# 将text消息添加到MIMEMultipart中,作为邮件正文。
msg.attach(msg_sub)

#图片作为附件
img = open(path,"rb").read()	# 以rb方式打开并读取图片
msg_img = MIMEImage(img)	

# 添加头部信息
msg_img.add_header('Content-Disposition','attachment', filename = "xxxx.png" )
msg_img.add_header('Content-ID','<0>')

#将图片添加到MIMEMultiplart中,作为附件发送。
msg.attach(mag_img)

四、发送纯本文邮件

import smtplib
from email.mime.text import MIMEText

# 基本信息定义
smtp_server = 'smtp.qq.com'  # smtp服务器
port = 25  # SMTP协议默认端口为25

from_address = 'xxxxxxxxxx@qq.com'  # 邮件发件人
password = 'xxxxxxxx'  # 密码或邮箱授权码
to_address = 'xxxxxxxxxx@qq.com'  # 邮件收件人

subject = 'Python 邮件测试'  # 邮件主题
content = '这是使用python smtplib+email自动发送的邮件'  # 邮件正文

# 构建邮件
msg = MIMEText(content, 'plain', 'utf-8')  # 构建一个MIMEText
msg['Subject'] = subject
msg['From'] = from_address
msg['TO'] = to_address

# 发送邮件
try:
    server = smtplib.SMTP(smtp_server, port)
    server.starttls()  # 启动安全传输模式
    # server.set_debuglevel(1)  # 打印出和SMTP服务器交互的所有信息,如果没有这一语句,将不打印任何信息
    server.login(from_address, password)  # 邮箱账户登录校验
    server.sendmail(from_address, to_address, msg.as_string()
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值