每次我谷歌或在这里搜索“如何发送电子邮件”我得到结果like: use an smtp client, connect to a smtp server, send the mail over the smtp server。
我正在寻找代码(或想法)它自己如何将电子邮件发送到其他服务器的服务器。因此,上述链接的方法对我不起作用。
任何暗示smtp服务器库会做什么?
答案 0 :(得分:4)
首先,您需要为电子邮件的每个收件人找到SMTP服务器的地址。您可以通过查询MX记录的收件人域DNS来实现此目的。在.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);
}
每个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服务器都会有#34;灰名单&#34;你在第一次发送。这意味着他们会拒绝您的电子邮件,但建议您稍后再试。因此,您无法在不存储电子邮件的情况下发送电子邮件,因为在许多情况下 - 需要多次尝试才能成功发送您的电子邮件。
SMTP服务器执行的检查还有很多(例如,不同类型的签名),因此需要付出一些努力才能使这项工作可靠地运行。
由于上述原因 - 大多数人没有实现自己的smtp服务器,而是将所有上述工作中继到现有的SMTP服务器。
总结一下 - 它可以直接发送到目标SMTP服务器,但是从你的web api那天天真地做到这一点并不能可靠地工作。您需要为此目的设置服务,正确配置它(并非简单)并在某处(在数据库中)存储消息,因为可能需要重试几次。
答案 1 :(得分:0)
要可靠发送电子邮件,您需要一台服务器。期。如果你自己没有或想要一个云服务,你可以使用像SendGrid这样的云服务。
需要smtp服务器,否则:
关于我听的原因的一些背景阅读材料: https://superuser.com/questions/1006079/why-do-i-need-an-smtp-server