SMTP邮件的发送

Zss 发表于:

若使用第三方的邮箱需要在邮箱中开通smtp服务,开通后也会有一个邮箱的生成码(POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务中开通),发送邮件就是用这个来作为密码来验证

不适用第三方服务器的话就需要自己本地搭建一个邮件服务器,通常自动化测试完后需要以邮件的形式来通知,发送数据和结果到各个人员的邮箱中

1.发送不带附件的纯文本信息的邮件

#coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

my_sender='465xxxxxx@qq.com'    # 发件人邮箱账号
my_pass = '这里使用的是qq邮箱生成的密码'              # 发件人邮箱密码
my_user=['131xxxx@qq.com','465xxxx@qq.com']    # 收件人邮箱账号
def mail():
    ret=True
    try:
        msg=MIMEText('填写邮件内容','plain','utf-8')
        msg['From']=formataddr(["zss",my_sender])  # 括号里的对应发件人邮箱昵称、发件人邮箱账号
        msg['To']=formataddr(["zw",my_user])              # 括号里的对应收件人邮箱昵称、收件人邮箱账号
        msg['Subject']="这是一封测试邮件"                # 邮件的主题,也可以说是标题

        server=smtplib.SMTP_SSL("smtp.qq.com", 465)  # 发件人邮箱中的SMTP_SSL服务器,端口是465
        server.login(my_sender, my_pass)  # 括号中对应的是发件人邮箱账号、邮箱密码
        server.sendmail(my_sender,my_user,msg.as_string())  # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
        server.quit()  # 关闭连接
    except Exception:  # 如果 try 中的语句没有执行,则会执行下面的 ret=False
        ret=False
    return ret
if __name__ == '__main__':
    ret=mail()
    if ret:
        print("邮件发送成功")
    else:
        print("邮件发送失败")

2.发送带附件的纯文本信息的邮件

#coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
 
sender = '4xxxxxx@qq.com'  #发送方的邮箱
my_pass = '这里使用的是qq邮箱生成的密码'   #发送方的密码
receivers = ['xxxxxxxx@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱,列表的形式才存储多个接收方
 
#创建一个带附件的实例
message = MIMEMultipart()
message['From'] = Header("收件人名", 'utf-8')#收件人的姓名
message['To'] =  Header("测试", 'utf-8')
subject = 'Python SMTP 邮件测试'  #邮件的标题
message['Subject'] = Header(subject, 'utf-8')
 
#邮件正文内容
message.attach(MIMEText('这是一个带有附件的邮件发送测试……', 'plain', 'utf-8'))
 
# 构造附件1,传送当前目录下的 test.txt 文件
att1 = MIMEText(open('zss.txt', 'rb').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('test.txt', 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="test.txt"'
message.attach(att2)

try:
    smtpObj = smtplib.SMTP_SSL("smtp.qq.com", 465)
    smtpObj.login(sender, my_pass)
    smtpObj.sendmail(sender, receivers, message.as_string())
    print "邮件发送成功"
except smtplib.SMTPException:
    print "Error: 无法发送邮件"

3.发送html格式中带有图片的邮件

#coding:utf-8
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header

sender = '4xxxxxxx@qq.com'#发送方的邮箱
password = 'qgusxxxxx'  #发送方的密码
receivers = ['4xxxxx@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

msgRoot = MIMEMultipart('related')
msgRoot['From'] = Header("收件人名", 'utf-8')#收件人的姓名
msgRoot['To'] =  Header("测试", 'utf-8')
subject = 'Python SMTP 邮件测试' #邮件的标题
msgRoot['Subject'] = Header(subject, 'utf-8')

msgAlternative = MIMEMultipart('alternative')
msgRoot.attach(msgAlternative) #邮件正文内容 表示什么类型,html还是文本
#message.attach(MIMEText('这是一个带有附件的邮件发送测试……', 'plain', 'utf-8'))
#html的内容
mail_msg = """
<p>Python 邮件发送测试...</p>
<p><a href="http://www.testone.top">Test-one链接</a></p>
<p>图片演示:</p>
<p><img src="cid:image1"></p>
"""
msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8'))

# 指定图片为当前目录  发送哪张图片
fp = open('test.jpg', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()

# 定义图片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', '<image1>')
msgRoot.attach(msgImage)

try:
    smtpObj = smtplib.SMTP_SSL('smtp.qq.com',465) #设置服务器
    smtpObj.login(sender,password)  #登陆
    smtpObj.sendmail(sender, receivers, msgRoot.as_string())#发送
    print "邮件发送成功"
except smtplib.SMTPException:
    print "Error: 无法发送邮件"

方法 描述
SMTP.set_debuglevel(level) 设置输出debug调试信息,默认不输出
SMTP.docmd(cmd[, argstring]) 发送一个命令到SMTP服务器
SMTP.connect([host[, port]]) 连接到指定的SMTP服务器
SMTP.helo([hostname]) 使用helo指令向SMTP服务器确认你的身份
SMTP.ehlo(hostname) 使用ehlo指令像ESMTP(SMTP扩展)确认你的身份
SMTP.ehlo_or_helo_if_needed() 如果在以前的会话连接中没有提供ehlo或者helo指令,这个方法会调用ehlo()或helo()
SMTP.has_extn(name) 判断指定名称是否在SMTP服务器上
SMTP.verify(address) 判断邮件地址是否在SMTP服务器上
SMTP.starttls([keyfile[, certfile]]) 使SMTP连接运行在TLS模式,所有的SMTP指令都会被加密
SMTP.login(user, password) 登录SMTP服务器
SMTP.sendmail(from_addr, to_addrs, msg, mail_options=[], rcpt_options=[]) 发送邮件

from_addr:邮件发件人

to_addrs:邮件收件人

msg:发送消息

SMTP.quit() 关闭SMTP会话
SMTP.close() 关闭SMTP服务器连接