我迫切需要帮助解决这个问题。如何让我部署的应用程序通过 SMTP 将电子邮件发送到任何地址?
我正在 Visual Studio 2015 (ASP.NET MVC) 中开发基于 Web 的销售跟踪应用程序。该网站将托管在 Arvixe BusinessClass for Windows 共享服务器上。服务器的域是 mydomain.com,但该域实际上由 one.com 托管,该网站还提供 mydomain.com 电子邮件。
该网站的功能之一是当用户报告销售时通知直线经理。将通过电子邮件通知直线经理。我尝试发送邮件的电子邮件帐户由 one.com 提供。
使用 System.Net.Mail.MailMessage 并通过 SmtpClient 发送,以下代码可以在我的开发环境(Windows 10 专业版)中运行,但未部署(部署在 Windows 共享服务器环境的 Arvixe BusinessClass 上):
MailMessage message = new MailMessage();
message.To.Add("[email protected] /cdn-cgi/l/email-protection");
message.From = new MailAddress("[email protected] /cdn-cgi/l/email-protection", "[email protected] /cdn-cgi/l/email-protection");
message.IsBodyHtml = true;
message.Subject = "Subject";
message.Body = "Body<br />";
SmtpClient client = new SmtpClient();
client.DeliveryFormat = SmtpDeliveryFormat.SevenBit;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Host = "send.one.com";
client.Port = 587;
client.UseSSL = true;
client.Credentials = new NetworkCredential("[email protected] /cdn-cgi/l/email-protection", "***");
client.Send(message);
在我的 Arvixe 服务器上,我收到错误:
"Unable to read data from the transport connection: net_io_connectionclosed".
使用此代码,我还尝试了端口 465 和 25,SSL 设置为 true 和 false,并且还托管“mailout.one.com”,但没有成功。
我放弃了并尝试使用 MailKit 并使用以下代码:
MimeMessage message = new MimeMessage();
message.To.Add(new MailboxAddress("[email protected] /cdn-cgi/l/email-protection"));
message.From.Add(new MailboxAddress("[email protected] /cdn-cgi/l/email-protection", "[email protected] /cdn-cgi/l/email-protection"));
var bodyBuilder = new BodyBuilder();
bodyBuilder.HtmlBody = "htmlbody<br />";
bodyBuilder.TextBody = "textbody";
message.Body = bodyBuilder.ToMessageBody();
message.Subject = "Subject";
using (var client = new SmtpClient())
{
client.ServerCertificateValidationCallback = (s, c, h, e) => true;
client.Connect("send.one.com", 587, MailKit.Security.SecureSocketOptions.StartTls);
client.Authenticate("[email protected] /cdn-cgi/l/email-protection", "***");
client.Send(message);
client.Disconnect(true);
}
同样,它在我的开发环境中有效,但在生产中无效。我在这里得到错误:
"The operation is not allowed on non-connected sockets".
值得注意的是,如果我将主机更改为 127.0.0.1 并添加[email protected] /cdn-cgi/l/email-protection
Arvixe 中的电子邮件帐户和连接的用户帐户,但仅适用于外部电子邮件地址。以 mydomain.com 结尾的地址显然会被重新路由回服务器本身,因为服务器的域是 mydomain.com,但由于电子邮件提供商是 one.com 而不是 Arvixe 服务器,因此电子邮件无法通过。
我尝试过但没有成功的其他事情:
- 设置 mydomain.com 的 SPF 记录以包含我的服务器地址和我的服务器 IP 地址。
- 使用不同域上的 Office365 帐户进行发送(主机“smtp.office365.com”)
我迫切需要帮助解决这个问题。如何让我部署的应用程序通过 SMTP 将电子邮件发送到任何地址?
Arvixe/One.com 建议(来自支持票证和实时聊天):
- 必须使用 SMTP 身份验证。
- 必须使用本地邮件服务器或本地主机通过 Web 脚本发送电子邮件。 (尝试 xxx.win.arvixe.com、localhost 或 127.0.0.1 - 端口 25 或 26,或 xxxsecuremail.win.arvixe.com - 端口 465 以获取安全邮件)
- FROM 电子邮件地址和 SMTP 身份验证电子邮件地址必须是本地服务器上的本地用户。
如果您有自己的远程电子邮件服务器,并打算通过 Web 脚本向您的域本地的电子邮件地址发送电子邮件,则需要从本地服务器中删除该邮件域(我们必须这样做),并且您必须使用服务器本地另一个域的帐户来发送邮件。否则,任何发送到本地域的电子邮件都将在本地发送,而不是发送到您的远程服务器。