Python实战:借助Mailtrap SMTP与电子邮件API实现邮件发送功能

译文 精选
开发 后端
简单邮件传输协议(SMTP)是一种广泛应用于各类应用程序和网站,用于发送电子邮件的标准协议。而 Mailtrap 则是一款专门设计的电子邮件投递平台,其目标在于实现高邮件投递成功率。

译者 | 刘涛

审校 | 重楼

在本教程中,我将引导逐步深入了解在Python环境中使用两种不同方式发送电子邮件的具体流程

  • 基于传统SMTP方式:利用 Python 内置的“smtplib”模块,按照传统的 SMTP 配置方式来发送电子邮件。
  • 基于Mailtrap方式:通过使用Mailtrap提供的官方 SDK,调用其API来实现电子邮件的发送功能。

如果对上述工具及相关工作流程尚不熟悉,在此简单介绍一下:简单邮件传输协议(SMTP)是一种广泛应用于各类应用程序和网站,用于发送电子邮件的标准协议。而 Mailtrap 则是一款专门设计的电子邮件投递平台,其目标在于实现高邮件投递成功率。该平台不仅配备了一系列聚焦于业务增长的实用功能,还拥有业内领先水平的分析工具,能够为用户提供全面且深入的邮件投递数据洞察。

在本文结尾,将了解如何将发送电子邮件的功能集成到Python项目中,并在实际场景中使用Mailtrap实现可靠的电子邮件投递。

目录

  • “smtplib”设置
  • 如何使用Mailtrap SMTP发送电子邮件
  • 如何使用Mailtrap电子邮件API发送电子邮件
  • 总结

“smtplib”设置

若要开启使用Python发送电子邮件的操作,我们首先学会运用内置的 “smtplib”模块。此模块具备强大功能,能够让你的程序连接至SMTP服务器,进而直接从应用程序中发送电子邮件。

第一步,请使用以下语句导入“smtplib”模块:

import smtplib
  • 1.

接下来,创建一个“SMTP”对象,该对象的作用是对与SMTP服务器的连接进行配置。在后续的操作中,这个对象将负责处理电子邮件的发送任务。

smtpObj = smtplib.SMTP(host, port)
  • 1.
  • “host”指的是SMTP服务器端点,比如“live.smtp.mailtrap.io”这类具体的服务器地址
  • “port”指的是服务器使用的通信端口。通常推荐使用587端口该端口用于通过TLS加密方式安全地发送电子邮件。

专业提示:“SMTP对象包含一个名为“sendmail”的实例对象。该对象带有三个参数,其中每个参数均为字符串类型(需注意,“”receivers“” 这个参数是一个字符串列表)。

smtpObj.sendmail(sender, receivers, message)
  • 1.

若要确认“smtplib”模块是否已正确导入,同时查看参数和类的完整描述信息,可运行以下命令:

help(smtplib)
  • 1.

如何使用Mailtrap SMTP发送电子邮件

此方法需要设置你从Mailtrap获取的自定义SMTP凭证。

重要提示:

  • 使用 Mailtrap 的虚拟域名测试服务:若你希望试用 Mailtrap,无需即刻对你的域名进行验证。你可以使用 Mailtrap 提供的虚拟域名(在注册时即可获得访问权限)。使用该虚拟域名,你能够模拟电子邮件的发送过程,而无需担忧DNS记录相关问题。这种方式十分适合用于测试Mailtrap服务,并深入熟悉其各项功能。
  • 生产环境中的域名验证:倘若你计划向收件人发送真实有效的邮件,那么就必须对你的域名进行验证。这一过程要求你在域名提供商的DNS设置中添加诸如 SPF、DKIM和DMARC等DNS记录。这些记录对于确保邮件能够成功投递至关重要,同时还有助于防范网络钓鱼以及伪造邮件等安全风险。在接下来的部分内容中,我将为你详细展示如何在域名提供商的控制面板中完成这些设置操作。

验证发件域名(SPF/DKIM和DMARC)

DNS 记录在确保电子邮件成功投递方面起着关键作用,诸如Gmail(谷歌邮箱)和雅虎等邮箱提供商均要求进行 DNS 认证。

在详细介绍操作方法之前,我们先对每种记录类型进行回顾,以便你深入理解它们的重要性:

  • SPF(发件人策略框架):此记录的作用是协助邮件服务器判定发件人的 IP 地址是否被授权使用你的域名发送邮件。通俗来讲,添加 SPF 记录能够有效阻止垃圾邮件发送者冒用你的域名发送邮件,从而保障你的域名安全和邮件发送的合法性。
  • DKIM(域名密钥识别邮件):DKIM使用加密技术对发件人的域名进行验证,同时确保邮件内容在传输过程中未被篡改。该技术为你的邮件提供了可靠的防伪保护,增强了邮件的可信度和安全性。
  • DMARC(基于域名的消息认证、报告与一致性):DMARC将SPF和DKIM的功能相结合,不仅制定了针对未经身份验证的电子邮件的处理策略,还能够对邮件活动进行详细报告。通过 DMARC,你可以更好地掌控以你域名发送的邮件的安全性,确保邮件传输的合规性和可靠性。

以下是添加这些记录的具体步骤:

  • 首先,你需要访问域名提供商的DNS设置。一般而言,你可以在域名注册平台或域名管理设置板块中找到该入口。例如,在GoDaddy平台(注:GoDaddy是一家知名的网络托管公司和域名注册商,提供多种互联网服务)上,该入口被命名为“管理 DNS”,其他域名提供商的相关入口名称虽有所不同,但功能类似。
  • 接下来,将 Mailtrap 提供的 DNS 记录(通过复制粘贴的方式)添加至你域名提供商的 DNS 设置中。需要注意的是,Mailtrap提供的记录是经过精心设置的,其中SPF记录已预先解析完成。因此,你无需进行额外的创建操作,直接添加这些记录即可完成相应配置。

  • 最后,你可以通过Mailtrap查看记录的状态。

以下展示的是使用Python通过Mailtrap发送电子邮件的最简脚本。出于安全方面的考量,在该脚本中,用户名和密码部分采用了占位符(SMTP 服务器端点和端口除外)。

当运行此脚本时,请务必将这些占位符替换为你实际的Mailtrap凭证,以确保电子邮件能够成功发送。

import smtplib
from email.mime.text import MIMEText

# Configuration
port = 587
smtp_server = "live.smtp.mailtrap.io"
login = "api" # Your login generated by Mailtrap
password = "1a2b3c4d5e6f7g" # Your password generated by Mailtrap

sender_email = "mailtrap@example.com"
receiver_email = "new@example.com"

# Plain text content
text = """\
Hi,
Check out the new post on the Mailtrap blog:
SMTP Server for Testing: Cloud-based or Local?
https://blog.mailtrap.io/2018/09/27/cloud-or-local-smtp-server/
Feel free to let us know what content would be useful for you!
"""

# Create MIMEText object
message = MIMEText(text, "plain")
message["Subject"] = "Plain text email"
message["From"] = sender_email
message["To"] = receiver_email

# Send the email
with smtplib.SMTP(smtp_server, port) as server:
 server.starttls() # Secure the connection
 server.login(login, password)
 server.sendmail(sender_email, receiver_email, message.as_string())
print(“”Sent“”)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.

在该脚本中:

  • 从 Python 标准库中导入了 smtplib 和 MIMEText 这两个模块。其中,smtplib 模块用于实现与 SMTP 服务器的交互,完成邮件发送相关操作;MIMEText 模块则用于处理邮件内容的格式。
  • 正如前文所提及的,针对 SMTP 服务器的配置,需要使用自己的凭证对相关部分进行更新。不过,服务器端点和端口这两个参数保持不变,它们是连接到特定邮件服务器的固定标识。
  • 鉴于这是一个旨在展示基本功能的最简脚本,这里仅使用了包含 “plaintext”纯文本 格式的 MIMEText 来构建邮件内容。实际上,该脚本具备良好的扩展性,能够很方便地通过重构,使用MIMEMultipart 模块来同时处理 “plaintext” 和 “HTML” 格式的邮件内容。若想了解具体的实现方式,可跳转到下面的快速教程部分查看。
  • 在执行发送电子邮件的操作时,选用了 with 语句(即上下文管理器)。旨在确保邮件成功发送之后,能够立即关闭与 SMTP 服务器的连接。通过这种方式,可以有效避免资源的浪费以及可能出现的连接异常问题,保障系统的稳定性和资源的合理利用。

安全提示

在编写发送邮件的脚本时,切勿将服务器信息和登录凭证直接硬编码到脚本中。当为生产环境配置脚本时,务必使用环境变量来存储这些敏感信息。这样做不仅能够增强代码的安全性,降低信息泄露的风险,还能使代码在不同开发阶段之间迁移时更加灵活。代码如下:

import os

smtp_server = os.getenv("SMTP_SERVER","default.smtp.server")
login = os.getenv("SMTP_LOGIN")
password = os.getenv("SMTP_PASSWORD")

# Example usage in an SMTP connection setup
# smtp.login(login, password)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

请注意,在运行脚本之前,需要在操作系统中设置变量。

重构脚本以使用HTML邮件

HTML邮件能够显著提升用户体验。使用HTML 技术,可以在邮件中嵌入格式化文本、图片、表格、可点击链接以及自定义样式等丰富元素。这一特性在营销邮件、时事通讯,以及任何对设计和品牌形象有较高要求的通信场景中,都具有极高的实用价值。

因此,若要对脚本进行重构以支持 HTML 邮件,需要导入MIMEMultipartMIMEText这两个模块。通过这种方式,不仅能够精心自定义HTML格式的邮件内容,还能在收件人的设备或邮件客户端无法正常打开HTML邮件时,提供纯文本版本作为备用选项,确保邮件信息能够准确传达给收件人。

以下为修改后的脚本:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# Configuration
smtp_server = "live.smtp.mailtrap.io"
port = 587
login = "api" # Mailtrap login
password = "1a2b3c4d5e6f7g" # Mailtrap password
sender_email = "mailtrap@example.com"
receiver_email = "new@example.com"
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = "HTML Email"
# Add plain text content (optional, for email clients that don“”t render HTML)
message.attach(MIMEText("This is a plain text version of the email.", "plain"))
# Add HTML content
html_content = """\
<html>
 <body>
 <h1>Welcome to Mailtrap!</h1>
 <p>This is an example of an HTML email.</p>
 </body>
</html>
"""
message.attach(MIMEText(html_content, "html"))
# Send the emailwith smtplib.SMTP(smtp_server, port) as server:
 server.starttls()
 server.login(login, password)
 server.sendmail(sender_email, receiver_email, message.as_string())
print(“”Sent“”)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.

最后,我提供了关于SMTP方法的视频讲解。如果觉得通过视频了解相关内容更符合的习惯,欢迎随时查看。

https://www.youtube.com/watch?v=ufLpTc9up8s&t=1s。

如何使用Mailtrap电子邮件API发送电子邮件

不满足于仅使用 SMTP 方式发送电子邮件,而是期望将Mailtrap的电子邮件 API 集成到自己的 Python 应用程序中,本节内容将详细为介绍具体操作方法。

Mailtrap 的 SMTP 电子邮件API具备诸多优势,它不仅能够使更高效地发送电子邮件,还为整个邮件发送流程增添了灵活性与可扩展性。在着手进行集成操作之前,请务必确保在 Mailtrap 平台上拥有一个已经过验证的发件域名,同时准备好用于验证请求的Mailtrap API令牌。

需要注意的是:接下来我将着重介绍如何使用 Mailtrap 官方的Python软件开发工具包(SDK)来完成 API 集成工作。

那么,第一步,请使用以下命令安装官方 SDK。

pip install mailtrap
  • 1.

前提条件:请确保的 Python 包版本为 3.6 或更高。

在成功安装软件开发工具包(SDK)之后,接下来的步骤是创建一个 Mail 对象。此对象将用于代表即将发送的电子邮件,其中会涵盖发件人、收件人、主题以及邮件内容等关键信息。

import mailtrap as mt
# Create the mail object
mail = mt.Mail(
 sender=mt.Address(email="mailtrap@example.com", name="Mailtrap Test"), # Sender info
 to=[mt.Address(email="your@email.com")], # Recipient info
 subject="You are awesome!", # Email subject
 text="Congrats for sending a test email with Mailtrap!" # Email content (plain text))
# Create a client using your API key
client = mt.MailtrapClient(token="your-api-key")
# Send the email
client.send(mail)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

快速说明:.

  • 发件人与收件人:需要明确指定发件人的电子邮件地址,此地址必须与已验证的域名相匹配。同理,收件人的电子邮件地址也需准确设定。
  • 主题与文本内容:需设置电子邮件的主题以及纯文本内容。后续将会提及,同样能够添加HTML格式的内容。
  • 客户端与发送:利用的Mailtrap API令牌对“MailtrapClient”进行初始化操作,该令牌用于对 API 请求进行验证。然后在客户端调用“send”方法,并将“mail”对象作为参数传入。若要使用 Mailtrap API令牌创建客户端,可在 Mailtrap 中按照以下路径进行操作:
• Settings > API Tokens > Add Token
  • 1.

这样,可以使用以下命令发送电子邮件:

# create client and send
client = mt.MailtrapClient(token="your-api-key")
client.send(mail)
  • 1.
  • 2.
  • 3.

最后,以下为使用Python SDK 发送基本“纯文本”电子邮件的SDK脚本。

from mailtrap import Mail, Address, MailtrapClient
# Create a Mail object with basic details for a plain text email
mail = Mail(
 # Specify the sender“”s email address and optional name
 sender=Address(email="mailtrap@example.com", name="Mailtrap Test"),
 # Specify one or more recipients; here we use a list with a single recipient
 to=[Address(email="your@email.com", name="Your Name")],
 # Subject of the email
 subject="Simple Plain Text Email",
 # The plain text content of the email
 text="This is a plain text email sent using the Mailtrap SDK. Simple and straightforward.",
 # Optional: categorize this email for easier sorting or management in the Mailtrap service
 category="Test",
 # Optional: Additional headers can be specified, but are not required for plain text emails
 headers={"X-Example-Header": "HeaderValue"})
# Initialize the MailtrapClient with your API token
client = MailtrapClient(token="your-api-key")
# Send the email using the client“”s send method
client.send(mail)
print("Plain text email sent successfully.")
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

在该脚本中:

  • 考虑到此次要发送的是纯文本消息,因此所导入的类有MailtrapClientMail 以及Address
  • Mail对象包含以下部分:

a.构造函数:即用于创建对象的Mail构造函数。

b.发件人信息:Sender”字段,使用“Address类来定义发件人的姓名和电子邮件地址

c.收件人信息:to字段在通常情况下可以是一个由Address对象构成的列表。不过由于这里是一封纯文本电子邮件,所以它一般直接包含收件人信息,而非以列表形式呈现。

d.主题:电子邮件的主题,通过subject字段表示

e.邮件内容:text字段,其中包含了电子邮件的内容,且是以纯文本(“plaintext”)形式存在。

f.可选字段:headerscategory,这两个字段属于可选设置,合理使用它们有助于更高效地管理电子邮件。

g.客户端创建与验证:利用 API 令牌创建MailtrapClient,并完成相应的验证工作。

h.邮件发送:调用MailtrapClientsend方法,将mail对象作为参数传入,以此来实现电子邮件的发送操作。

i.操作确认:打印“Plain text email sent successfully.(纯文本电子邮件发送成功” 这一消息,用于确认电子邮件发送操作已成功完成。

  • 电子邮件的发送流程如下:

重构脚本以包含 HTML 和附件

同样地,使用MIMEMultipart类对脚本进行重构,从而实现更为复杂的电子邮件结构,则会变得非常简单

以下展示的是重构后的代码:

import mailtrap as mt
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# Create a multipart email message
message = MIMEMultipart()
message["Subject"] = "HTML Email"

# Plain text version (for email clients that don“”t support HTML)
message.attach(MIMEText("This is the plain text version.", "plain"))

# HTML version
html_content = """\
<html>
 <body>
 <h1>Welcome to Mailtrap!</h1>
 <p>This is an HTML email with some <b>bold text</b> and a <a href="https://example.com">link</a>.</p>
 </body>
</html>
"""
message.attach(MIMEText(html_content, "html"))

client = mt.MailtrapClient(token="your-api-key")

# Now send the email with Mailtrap“”s API
mail = mt.Mail(
 sender=mt.Address(email="mailtrap@example.com", name="Mailtrap Test"),
 to=[mt.Address(email="your@email.com")],
 subject="You are awesome!",
 html=message.as_string() # Pass the HTML content as a string)
client.send(mail)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.

生产环境设置

在详细探讨具体设置细节之前,在此提醒一些安全方面的最佳实践:

  • 安全存储 API 密钥和凭证:在生产环境下,切勿将 API 密钥、电子邮件登录凭证或其他诸如机密信息这类敏感数据,直接硬编码到源代码中。一旦发生这样操作,的应用程序将面临极大的安全风险。
  • 使用环境变量:采用这种方式,不仅能够有效保障凭证的安全性,还能让在不同的配置环境(例如开发环境、预发布环境【staging:指的是在正式生产环境之前的一个测试环境。它是软件开发过程中的一个阶段,用于模拟生产环境,进行最终的测试和验证】以及生产环境)之间轻松实现切换。

接下来为介绍具体的设置方法:

  • 使用“python - dotenv”包从“.env”文件中加载环境变量使用以下命令安装该库: pip install python-dotenv
  • 在项目的根目录下创建一个名为“.env”的文件,用于安全地存储环境变量。该文件会存放诸如的 Mailtrap API 密钥、登录凭证以及 SMTP 服务器详细信息等敏感信息。以下为一个示例:
SMTP_SERVER=smtp.mailtrap.io
 SMTP_PORT=587
 SMTP_LOGIN=your_mailtrap_login
 SMTP_PASSWORD=your_mailtrap_password
 MAILTRAP_API_KEY=your_mailtrap_api_key
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

重要提示:确保此.env文件永远不会推送到版本控制系统(如Git)添加到你项目里.gitignore”文件,以此避免敏感信息因意外情况而被暴露

  • 在创建好“.env”文件之后,需要将其中的变量加载到Python脚本中。具体操作是,在脚本的顶部位置,导入“dotenv”包,然后调用“load_dotenv()”函数,以此来实现环境变量的加载。
from dotenv import load_dotenv
 import os
 
 # Load environment variables from the .env file
 load_dotenv()
 
 # Retrieve environment variables securely
 smtp_server = os.getenv("SMTP_SERVER")
 smtp_port = os.getenv("SMTP_PORT")
 smtp_login = os.getenv("SMTP_LOGIN")
 smtp_password = os.getenv("SMTP_PASSWORD")
 mailtrap_api_key = os.getenv("MAILTRAP_API_KEY")
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 完成环境变量的加载后,便能够将脚本中原本硬编码的凭证替换为这些环境变量。以下为一个示例:
import smtplib
 from email.mime.text import MIMEText
 from dotenv import load_dotenv
 import os

 # Load environment variables
 load_dotenv()

 # Fetching SMTP credentials from environment variables
 smtp_server = os.getenv("SMTP_SERVER")
 smtp_port = os.getenv("SMTP_PORT")
 smtp_login = os.getenv("SMTP_LOGIN")
 smtp_password = os.getenv("SMTP_PASSWORD")

 sender_email = "mailtrap@example.com"
 receiver_email = "new@example.com"
 subject = "Plain text email"
 text = """\
 Hi,
 Check out the new post on the Mailtrap blog:
 https://blog.mailtrap.io/2018/09/27/cloud-or-local-smtp-server/
 """

 # Create MIMEText object
 message = MIMEText(text, "plain")
 message["Subject"] = subject
 message["From"] = sender_email
 message["To"] = receiver_email

 # Send email using environment variables
 with smtplib.SMTP(smtp_server, smtp_port) as server:
 server.starttls() # Secure the connection
 server.login(smtp_login, smtp_password)
 server.sendmail(sender_email, receiver_email, message.as_string())

 print("Email sent successfully!")
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.

专业提示

首先,务必保证环境变量仅能被授权用户访问。在生产服务器环境下,通常表示仅通过部署配置来设定对环境变量的访问权限(例如,使用 Heroku 的配置变量、AWS Secrets Manager,或者其他基于云的机密管理工具来实现)。

其次,建议在开发、预发布以及生产环境中使用不同的环境变量。这样做能够有效确保生产环境与开发流程中的其他阶段相互隔离,进而为生产环境提供更妥善的保护。

一旦在本地完成环境变量的配置,接下来就需要将应用程序部署到生产环境中。在此过程中,一定要在生产服务器或服务里设置相同的环境变量。

倘若计划将应用程序部署到诸如 Heroku、AWS或者谷歌云这类平台,可以使用这些平台各自提供的环境变量管理工具,安全地存储和访问机密信息,由此一来便无需手动管理“.env”文件。

总结

这个快速教程为提供了充足的内容以帮助使用Python发送电子邮件。需要注意的是,上述脚本具备进一步扩展的空间,能够涵盖 HTML 格式内容、多个收件人、附件、图片等更多功能。

倘若对这方面内容感兴趣,或者希望了解更多安全提示与最佳实践相关知识,可访问 Mailtrap 博客,获取更为详尽的教程。

译者介绍

刘涛,51CTO社区编辑,某大型央企系统上线检测管控负责人。

原文标题:How to Send Emails in Python using Mailtrap SMTP and the Email API,作者:Alex Tray

责任编辑:姜华 来源: 51CTO
相关推荐

2022-10-24 10:05:41

电子邮件协议SMTPIMAP

2011-10-31 09:35:50

2022-07-08 08:07:14

SpringJavaMail

2011-08-01 11:11:55

2020-02-26 13:47:57

Emacs电子邮件开源

2010-06-10 14:10:58

安全电子邮件协议

2009-10-14 10:10:05

2018-06-28 16:19:09

2011-08-01 12:43:03

2010-05-21 15:27:39

GoogleGmail

2009-05-21 10:07:43

谷歌电子邮件自动翻译

2020-05-25 14:32:42

Python电子邮件自动化

2010-09-09 17:11:32

2010-09-15 14:14:50

2021-06-16 10:56:32

电子邮件电子邮件攻击BEC

2009-12-16 11:47:24

赛门铁克垃圾邮件电子邮件

2013-04-17 11:11:28

2009-01-16 09:08:00

2009-02-17 09:49:38

邮件归档备份归档归档即服务

2009-12-17 11:38:05

点赞
收藏

51CTO技术栈公众号