.NET 使用 MailKit 发送 SMTP 电子邮件失败,而 limilabs 正常工作

问题描述 投票:0回答:1

我有一个使用 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 - 但鼓励这样做。

.net smtp mailkit relayjs
1个回答
0
投票

根据两个异常 StackTrace,MailKit 和 Limilabs 在发送到服务器的第一个命令 EHLO 命令中都失败了。在 Limilabs 案例中,服务器响应服务器暂时不可用(因此出现

"4.7.0 Try again later, closing connection."
文本)。 MailKit 可能会遇到相同的错误(我刚刚发布了 v4.5.0,它将在异常消息中包含此信息)。我不明白 Limilabs 如何成功发送消息,除非你很幸运,在服务器接受连接时再次尝试。

如果您再次尝试使用 MailKit,它可能会像使用 Limilabs 一样工作。

© www.soinside.com 2019 - 2024. All rights reserved.