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

How to send an email directly from code (without server)

每次我 google 或在此处搜索 "how to send an email" 我都会得到结果 like: use an smtp client, connect to a smtp server, send the mail over the smtp server

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

任何提示 smtp 服务器库会做什么?

首先您需要找出每个电子邮件收件人的 SMTP 服务器地址。您可以通过查询收件人域的 DNS 来获取 MX 记录。在 .NET 中,您可以使用 ARSoft.Tools.Net library:

来做到这一点
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);
}  

每条 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

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

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

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

MAIL FROM: <someuser@somedomain.com>

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

大多数 SMTP 服务器会 "graylist" 您第一次发送。这意味着他们会拒绝您的电子邮件,但会鼓励您稍后再试。所以你不能在不存储的情况下发送电子邮件,因为在很多情况下 - 需要多次尝试才能成功发送你的电子邮件。

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

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

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

为了可靠 发送邮件你需要一个服务器。时期。如果您自己没有或不想要云服务,您可以使用 SendGrid 等云服务。

需要 smtp 服务器,否则:

  • 您需要自己对另一台服务器进行重试 向下
  • 大多数邮件服务器都有垃圾邮件检测机制,不会允许您的邮件
  • 您必须手动解析收件人邮件服务器。

关于我听的原因的一些背景阅读 material: https://superuser.com/questions/1006079/why-do-i-need-an-smtp-server

https://superuser.com/questions/753811/why-mail-clients-do-not-use-directly-the-smtp-server-of-recipient

https://superuser.com/questions/753811/why-mail-clients-do-not-use-directly-the-smtp-server-of-recipient