我需要哪些额外的工具才能使用 docker 通过 smtp 服务器发送电子邮件

blo*_*s4t 5 smtp exception docker mailkit

我正在编写一个 .net core 1.1 控制台应用程序。目标是将其托管为在 docker 容器内运行的计划作业。

控制台应用程序将使用 smtp 服务器并发送电子邮件。就那么简单。

但是,我在 docker 容器内运行应用程序时没有成功。我的假设是,如果我们将 smtp 端口暴露在 docker 容器之外,那么 smtp 服务器就可以正常工作了。

docker run -it -p 25:25 --rm courierreports:demo

尝试连接到 smtp 服务器时,代码抛出异常。我需要任何其他工具才能使我的应用程序正常运行吗?

我的机器运行的是 Windows 7,我正在使用 Oracle Virtual Box for docker。smtp 服务器 ( org.smtp.com) 由我公司提供 我使用的端口25

我得到的错误:

fail: StartupLogs[0]
      An error occurred.
fail: StartupLogs[0]
      Unable to read data from the transport connection: Connection timed out.
fail: StartupLogs[0]
         at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
         at MailKit.Net.Smtp.SmtpStream.ReadAhead(CancellationToken cancellationToken)
         at MailKit.Net.Smtp.SmtpStream.ReadResponse(CancellationToken cancellationToken)
         at MailKit.Net.Smtp.SmtpClient.Connect(String host, Int32 port, SecureSocketOptions options, CancellationToken cancellationToken)
         at MailKit.MailService.Connect(String host, Int32 port, Boolean useSsl, CancellationToken cancellationToken)
         at Org.Dept.MailkitAdapter.MailkitSendMail.SendMail(MailMessage mailMsg) in C:\Workspace\POC\DotnetCore\Azure\Practice\EmailService\Org.Dept
.MailkitAdapter\MailkitSendMail.cs:line 31
         at Org.Legal.CourierReports.Logic.EmailProcessor.SendEmail(List`1 model) in C:\Workspace\POC\DotnetCore\Azure\Practice\EmailService\Org.Lega
l.CourierReports.Logic\EmailProcessor.cs:line 121
         at Org.Legal.CourierReports.Logic.EmailProcessor.TestSend() in C:\Workspace\POC\DotnetCore\Azure\Practice\EmailService\Org.Legal.CourierRepo
rts.Logic\EmailProcessor.cs:line 92
         at Org.Legal.CourierReports.Console.Program.Main(String[] args) in C:\Workspace\POC\DotnetCore\Azure\Practice\EmailService\Org.Legal.Courier
Reports.Console\Program.cs:line 42 
Run Code Online (Sandbox Code Playgroud)

这是我的 dockerfile

FROM microsoft/dotnet:1.1-runtime
ARG source
WORKDIR /app
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", "Org.Legal.CourierReports.Console.dll"] 
Run Code Online (Sandbox Code Playgroud)

以下是我用来构建和运行 docker 容器的命令

docker build --no-cache -t courierreports:demo .
docker run -it -p 25:25 --rm courierreports:demo
Run Code Online (Sandbox Code Playgroud)

这是代码。它在 指示的行处中断=>

using (var client = new SmtpClient())
{
    client.ServerCertificateValidationCallback = (s, c, h, e) => true;

=>  client.Connect(mailMsg.MailOptions.SmtpHost, mailMsg.MailOptions.SmtpPortNoAuth, false);

    client.AuthenticationMechanisms.Remove("XOAUTH2");

    client.Send(mimeMsg);

    client.Disconnect(true);
}
Run Code Online (Sandbox Code Playgroud)