Python SMTP发送邮件

目录

使用方法

构造一个简单的纯文本邮件内容:

Python创建 SMTP 对象语法如下:

Python SMTP 对象使用 sendmail 方法发送邮件,语法如下:

demo

发送纯文本邮件

发送html邮件

发送携带图片的Email

发送带附件的Email


使用方法

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。

Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。

Python对SMTP支持有smtplibemail两个模块,email负责构造邮件,smtplib负责发送邮件。

构造一个简单的纯文本邮件内容:

from email.mime.text import MIMEText

msg = MIMEText('test', 'plain', 'utf-8')
# 三个参数:
# 第一个为文本内容
# 第二个 plain 设置文本格式
# 第三个 utf-8 设置编码

Python创建 SMTP 对象语法如下:

import smtplib

smtp_obj = smtplib.SMTP([host [, port [, local_hostname]]])

# 参数说明:
# host: SMTP 服务器主机。 你可以指定主机的ip地址或者域名如: runoob.com,这个是可选参数。
# port: 如果你提供了 host 参数, 你需要指定 SMTP 服务使用的端口号,一般情况下 SMTP 端口号为25。
# local_hostname: 如果 SMTP 在你的本机上,你只需要指定服务器地址为 localhost 即可。

Python SMTP 对象使用 sendmail 方法发送邮件,语法如下:

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])

# 参数说明:
# from_addr: 邮件发送者地址。
# to_addrs: 字符串列表,邮件发送地址。
# msg: 发送消息

这里要注意一下第三个参数,msg 是字符串,表示邮件。我们知道邮件一般由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意 msg 的格式。这个格式就是 smtp 协议中定义的格式。

demo

发送纯文本邮件

# 简单纯文本邮件的发送
import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 发件人邮箱地址
sender = '[email protected]'
# 接收人邮箱地址, 可以设置多个
receivers = ['[email protected]']

# 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
message = MIMEText('Test', 'plain', 'utf-8')
# 邮件中展示给收件人的发送者
message['From'] = Header("xxx", 'utf-8')
# 邮件中展示给收件人的接收者
message['To'] = Header("测试", 'utf-8')

subject = 'Python SMTP 邮件测试'
# 设置邮件主题
message['Subject'] = Header(subject, 'utf-8')

try:
    # 两个参数
    # 第一个参数为smtp服务器地址(这里我们使用qq邮箱的smtp服务器)
    # 第二个参数为端口号,默认为25
    smtp = smtplib.SMTP('smtp.qq.com', 25)
    # 需要先登录再发送, 第一个参数为登录用户名, 第二个参数为密码
    smtp.login(sender, 'xxxx')
    # 这一句可以打印出和SMTP服务器交互的所有信息
    smtp.set_debuglevel(1)
    # 发送邮件
    smtp.sendmail(sender, receivers, message.as_string())
    print("邮件发送成功")
except smtplib.SMTPException as e:
    print("Error: 无法发送邮件\n错误原因:%s" %e)


-------------------
屏幕输出>>>:
send: 'mail FROM:<[email protected]> size=213\r\n'
reply: b'250 Ok\r\n'
reply: retcode (250); Msg: b'Ok'
send: 'rcpt TO:<[email protected]>\r\n'
reply: b'250 Ok\r\n'
reply: retcode (250); Msg: b'Ok'
send: 'data\r\n'
reply: b'354 End data with .\r\n'
reply: retcode (354); Msg: b'End data with .'
data: (354, b'End data with .')
send: b'Content-Type: text/plain; charset="utf-8"\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: base64\r\nFrom: =?utf-8?q?xxx?=\r\nTo: =?utf-8?b?5rWL6K+V?=\r\nSubject: =?utf-8?b?UHl0aG9uIFNNVFAg6YKu5Lu25rWL6K+V?=\r\n\r\nVGVzdA==\r\n.\r\n'
reply: b'250 Ok: queued as \r\n'
reply: retcode (250); Msg: b'Ok: queued as'
data: (250, b'Ok: queued as')
邮件发送成功

ps:注意这里不是使用qq密码进行登录,而是使用QQ邮箱授权的第三方密码,具体申请规则请参考授权码申请

发送html邮件

我们不仅可以发送纯文本邮件,还可以发送html邮件,方法很简单,在构造MIMEText对象时,把HTML字符串传进去,再把第二个参数由plain变为html就可以了:

# 写前端html/css语言
html = '''

    
        

Hello

I'm test

点我 ''' message=MIMEText(html, 'html', 'utf-8')

既然能发送html邮件,那么我们在html代码中写入一个image标签岂不是可以显示图片了?

其实不然,大部分邮件服务商都会自动屏蔽带有外链的图片,因为不知道这些链接是否指向恶意网站。

发送携带图片的Email

我们可以把图片嵌入到邮件正文中只需按照发送附件的方式,先把邮件作为附件添加进去,然后,在HTML中通过引用src="cid:0">就可以把附件作为图片嵌入了。如果有多个图片,给它们依次编号,然后引用不同的cid:x即可。

发送带附件的Email详情参考下面

发送带附件的Email

带附件的邮件可以看做包含若干部分的邮件:文本和各个附件本身,所以,可以构造一个MIMEMultipart对象代表邮件本身,然后往里面加上一个MIMEText作为邮件正文,再继续往里面加上表示附件的MIMEBase对象即可:

from email.mime.multipart import MIMEMultipart

# 生成Multipart编码格式的对象
# 学过http协议的应该都很清楚,请求携带数据的编码格式:urlencoded、formdata、json
# multipart就是制定以formdata格式编码,就可以传输文件了
message = MIMEMultipart()

# 携带附件的同时传输文本
msg.attach(MIMEText('test', 'plain', 'utf-8'))

# 添加附件就是加上一个MIMEBase,从本地读取一个图片:
with open('/Users/apple/Downloads/test.png', 'rb') as f:
    # 设置附件的MIME和文件名,这里是png类型:
    mime = MIMEBase('image', 'png', filename='test.png')
    # 加上必要的头信息:
    mime.add_header('Content-Disposition', 'attachment', filename='test.png')
    mime.add_header('Content-ID', '<0>')
    mime.add_header('X-Attachment-Id', '0')
    # 把附件的内容读进来:
    mime.set_payload(f.read())
    # 用Base64编码:
    encoders.encode_base64(mime)
    # 添加到MIMEMultipart:
    msg.attach(mime)

使用Python的smtplib发送邮件十分简单,只要掌握了各种邮件类型的构造方法,正确设置好邮件头,就可以顺利发出。

你可能感兴趣的:(python)