如何直接从代码发送电子邮件(无服务器)
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
每次我 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