如何通过Yandex SMTP发送电子邮件(使用C# ASP.NET)

8

以前,我使用我的服务器作为邮件主机,并通过自己的主机发送电子邮件。现在,我使用Yandex作为我的邮件服务器。我正在尝试通过Yandex SMTP发送电子邮件。但是,我无法实现它。每次都会出现“操作超时”的消息。当我使用Thunderbird时,我可以使用相同的设置发送和接收电子邮件。因此,帐户没有问题。感谢您的指导。您可以在下面看到我的代码:

EmailCredentials credentials = new EmailCredentials();
credentials.Domain = "domain.com";
credentials.SMTPUser = "email@domain.com";
credentials.SMTPPassword = "password";
int SmtpPort = 465;
string SmtpServer = "smtp.yandex.com";

System.Net.Mail.MailAddress sender = new System.Net.Mail.MailAddress(senderMail, senderName, System.Text.Encoding.UTF8);

System.Net.Mail.MailAddress recipient = new System.Net.Mail.MailAddress(recipientEmail, recipientName, System.Text.Encoding.UTF8);

System.Net.Mail.MailMessage email = new System.Net.Mail.MailMessage(sender, recipient);

email.BodyEncoding = System.Text.Encoding.UTF8;
email.SubjectEncoding = System.Text.Encoding.UTF8;

System.Net.Mail.AlternateView plainView = System.Net.Mail.AlternateView.CreateAlternateViewFromString(System.Text.RegularExpressions.Regex.Replace(mailBody, @"<(.|\n)*?>", string.Empty), null, MediaTypeNames.Text.Plain);

System.Net.Mail.AlternateView htmlView =  System.Net.Mail.AlternateView.CreateAlternateViewFromString(mailBody, null, MediaTypeNames.Text.Html);

email.AlternateViews.Clear();
email.AlternateViews.Add(plainView);
email.AlternateViews.Add(htmlView);
email.Subject = mailTitle;

System.Net.Mail.SmtpClient SMTP = new System.Net.Mail.SmtpClient();
SMTP.Host = SmtpServer;
SMTP.Port = SmtpPort;
SMTP.EnableSsl = true;
SMTP.Credentials = new System.Net.NetworkCredential(credentials.SMTPUser, credentials.SMTPPassword);

SMTP.Send(email);

你是否正在使用名为“首先通过pop3进行身份验证”的设置? - Uwe Hafner
你是否有一个防火墙,它阻止了你的代码到外部的访问? - Uwe Hafner
1
@Uwe 我不使用“首先使用pop3进行身份验证”或任何与pop3相关的内容。我在服务器上安装了防火墙。我检查了出站规则的设置。我发现TCP端口仅定义为25、110、143、587。它没有465。我将添加它并再次尝试。但是,该代码在我的本地计算机上也无法工作。 - Nedim
在设置凭据之前,请尝试:SMTP.UseDefaultCredentials = false。 - Uwe Hafner
3个回答

20

经过多次试验和错误,我已经找到了如何使它工作的方法。我在问题中发布的代码上做出了以下更改:

  • 将SmtpPort设置为587
  • 添加了以下两行代码:

    SMTP.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network; SMTP.UseDefaultCredentials = false;

额外说明: 我使用的是Azure服务器。后来我意识到我没有为465端口配置smtp端点。也就是说,我必须添加上面的2行代码才能使电子邮件传递正常工作,仅更改端口是不够的。我的意思是,在进一步操作之前,检查Azure和防火墙上定义的端口是值得的。

通过从@Uwe以及在以下页面Yandex smtp settings with ssl上发布的@Dima-Babich,@Rail的帮助,我能够使我的代码工作。因此,我认为回答这个问题的荣誉应归功于他们。


1
谢谢兄弟。你救了我的一天,但我只尝试更改 SmtpPort = 587 而不是其他东西,它起作用了。不需要添加其他行,但我不知道。嗯,我不使用 Azure 服务器,所以如果您使用 Azure 服务器,则可能是正确的。我只是想分享一下。再次感谢。 :) - Kemal Can ÖZÇELİK

1
尝试使用端口25,而不是Yandex帮助中指定的465端口。我在https://habrahabr.ru/post/237899/上找到了这些信息。他们提到可能是由于SmtpClient实现了显式SSL模式。然后使用端口25建立未加密模式的连接,之后再切换到受保护模式。

2
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅链接的答案可能会失效。- 来自审查 - Enrique Moreno Tent
感谢您的解释。会添加更多细节。 - husky

0

我曾经遇到过同样的问题。 我通过进入Yandex邮件并更改一些设置来解决它。

步骤如下: 1- 进入设置。 2- 邮件客户端。 3- 设置所选的POP3设置即可。


1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - MD. RAKIB HASAN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接