发送电子邮件

尽管 Python 通过 smtplib 库发送电子邮件相对容易,但 Scrapy 提供了自己的电子邮件发送功能,该功能非常易于使用,并且使用 Twisted 非阻塞 IO 实现,以避免干扰爬虫的非阻塞 IO。它还提供了一个简单的 API 用于发送附件,并且配置非常简单,只需几个设置即可。

快速示例

有两种方法实例化邮件发送器。你可以使用标准的 __init__ 方法进行实例化

from scrapy.mail import MailSender

mailer = MailSender()

或者,你可以传递一个 scrapy.Crawler 实例进行实例化,这将遵循设置

mailer = MailSender.from_crawler(crawler)

以下是如何使用它发送电子邮件(不带附件)

mailer.send(
    to=["someone@example.com"],
    subject="Some subject",
    body="Some body",
    cc=["another@example.com"],
)

MailSender 类参考

MailSender 组件 是从 Scrapy 发送电子邮件的首选类,因为它像框架的其他部分一样使用 Twisted 非阻塞 IO

class scrapy.mail.MailSender(smtphost=None, mailfrom=None, smtpuser=None, smtppass=None, smtpport=None)[source]
参数:
  • smtphost (str or bytes) – 用于发送电子邮件的 SMTP 主机。如果省略,将使用 MAIL_HOST 设置。

  • mailfrom (str) – 用于发送电子邮件的地址(在 From: 头部)。如果省略,将使用 MAIL_FROM 设置。

  • smtpuser – SMTP 用户名。如果省略,将使用 MAIL_USER 设置。如果未给出,将不执行 SMTP 认证。

  • smtppass (str or bytes) – 用于认证的 SMTP 密码。

  • smtpport (int) – 要连接的 SMTP 端口。

  • smtptls (bool) – 强制使用 SMTP STARTTLS。

  • smtpssl (bool) – 强制使用安全的 SSL 连接。

send(to, subject, body, cc=None, attachs=(), mimetype='text/plain', charset=None)[source]

向指定的收件人发送电子邮件。

参数:
  • to (str or list) – 电子邮件收件人,可以是字符串或字符串列表。

  • subject (str) – 电子邮件的主题。

  • cc (str or list) – 抄送的电子邮件地址,可以是字符串或字符串列表。

  • body (str) – 电子邮件正文。

  • attachs (collections.abc.Iterable) – 一个包含元组 (attach_name, mimetype, file_object) 的可迭代对象,其中 attach_name 是一个字符串,表示电子邮件附件中显示的名称,mimetype 是附件的 mimetype,file_object 是一个可读的文件对象,包含附件的内容。

  • mimetype (str) – 电子邮件的 MIME 类型。

  • charset (str) – 电子邮件内容使用的字符编码。

邮件设置

这些设置定义了 MailSender 类的默认 __init__ 方法值,可用于在项目中配置电子邮件通知,而无需编写任何代码(对于使用 MailSender 的扩展和代码)。

MAIL_FROM

默认值:'scrapy@localhost'

发送电子邮件时使用的发件人电子邮件地址(From: 头部)。

MAIL_HOST

默认值:'localhost'

用于发送电子邮件的 SMTP 主机。

MAIL_PORT

默认值:25

用于发送电子邮件的 SMTP 端口。

MAIL_USER

默认值:None

用于 SMTP 认证的用户名。如果禁用,将不执行 SMTP 认证。

MAIL_PASS

默认值:None

用于 SMTP 认证的密码,与 MAIL_USER 一起使用。

MAIL_TLS

默认值:False

强制使用 STARTTLS。STARTTLS 是一种将现有非安全连接升级为使用 SSL/TLS 的安全连接的方式。

MAIL_SSL

默认值:False

强制使用 SSL 加密连接进行连接。