**SMTP(Simple Mail Transfer Protocol)**是简单邮件传输协议,它是一组用于由源地址到目的地址的邮件传输规则。
python中连接smtp服务语法如下:(以163邮箱为例)
import smtplib
smtplib.SMTP_SSL(‘smtp.163.com’, 465)
发送邮件的语法如下:
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])
参数说明:
- from_addr: 邮件发送者地址。
- to_addrs: 字符串列表,邮件发送地址。
- msg: 发送消息
这里要注意一下第三个参数msg为邮件的部分,包含标题、发信人,收件人,邮件内容,附件等。这部分在email模块中进行构建的。
MIMEText : (MIME媒体类型)内容形式为纯文本,HTML页面(导入方式 : from email.mime.text import MIMEText)
MIMEImage : 内容形式为图片(导入方式 : from email.mime.image import MIMEImage)
MIMEMultupart : 多形式组合,可包含文本和附件(导入方式 : from email.mime.multipart import MIMEMultipart)
(1).MIMEText语法:
MIMEText(msg,type,chartset)
msg:文本内容
type:文本类型默认为plain(纯文本)
#发送HTML格式的时候,修改为html,但同时要求msg的内容也是html的格式。
chartset:文本编码,中文为“utf-8”
# 构造TEXT格式的消息
msg = MIMEText(“hello.text”,“plain”,“utf-8”)
msg[“Subject”] = “xxxxx” #主题
msg[“From”] = “xxxx” #发件人
msg[“To”] = “xxxx” #收件人
#发送以上构造的邮件内容要使用as_string将构造的邮件内容转换为string形式。
s.sendmail(“xxx”,“xxx”,msg.as_string)
(2)MIMEImage,MIMEMultipart语法
msg = MIMEMultipart()
#实例化一个文本对象
msg_sub = MIMEText(“hello.text”,“plain”,“utf-8”)
#将text消息添加到MIMEMultipart中,作为邮件正文。
msg.attach(msg_sub)
#图片作为附件
import os
img_datas = open(os.getcwd()+ “/reports/xxxx.png”,“rb”).read()
msg_img = MIMEImage(img_data)
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
from email.utils import formataddr
def mail(subject,text):
sender='xxxxxxxx@163.com' #发件人邮箱
password='xxxxxxxx' #发件人邮箱密码(授权码)
receiver='xxxxxxx@163.com' #收件人邮箱
try:
msg=MIMEText(text,'plain','utf-8')
msg['From']=formataddr(['xxxxxx',sender]) #发件人邮箱
msg['To']=formataddr(['xxxxxx',receiver]) #收件人邮箱
msg['Subject']=subject #主题信息
server = smtplib.SMTP_SSL('smtp.163.com', 465) #163邮箱smtp服务器及端口
server.login(sender,password) #登录发件人邮箱
server.sendmail(sender,receiver,msg.as_string()) #发送邮件
server.close()
print('发送成功\t\n')
except Exception:
print('发送失败\t\n')
mail('测试邮件','hello python')