1.基本常识
邮件发送流程:发件人--- > MUA(邮件用户代理即用户邮箱) --- > MTA(邮件传输代理,如网易,阿里云等email提供商)--- > MTA …… MTA--- > MDA(目的地邮件投递代理) <--- MUA < --- 收件人
发邮件时:MUA和MTA使用SMTP协议,中间的MTA也是此协议
收邮件时:MUA和MDA使用POP3(或POP4)
2.SMTP发送邮件
Smtplib模块(发送邮件)和email模块(构造邮件)
(1)smtpObj=smtplib.SMTP([host[,port[,local_hostname]]]) 创建SMTP
host:SMTP服务器主机IP地址或域名
port:端口号
local_hostname:本地主机名(服务器在本地可以不用写host和port,直接写localhost)
(2)SMTP.sendmail(from_addr,to_addrs,msg[,mail_option.rcpt_options])
from_addr: 发件人地址
to_addrs: 邮件发送地址
msg: 发送消息
(3)常用方法:
3.实例
例子1:网易邮箱发送给qq邮箱
# -*- conding:UTF-8 -*-
# 功能: 发送简单的文本邮件
# 注意: 确保该代码可用请先到发送者邮箱后台开启 SMTP 登录功能,并获得第3方登录密码
# 注意: 使用163邮件服务器时,可用 SMTP()方法,25端口进行登录
# 注意: 使用腾讯邮件服务器时,必须使用 SMTP_SSL()方法,465端口进行登录
import smtplib # 导入 smtplib 邮件处理库,连接邮件服务器
from email.mime.text import MIMEText #编辑邮件内容和格式
from email.utils import formataddr
from email.header import Header
mail_server = "smtp.163.com" # 发件人邮件服务器
port = "25" # 服务端口
sender = "********@163.com" # 发件人邮箱帐号
sender_passw = "********" # 发件人邮箱密码(第3方登录授权密码)
receiver = "**********@qq.com" # 收件人邮箱帐号
# 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
msg = MIMEText('邮件正文','plain','utf-8') # 邮件内容(正文) 需要发送HTML文件时,plain 改为 html 即可!
msg['From'] = formataddr(["发件人邮箱昵称", sender]) # 发件人信息
msg['To'] = formataddr(["收件人邮箱昵称", receiver]) # 收件人信息
# 邮件的主题
msg['Subject'] = "邮件的主题" #方法1:不设置文本编码格式
subject = '邮件的主题'
msg['Subject'] = Header(subject, 'utf-8')
def sendMail(mail_server, port, sender,sender_passw, receiver):
try:
mail = smtplib.SMTP() # 使用SMTP()方法指向邮件服务器(使用QQ邮箱服务器时,需改用 SMTP_SSL()方法)
mail.connect(mail_server, port) # 连接服务器
mail.login(sender, sender_passw) # 请求服务器,登录帐号
mail.sendmail(sender, receiver, msg.as_string() ) # 发送邮件(给receiver传入列表时,表示群发)
mail.quit() # 断开连接
print("邮件发送成功!")
except:
mail.quit()
print("邮件发送失败!")
if __name__ == '__main__':
sendMail(mail_server, port, sender, sender_passw, receiver)
例子2:带附件(qq发qq )
去设置-->账户-->找到POP3/IMAP 开启POP3/SMTP服务
#coding=utf-8
import smtplib
from email.mime.text import MIMEText #设置邮件正文
from email.mime.multipart import MIMEMultipart #设置带附件的邮件
from email.header import Header
from email.utils import formataddr
mail_server = "smtp.qq.com" # 发件人邮件服务器
port = "465" # 服务端口
sender = "******@qq.com" # 发件人邮箱帐号
sender_passw = '******' #发件人邮箱密码(第3方登录授权密码)
receiver = "*****@qq.com" # 收件人邮箱帐号
# 创建一个带附件的实例
message = MIMEMultipart()
message['From'] = formataddr(["发件人邮箱昵称", sender]) # 发件人信息
message['To'] = formataddr(["收件人邮箱昵称", receiver]) # 收件人信息
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
# 邮件正文内容
message.attach(MIMEText('这是菜鸟教程Python 邮件发送测试……', 'plain', 'utf-8'))
# 构造附件1,传送当前目录下的 test.txt 文件
att1 = MIMEText(open('test.txt', 'wb+').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment;filename="test.txt"'
message.attach(att1)
# 构造附件2,传送当前目录下的 runoob.txt 文件
att2 = MIMEText(open('runoob.txt', 'wb+').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="runoob.txt"'
message.attach(att2)
try:
smtpObj = smtplib.SMTP_SSL()
smtpObj.connect(mail_server, port)
smtpObj.login(sender, sender_passw)
smtpObj.sendmail(sender, receiver, message.as_string())
smtpObj.quit()
print('邮件发送成功')
except smtplib.SMTPException:
print('Error: 无法发送邮件')