我有一个使用 VPC 在 Cloud Run 实例上运行的 .NET 应用程序,并且我一直在尝试实现一种使用 google SMTP 服务器发送电子邮件的方法。 我的公共 IP 在中继端已列入白名单。当我用 telnet 测试它时,继电器工作正常。 但是,尝试使用 MailKit 以及 .NET 邮件框架发送电子邮件失败了。
我的 MailKit 实现如下:
using (var client = new SmtpClient())
{
await client.ConnectAsync("my-host.gmail.com", 587, SecureSocketOptions.StartTls).ConfigureAwait(false);
await client.SendAsync(emailMessage).ConfigureAwait(false);
await client.DisconnectAsync(true).ConfigureAwait(false);
}
对于上述内容,我已尝试使用
client.SslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13;
以及端口 456 和所有可用的 Tls 选项。
错误始终如一:
An exception occurred while sending the email: MailKit.Net.Smtp.SmtpProtocolException: The SMTP server has unexpectedly disconnected. 2024-04-12 18:09:29.676 CEST at MailKit.Net.Smtp.SmtpStream.ReadAhead(CancellationToken cancellationToken) 2024-04-12 18:09:29.676 CEST at MailKit.Net.Smtp.SmtpStream.ReadResponse(CancellationToken cancellationToken) 2024-04-12 18:09:29.676 CEST at MailKit.Net.Smtp.SmtpStream.SendCommand(String command, CancellationToken cancellationToken) 2024-04-12 18:09:29.676 CEST at MailKit.Net.Smtp.SmtpClient.SendEhlo(Boolean connecting, String helo, CancellationToken cancellationToken) 2024-04-12 18:09:29.676 CEST at MailKit.Net.Smtp.SmtpClient.Ehlo(Boolean connecting, CancellationToken cancellationToken) 2024-04-12 18:09:29.676 CEST at MailKit.Net.Smtp.SmtpClient.PostConnect(Stream stream, String host, Int32 port, SecureSocketOptions options, Boolean starttls, CancellationToken cancellationToken) 2024-04-12 18:09:29.676 CEST at MailKit.Net.Smtp.SmtpClient.Connect(String host, Int32 port, SecureSocketOptions options, CancellationToken cancellationToken)
使用 .NET Mail 库,我尝试了设置和端口 587、25 和 465 的各种组合,例如:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
var client = new System.Net.Mail.SmtpClient("my-host.gmail.com", 587)
{
DeliveryMethod = SmtpDeliveryMethod.Network,
TargetName = "my-host.gmail.com",
};
var mailMessage = new MailMessage
{
From = new MailAddress("[email protected]"),
To = { new MailAddress("[email protected]","email") },
Body = message,
Subject = subject,
IsBodyHtml = true
};
回应:
An exception occurred while sending the email: System.Net.Mail.SmtpException: Service not available, closing transmission channel. The server response was: 4.7.0 Try again later, closing connection. (EHLO) 2024-04-12 15:56:50.993 CEST at System.Net.Mail.EHelloCommand.CheckResponse(LineInfo[] lines)
但是,Limilabs.Mail 确实通过了,但这不是我想要继续的解决方案,因为它需要许可证。
Limilab 配置:
using (Smtp smtp = new Smtp())
{
smtp.Connect("my-host.gmail.com");
smtp.StartTLS();
MailBuilder builder = new MailBuilder();
builder.Text = "text";
builder.From.Add(new MailBox("[email protected]"));
builder.To.Add(new MailBox("[email protected]"));
IMail email = builder.Create();
smtp.SendMessage(email);
smtp.Close();
}
我试图了解 Limilab 的不同之处以及我错过了什么。 我必须提到我无法控制邮件服务器,因此我无法查看其设置或尝试以任何方式调试该方面的问题。我知道它不需要身份验证,因为它依赖于 IP,并且对于列入白名单的 IP,中继不需要 TLS - 但鼓励这样做。
根据两个异常 StackTrace,MailKit 和 Limilabs 在发送到服务器的第一个命令 EHLO 命令中都失败了。在 Limilabs 案例中,服务器响应服务器暂时不可用(因此出现
"4.7.0 Try again later, closing connection."
文本)。 MailKit 可能会遇到相同的错误(我刚刚发布了 v4.5.0,它将在异常消息中包含此信息)。我不明白 Limilabs 如何成功发送消息,除非你很幸运,在服务器接受连接时再次尝试。
如果您再次尝试使用 MailKit,它可能会像使用 Limilabs 一样工作。