使用 Mailkit 发送电子邮件无法在 ubuntu 服务器上运行,出现 TimeoutException

Posted

技术标签:

【中文标题】使用 Mailkit 发送电子邮件无法在 ubuntu 服务器上运行,出现 TimeoutException【英文标题】:Sending Email with Mailkit is not working on ubuntu server getting TimeoutException 【发布时间】:2022-01-05 20:53:05 【问题描述】:

我正在尝试使用 Mailkit 发送电子邮件,并且在本地(Windows)它工作正常,但在服务器上(ubuntu 20.04)它不是。

我使用 ufw(防火墙)打开了 465 端口,但它仍然无法正常工作。打电话时我得到一个超时*

smtp.Connect(Options.HostAddress, Options.HostPort, Options.HostSecureSocketOptions);

SecureSocket 处于自动状态。

这是我的代码:

 private bool Execute(Message message)
    
        // create message
        var builder = new BodyBuilder  htmlBody = message.GetMessageAsString() ;
        message.Attachments.ToList().ForEach(x => builder.Attachments.Add(x.Filename, x.Data, x.ContentType));
        var email = new MimeMessage
        
            Sender = MailboxAddress.Parse(Options.SenderEmail),
            Subject = message.Subject,
            Body = builder.ToMessageBody()
        ;

        if (!string.IsNullOrEmpty(Options.SenderName))
        
            email.Sender.Name = Options.SenderName;
        

        email.From.Add(email.Sender);
        email.To.Add(MailboxAddress.Parse(message.EmailAddress));

        // send email
        using (var smtp = new SmtpClient())
        
            smtp.Connect(Options.HostAddress, Options.HostPort, Options.HostSecureSocketOptions);
            smtp.Authenticate(Options.HostUsername, Options.HostPassword);
            smtp.Send(email);
            smtp.Disconnect(true);
        

        return true;
    

你知道要尝试什么吗?

如果我使用 Netcat,我可以使用 Telnet 从我的 windows 机器调用端口 465。

感谢您的宝贵时间。 严重

*System.TimeoutException: The operation has timed out.
   at MailKit.Net.SocketUtils.ConnectAsync(String host, Int32 port, IPEndPoint localEndPoint, Int32 timeout, Boolean doAsync, CancellationToken cancellationToken)
   at MailKit.MailService.ConnectSocket(String host, Int32 port, Boolean doAsync, CancellationToken cancellationToken)
   at MailKit.Net.Smtp.SmtpClient.ConnectAsync(String host, Int32 port, SecureSocketOptions options, Boolean doAsync, CancellationToken cancellationToken)
   at MailKit.Net.Smtp.SmtpClient.Connect(String host, Int32 port, SecureSocketOptions options, CancellationToken cancellationToken) 
   at 
Test.Smtp.Services.TestService.Execute(Message message) in ...
   at Test.Smtp.Services.TestService.SendEmail(Message message) in ...

【问题讨论】:

如果超时,那么要么是路由问题,要么是防火墙问题。您需要在服务器端检查它是否正在接收初始SYN数据包。同时运行wireshark,看看它是否与你认为你发送的一致。 【参考方案1】:

Netcat 在您的 Windows 机器上工作的原因与 MailKit 在您的 Windows 机器上工作的原因相同。

您的 Windows 机器有一条通向邮件服务器的畅通路由。

另一方面,您的 Ubuntu 服务器 没有 没有通往邮件服务器的畅通路由,因此无法连接到那里。

您需要找出 Ubuntu 服务器上的防火墙和/或路由表,并修复它以允许连接到邮件服务器。

【讨论】:

不,在服务器上运行网络时,我可以从我的 Windows 机器上使用 Telnet 调用它。但是我会检查路由【参考方案2】:

防火墙没有问题。 IP 6 没有正确配置。

我目前的解决方案是禁用 IP 6,然后它就起作用了。

我使用了这两个命令:

sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1

干杯, 严重

【讨论】:

以上是关于使用 Mailkit 发送电子邮件无法在 ubuntu 服务器上运行,出现 TimeoutException的主要内容,如果未能解决你的问题,请参考以下文章

MailKit 设置附加后看到的 MessageFlag

使用MailKit发送邮件

MailKit发送邮件

我可以使用 MailKit 通过电子邮件发送文件吗?

如何使用 mailkit/mimekit IMAP 下载/保存所有收件箱/发送的电子邮件?

愚公系列2023年02月 .NET CORE工具案例-使用MailKit使用SMTP协议进行邮件发送