python 发邮件
Posted 娄先生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 发邮件相关的知识,希望对你有一定的参考价值。
一、邮件的介绍
1.1 协议的介绍
发送的协议:SMTP 规定了发送的数据格式,交互报文
接受的协议:pop3、IMAP。 两者区别IMAP
我们主要是使用SMTP来发送数据。
1.2 邮件的流程
与smtp服务器建立连接--》 建立smtp通道--》 登入--》 写邮件格式--》发送
二、代码实现
python发邮件主要是是使用 smtplib这个类。
邮件的格式与内容 主要使用email这个类
1.1 只发送文本 的邮件
import smtplib
from smtplib import SMTP_SSL
from email.header import Header
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
from email.utils import formataddr
addr_to = [\'2323449277@qq.com\', \'18768196753@139.com\']
# 第一步连接到服务器,并发送一个地址查询,然后登入进去
smtp = SMTP_SSL(\'smtp.qq.com\')
smtp.ehlo(\'smtp.qq.com\')
# smtp.set_debuglevel(1) 打开调试,能看到与服务器之间的交互
smtp.login(\'459900477@qq.com\', \'iajeclsnsrxebjgd\')
\'\'\'
第一种,只是发本文
\'\'\'
def send_email():
# 第二步构造邮件格式:
msg = MIMEText(\'wo zai na li?\', \'plain\', \'utf-8\') # 生成一个邮件主体内容对象
msg[\'subject\'] = Header(\'邮件标题1\', \'utf-8\') # 邮件主体对象添加标题
msg[\'from\'] = formataddr((\'LH\', \'459900477@qq.com\')) # 添加发件人
addr_to = [\'2323449277@qq.com\', \'18768196753@139.com\']
msg[\'to\'] = \',\'.join(addr_to) # 添加收件人,这个是在邮件中显示的。可以有多个,用,分割
# 发送邮件,
smtp.sendmail(\'459900477@qq.com\', addr_to, msg.as_string()) # 接受双方的人物
# 关闭 与邮件服务器之间的连接
smtp.quit()
def main():
send_email
if __name__ == \'__main__\':
main()
1.2 发送带附件的邮件
登入 与 模块 使用1.1的案列
def send_email_attch(body, attachment):
msg = MIMEMultipart()
msg[\'subject\'] = Header(\'邮件标题1\', \'utf-8\') # 邮件主体对象添加标题
msg[\'from\'] = formataddr((\'LH\', \'459900477@qq.com\')) # 添加发件人
msg[\'to\'] = \'2323449277@qq.com\' # 添加收件人
msg.attach(MIMEText(body, \'plain\', \'utf-8\')) # 定义邮件的格式
with open(attachment, \'rb\') as f:
# MIMEBase表示附件对象
mime = MIMEBase(\'text\', \'txt\', filename=attachment)
# 第一个参数必须一致,第二个参数随意,第三个参数为附件的名字
mime.add_header(\'Content-Disposition\', \'456\', filename=\'hui.py\')
mime.set_payload(f.read()) # 读取文件的内容到付件中
encoders.encode_base64(mime) # 定义传输的编码协议,避免错落
msg.attach(mime) # 把附件添加到邮件中中。
try:
smtp.sendmail(\'459900477@qq.com\', addr_to, msg.as_string()) # 发送邮件
smtp.quit()
except smtplib.SMTPException as e:
print(e)
1.3 究极版本:文本或html或附件
def send_email_all(body, mailtype=\'plain\', attachment=None):
\'\'\'
body:邮件正文。 可以是文本 或 html。由第二个参数来控制
mailtype:邮件格式
acctcchment: 附件。如果不存在,不添加,存在则添加
\'\'\'
# 构造一个MimeMultipart对象,代表邮件本身
msg = MIMEMultipart()
# 设置邮件的内容:标题,发件人,收件人
msg[\'subject\'] = Header(\'邮件标题1\', \'utf-8\') # 邮件标题对象添加标题
msg[\'from\'] = formataddr((\'LH\', \'459900477@qq.com\')) # 添加发件人
msg[\'to\'] = \',\'.join(addr_to) # 添加收件人
# body代表发送的内容,mailtype为内容的格式:文本(plian)或html
msg.attach(MIMEText(body, mailtype, \'utf-8\')) # 定义邮件的格式
# 如果有附件,则添加进去
if attachment:
# 使用二进制模式打开
with open(attachment, \'rb\') as f:
# MIMEBase表示附件对象
mime = MIMEBase(\'text\', \'txt\', filename=attachment)
# 第一个参数必须一致,第二个参数随意,第三个参数为附件的名字
mime.add_header(\'Content-Disposition\', \'456\', filename=\'hui.py\')
mime.set_payload(f.read()) # 读取文件的内容到付件中
encoders.encode_base64(mime) # 定义传输的编码协议,避免错落
msg.attach(mime) # 将附件添加到邮件中
try:
smtp.sendmail(\'459900477@qq.com\', addr_to, msg.as_string()) # 发送邮件
smtp.quit()
except smtplib.SMTPException as e:
print(e)
二、封装成类,到处得瑟
import smtplib
from smtplib import SMTP_SSL
from email.header import Header # 邮件的主题格式
from email.mime.text import MIMEText # 邮件的格式,纯文本格式
from email.mime.multipart import MIMEMultipart # 邮件的格式,多格式
from email.mime.base import MIMEBase # 附件
from email import encoders # 附件的编码
from email.utils import formataddr # 邮件的发件人格式
\'\'\'
构造成类
\'\'\'
class NoMailListErrot(Exception):
\'自定义异常,在邮件接收人不存在的时候,主动抛出异常\'
pass
class MailMaster:
def __init__(self, email_from_addr=\'459900477@qq.com\', password=\'iajeclsnsrxebjgd\', email_server=\'smtp.qq.com\'):
\'\'\'初始化函数,生成smtp对象,连接到服务器,并登入进去
\'\'\'
# 第一步连接到服务器,并发送一个地址查询,然后登入进去
self.smtp = SMTP_SSL(email_server)
# self.smtp.set_debuglevel(1) # 调试接口
self.smtp.ehlo(email_server)
self.email_from_addr = email_from_addr
self.smtp.login(self.email_from_addr, password)
self.email_to_addr = []
def notice(self, username, text, subject=\'通知消息\'):
\'发送通知,调用通用发邮件接口\'
self.send_email(subject, f\'{username}\\n\'+text)
def add_emali_to_list(self, addr: str):
\'添加收件人\'
self.email_to_addr.append(addr)
def send_email(self, subject, body, mailtype=\'plain\', attachment=None):
\'\'\'发送邮件接口
@subject: 邮件主题
@body: 邮件内容
@mailtype:邮件类型,默认时文本,发html时为html
attachment:附件
\'\'\'
msg = MIMEMultipart()
# 设置邮件的内容:标题,发件人,收件人
msg[\'subject\'] = Header(subject, \'utf-8\') # 邮件标题对象添加标题
msg[\'from\'] = formataddr((\'LH\', self.email_from_addr)) # 添加发件人
try:
if len(self.email_to_addr) > 0:
msg[\'to\'] = \',\'.join(self.email_to_addr) # 添加收件人
else:
raise NoMailListErrot(\'还没添加收件人了,去加下吧\')
# body代表发送的内容,mailtype为内容的格式:文本(plian)或html
msg.attach(MIMEText(body, mailtype, \'utf-8\')) # 定义邮件的格式
# 如果有附件,则添加进去
if attachment:
# 使用二进制模式打开
with open(attachment, \'rb\') as f:
# MIMEBase表示附件对象
mime = MIMEBase(\'text\', \'txt\', filename=attachment)
# 第一个参数必须一致,第二个参数随意,第三个参数为附件的名字
mime.add_header(\'Content-Disposition\', \'456\', filename=\'hui.py\')
mime.set_payload(f.read()) # 读取文件的内容到付件中
encoders.encode_base64(mime) # 定义传输的编码协议,避免错落
msg.attach(mime) # 将附件添加到邮件中
self.smtp.sendmail(self.email_from_addr, self.email_to_addr, msg.as_string()) # 发送邮件
self.smtp.quit()
except smtplib.SMTPException as e:
print(e)
测试:
e = MailMaster()e.add_emali_to_list(\'2323449277@qq.com\')e.add_emali_to_list(\'18768196753@139.com\')e.notice(\'娄辉\', \'注册成功!!\')
以上是关于python 发邮件的主要内容,如果未能解决你的问题,请参考以下文章