如何直接从代码发送电子邮件(无需服务器)

mon*_*nty 0 c# email smtp .net-core .net-core-2.0

每次我用谷歌搜索或在这里搜索“如何发送电子邮件”时,我都会得到如下结果:使用 smtp 客户端,连接到 smtp 服务器,通过 smtp 服务器发送邮件

我正在寻找服务器如何将电子邮件发送到其他服务器的代码(或想法)。所以上面链接中的方法对我来说不起作用。

有什么提示 smtp 服务器库会做什么吗?

Evk*_*Evk 7

首先,您需要找出每个电子邮件收件人的 SMTP 服务器地址。您可以通过查询收件人域的 DNS 中的 MX 记录来完成此操作。在 .NET 中,您可以使用库来做到这一点ARSoft.Tools.Net

var resolver = new DnsStubResolver();
var records = resolver.Resolve<MxRecord>("gmail.com", RecordType.Mx);
foreach (var record in records.OrderByDescending(c => c.Preference)) {
    Console.WriteLine(record.ExchangeDomainName + " : " + record.Preference);
}  
Run Code Online (Sandbox Code Playgroud)

每个 MX 记录都有偏好值,您应该按偏好顺序尝试它们(首先是最高的,如果不可用,则选择下一个,依此类推)。

现在,当您知道目标 SMTP 服务器的地址时 - 您可以连接到它(通常在端口 25 上,或者如果您想使用加密连接 - 在端口 465 上)并执行常规 SMTP 对话(smtp 是文本协议),例如:

HELO < you start conversation
250 OK < server lets you proceed
MAIL FROM: <someuser@somedomain.com>
250 OK < server is fine with this sender
RCPT TO: <someuser@targetdomain.com>
250 OK < server is fine with recipient
DATA < you are going to send email body
250 OK < server is fine with that - proceed
Here you send your message 
250 OK < server accepted message
QUIT
Run Code Online (Sandbox Code Playgroud)

有一些库能够在 .NET 中执行所有这些操作(MX 发现、SMTP 对话等),例如 MailBee(非免费)。我只使用了提到的库,所以不知道是否有免费的库。

现在,虽然看起来很容易,但实际上它不会像我描述的那么顺利。

目标 SMTP 服务器将对您的 IP 地址、发件人域和邮件内容执行一系列检查。例如,当您执行以下操作时:

MAIL FROM: <someuser@somedomain.com>
Run Code Online (Sandbox Code Playgroud)

大多数不错的 SMTP 服务器都会执行反向 DNS 检查,以确保发件人的域与您发送电子邮件的 IP 相关。要通过该检查,您当然应该拥有目标域 ( somedomain.com) 并在那里放置特定的 DNS 记录。

大多数 SMTP 服务器会在第一次发送时将您列入“灰名单”。这意味着他们会拒绝您的电子邮件,但鼓励您稍后再试。因此,您无法在不存储电子邮件的情况下发送电子邮件,因为在很多情况下 - 需要多次尝试才能成功发送电子邮件。

SMTP 服务器执行更多检查(例如不同类型的签名),因此需要付出一些努力才能使这项工作可靠。

由于上述原因 - 大多数人不会实现自己的 SMTP 服务器,而是将所有上述工作中继到现有的 SMTP 服务器。

总而言之 - 可以执行直接发送到目标 SMTP 服务器的操作,但通过 Web API 简单地执行此操作不会可靠地工作。您需要为此目的设置一个服务,正确配置它(不是微不足道的)并将消息存储在某个地方(在数据库中),因为可能需要多次重试。