文本邮件的发送
1.邮件发送流程
邮件的发送是主动行为:主要通过 MUA/邮件客户端软件,将邮件内容发送给对应的服务器 暂存到投递服务区,然后由当前运营商根据邮件特征信息将邮件转发给目标服务器的投递服 务区,此时目标用户的邮件已经发送完成,等待对方收取即可。
邮件的收取也是主动行为,用户可以打开邮件客户端软件,通过点击类似于收取这样的行为 就可以从自己邮箱所属的服务器投递区中提取邮件了。
1.1发送普通文本邮件
完整代码:
"""
文本邮件的发送
version 1.1.0
author lkk
email lkk199404@163.com
"""
引入要用到的模块
import email, smtplib
from email.mime.text import MIMEText
定义发送人邮箱信息
SMTP_SERVER = 'smtp.163.com'
EMAIL_USER = 'lkk9404@163.com'
EMAIL_PASS = '填写邮箱授权码'
定义发件人、收件人邮箱
sender = EMAIL_USER
receiver = '690575621@qq.com'
定义邮件内容
message = MIMEText("这是一个文本信件,<h1>普通文本</h1>", "plain", "utf-8")
定义收件人、发件人和邮件主题、如果不定义~可能会引发554垃圾邮件的检查错误
message['from'] = sender
message['to'] = receiver
message['subject'] = 'lkk测试邮件' #邮件主题
连接邮件服务器
server = smtplib.SMTP_SSL(SMTP_SERVER, 465)
设置信息展示级别
server.set_debuglevel(1)
登录邮箱服务器
server.login(EMAIL_USER, EMAIL_PASS)
发送邮件
server.sendmail(from_addr=sender, to_addrs=[receiver], msg=message.as_string())
退出并关闭客户端
server.quit()
print("邮件发送结束.")
1.2发送HTML格式邮件
相对于普通文本格式,HTML 文本更加的丰富,可以给文本定义各种格式数据,操作方式也 较为简单,将普通文本的 plain 类型更改为 html 类型即可。
完整代码:
"""
html邮件的发送
version 1.1.0
author lkk
email lkk199404@163.com
DESC: 发送网页格式的邮件
"""
引入要用到的模块
from email.mime.text import MIMEText
from email.header import Header
from email.utils import parseaddr, formataddr
from smtplib import SMTP_SSL
def __format_addr(address):
"""用户信息和邮件解析函数"""
re, addr = parseaddr(address)
# 返回编码解析后的数据
return formataddr((Header(re, 'utf-8').encode(),addr))
定义发件人信息
SMtp_SERVER = 'smtp.qq.com'
EMAIL_USER = '937977603@qq.com'
EMAIL_PASS = '填写QQ邮箱授权码'
定义发件人、收件人
sender = EMAIL_USER
receive = 'lkk9404@163.com'
定义邮件内容
message = MIMEText('<h1>刘康康HTML测试邮件</h1>', 'html', 'utf-8')
message['from'] = __format_addr('lkk <{}>'.format(sender))
message['to'] = __format_addr('刘康康 <{}>'.format(receive))
message['subject'] = 'HTML测试' #邮件主题
连接邮箱服务器
mail_server = SMTP_SSL(SMtp_SERVER, 465)
mail_server.set_debuglevel(1)
登录服务器
mail_server.login(EMAIL_USER, EMAIL_PASS)
发送邮件
mail_server.sendmail(from_addr=sender, to_addrs=[receive], msg=message.as_string())
关闭并退出客户端
mail_server.quit()
print('邮件已发送>>>>')
1.3发送含有附件的邮件
邮件本身就是一个对象,在该一个完整的邮件中应该包含的数据有
⚫ 标题
⚫ 发件人
⚫ 收件人
⚫ 文本内容
⚫ 附件
在 PYTHON 中进行操作时,主要通过 email.mime.multipart.MIMEMultipart 定义邮 件对象,email.mime.text.MIMEText 定义要发送的邮件正文的内容,要发送的附件二 进制数据由 email.mime.base.MIMEBase 进行规范
完整代码:
"""
html邮件的发送
version 1.1.0
author lkk
email lkk199404@163.com
DESC: 发送带附件
"""
引入依赖的模块
from smtplib import SMTP_SSL
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.header import Header
from email.utils import parseaddr, formataddr
from email import encoders
def __format_site(user):
re, site = parseaddr(user)
return formataddr((Header(re, "utf-8").encode(), site))
定义发件人信息
SMtp_SERVER = 'smtp.qq.com'
EMAIL_USER = '937977603@qq.com'
EMAIL_PASS = '邮箱授权码'
定义收件人、发件人
sender = EMAIL_USER
receiver = 'lkk9404@163.com'
定义邮件对象
message = MIMEMultipart()
绑定发件人、收件人、主题
message['subject'] = Header('来自CSDN的一封邮件')
message['from'] = __format_site('CSDN<{}>'.format(sender))
message['to'] = __format_site(receiver)
定义信件文本内容
content = MIMEText("<h1>Python的火,烧到了所有的程序员?</h1>", 'html', 'utf-8')
message.attach(content)
绑定一个附件
with open('E:\my_test\lkk\dist\py18_plane-1.00.002.tar.gz', 'rb') as f:
# 设置MIMEBase对象包装附件
attachment = MIMEBase('application', 'octet-stream')
# 添加附件
attachment.set_payload(f.read())
# 添加附件标题
attachment.add_header('Content-Disposition', 'attachment', filename=('gbk', '', f.name))
# 编码附件
encoders.encode_base64(attachment)
# 添加附件到邮件中
message.attach(attachment)
登录邮件服务器
mail_server = SMTP_SSL(SMtp_SERVER, 465)
mail_server.set_debuglevel(1)
mail_server.login(EMAIL_USER, EMAIL_PASS)
发送邮件
mail_server.sendmail(from_addr=sender, to_addrs=[receiver], msg=message.as_string())
发送完成
mail_server.quit()
print('邮件已发送>>>>')