开放的编程资料库

当前位置:我爱分享网 > Python教程 > 正文

Python smtplib

Pythonsmtplib教程展示了如何使用smtplib模块在Python中发送电子邮件。要发送电子邮件,我们使用Python开发服务器、Mailtrap在线服务和共享的虚拟主机邮件服务器。

邮件传输协议

简单邮件传输协议(SMTP)是一种用于电子邮件传输的通信协议。Is是一个Internet标准,于1982年由RFC821首次定义,并于2008年由RFC5321更新为扩展SMTP添加。邮件服务器和其他邮件传输代理使用SMTP发送和接收邮件。

smtplib模块

smtplib是一个使用SimpleMail传输协议(SMTP)发送电子邮件的Python库。smtplib是内置模块;我们不需要安装它。它抽象掉了SMTP的所有复杂性。

邮件服务器

要真正发送电子邮件,我们需要访问邮件服务器。Python带有一个简单的开发邮件服务器。Mailslurper是一个易于使用的本地开发服务器。共享虚拟主机提供商使我们能够访问邮件服务器。我们可以在帐户中找到详细信息。

注意:避免使用Gmail,因为它是一个高度安全的服务器,而且要使其正常工作非常复杂。事实上,大多数(如果不是全部)Internet上演示如何使用Gmail服务器发送电子邮件的示例都不起作用。相反,请使用开发服务器或共享Web托管服务器。

最后,我们可以使用网络服务。有MailTrap或MailSlurp等开发Web服务,或Mailgun或Mandrill等生产服务。

使用Python内置邮件服务器

$ python -m smtpd -c DebuggingServer -n localhost:1025

我们在端口1025上启动Python内置邮件服务器。

#!/usr/bin/python

import smtplib
from email.mime.text import MIMEText

sender = 'admin@example.com'
receivers = ['info@example.com']


port = 1025
msg = MIMEText('This is test mail')

msg['Subject'] = 'Test mail'
msg['From'] = 'admin@example.com'
msg['To'] = 'info@example.com'

with smtplib.SMTP('localhost', port) as server:
    
    # server.login('username', 'password')
    server.sendmail(sender, receivers, msg.as_string())
    print("Successfully sent email")

我们向本地开发邮件服务器发送一条简单的文本消息。

sender = 'admin@example.com'
receivers = ['info@example.com']

我们提供发送者和接收者。example.com是专门用于文档中说明性示例的域名。

msg = MIMEText('This is test mail')

msg['Subject'] = 'Test mail'
msg['From'] = 'admin@example.com'
msg['To'] = 'info@example.com'

MimeText用于发送文本电子邮件。我们提供主题、起点和终点选项。

with smtplib.SMTP('localhost', port) as server:
...

SMTP类管理与SMTP服务器的连接。

# server.login('username', 'password')

因为我们使用本地开发服务器,所以我们不需要登录。

server.sendmail(sender, receivers, msg.as_string())

邮件是用sendmail发送的。

$ python -m smtpd -c DebuggingServer -n localhost:1025
---------- MESSAGE FOLLOWS ----------
b'Content-Type: text/plain; charset="us-ascii"'
b'MIME-Version: 1.0'
b'Content-Transfer-Encoding: 7bit'
b'Subject: Test mail'
b'From: admin@example.com'
b'To: info@example.com'
b'X-Peer: ::1'
b''
b'This is test mail'
------------ END MESSAGE ------------

我们在发送电子邮件后收到此消息。

发送邮件到Mailtrap

Mailtrap提供免费计划,允许我们每月发送500封邮件。设置Mailtrap非常简单。如果我们有Github或Google帐户,这实际上需要几秒钟。

设置页面中提供了必要的凭据。此外,还有显示如何使用该服务的简短代码示例,包括smtplibDjangoFlask

#!/usr/bin/python

import smtplib
from email.mime.text import MIMEText

sender = 'admin@example.com'
receiver = 'info@example.com'

msg = MIMEText('This is test mail')

msg['Subject'] = 'Test mail'
msg['From'] = 'admin@example.com'
msg['To'] = 'info@example.com'

user = 'username'
password = 'passoword'

with smtplib.SMTP("smtp.mailtrap.io", 2525) as server:

    server.login(user, password)
    server.sendmail(sender, receiver, msg.as_string())
    print("mail successfully sent")

该示例向Mailtrap帐户发送一封简单的邮件。

server.login(user, password)

用户名和密码在设置页面给出;它们由随机字符组成,例如24h328df3e32。

发送带附件的邮件

MIMEMultipart在我们有附件或想要提供相同内容的替代版本(例如纯文本/HTML版本)时使用。

falcon
blue
sky
cloud

我们有一个简单的文本文件。

#!/usr/bin/python

import smtplib
from os.path import basename
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication

sender = 'admin@example.com'
receiver = 'info@example.com'

msg = MIMEMultipart()

msg['Subject'] = 'Test mail with attachment'
msg['From'] = 'admin@example.com'
msg['To'] = 'info@example.com'

filename = 'words.txt'
with open(filename, 'r') as f:
    part = MIMEApplication(f.read(), Name=basename(filename))

part['Content-Disposition'] = 'attachment; filename="{}"'.format(basename(filename))
msg.attach(part)

user = 'username'
password = 'password'

with smtplib.SMTP("smtp.mailtrap.io", 2525) as server:

    server.login(user, password)
    server.sendmail(sender, receiver, msg.as_string())
    print("Successfully sent email")

该示例将带有文本文件附件的电子邮件发送到Mailtrap。

filename = 'words.txt'
with open(filename, 'r') as f:
    part = MIMEApplication(f.read(), Name=basename(filename))

我们读取了文本文件的内容。

part['Content-Disposition'] = 'attachment; filename="{}"'.format(basename(filename))
msg.attach(part)

附件是用attach方法添加的。

带有STARTTLS的邮件陷阱

Mailtrap不支持任何SMTP端口上的SSL,它仅支持STARTTLS。如果我们尝试使用SSL,我们会收到以下错误消息:

ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1045)

所谓的机会型TLS(传输层安全)是纯文本通信协议的扩展。它提供了一种将纯文本连接升级为加密(TLS或SSL)连接的方法,而不是使用单独的端口进行加密通信。为此,一些协议使用名为STARTTLS的命令。它的主要目的是作为被动监控的对策。

#!/usr/bin/python

import smtplib

from email.mime.text import MIMEText

port = 465

sender = 'admin@example.com'
receiver = 'info@example.com'

msg = MIMEText('Secured test mail')

msg['Subject'] = 'Test mail'
msg['From'] = 'admin@example.com'
msg['To'] = 'info@example.com'

user = 'username'
password = 'password'

with smtplib.SMTP("smtp.mailtrap.io", port) as server:

    server.starttls() # Secure the connection

    server.login(user, password)
    server.sendmail(sender, receiver, msg.as_string())
    print("mail successfully sent")

该示例使用机会性TLS向Mailtrap帐户发送电子邮件。

server.starttls() # Secure the connection

starttls将与SMTP服务器的连接置于TLS模式。

通过SSL发送邮件

以下示例通过SSL发送电子邮件。使用虚拟主机SMTP服务器(来自websupport.sk)。

#!/usr/bin/python

import smtplib, ssl
from email.mime.text import MIMEText

sender = 'admin@example.com'
receivers = ['info@example.com']

port = 465
user = 'admin@example.com'
password = 'password'

msg = MIMEText('This is test mail')

msg['Subject'] = 'Test mail'
msg['From'] = 'admin@example.com'
msg['To'] = 'info@example.com'

context = ssl.create_default_context()

with smtplib.SMTP_SSL("smtp.websupport.sk", port, context=context) as server:

    server.login(user, password)
    server.sendmail(sender, receivers, msg.as_string())
    print('mail successfully sent')

SMTP_SSL通过SSL加密套接字连接。

在本教程中,我们使用了Pythonsmtplib模块来发送电子邮件。

列出所有Python教程。

未经允许不得转载:我爱分享网 » Python smtplib

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏