title: Mailkit Timeout Exception
body: <p>I am working on a small application where I have to send emails, using MailKit, when triggered. My development environment is Windows and Production environment is Ubuntu 20.04 LTS.</p>
  <p>In my dev environment, the emails are being sent successfully but when the same code is deployed on my linux machine, it shows</p>
  <blockquote>
  <p>TimeoutException: The operation has timed out.</p>
  </blockquote>
  <p>Following is the Exception log;</p>
  <pre><code>MailKit.Net.SocketUtils.ConnectAsync(string host, int port, IPEndPoint localEndPoint, int timeout, bool doAsync, CancellationToken cancellationToken)
  MailKit.MailService.ConnectSocket(string host, int port, bool doAsync, CancellationToken cancellationToken)
  MailKit.Net.Smtp.SmtpClient.ConnectAsync(string host, int port, SecureSocketOptions options, bool doAsync, CancellationToken cancellationToken)
  MailKit.Net.Smtp.SmtpClient.Connect(string host, int port, SecureSocketOptions options, CancellationToken cancellationToken)
  MailKit.MailService.Connect(string host, int port, bool useSsl, CancellationToken cancellationToken)
  XYZProject.Controllers.HomeController.TriggerException(string fileType) in D:\DotNet\DotNetCore\XYZProject\XYZProject\Controllers\HomeController.cs
  XYZProject.Controllers.HomeController.Index(UploadFormViewModel model) in D:\DotNet\DotNetCore\XYZProject\XYZProject\Controllers\HomeController.cs
  lambda_method35(Closure , object , object[] )
  Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor+SyncActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, object controller, object[] arguments)
  Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync()
  Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
  Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()
  Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
  Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
  Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
  Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.&lt;InvokeNextResourceFilter&gt;g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
  Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
  Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
  Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
  Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.&lt;InvokeAsync&gt;g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
  Microsoft.AspNetCore.Routing.EndpointMiddleware.&lt;Invoke&gt;g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
  Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
  Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
  </code></pre>
  <p>One point to note here why I am getting my windows path in linux machine.</p>
  <p>Here is the function I am calling for sending email;</p>
  <pre><code>private void TriggerException(string fileType)
  {
      int port = Convert.ToInt32(_configuration[&quot;AlarmTrigger:Emails:Credentials:SmtpPort&quot;]);
      string host = _configuration[&quot;AlarmTrigger:Emails:Credentials:SmtpServer&quot;];
      string username = _configuration[&quot;AlarmTrigger:Emails:Credentials:User&quot;];
      string password = _configuration[&quot;AlarmTrigger:Emails:Credentials:Password&quot;];
  
      MailboxAddress mailFrom = new MailboxAddress(_configuration[&quot;AlarmTrigger:Emails:From:Name&quot;],
          _configuration[&quot;AlarmTrigger:Emails:From:Email&quot;]);
  
      MailboxAddress mailTo = new MailboxAddress(_configuration[&quot;AlarmTrigger:Emails:To:Name&quot;], 
          _configuration[&quot;AlarmTrigger:Emails:To:Email&quot;]);
  
      string mailTitle = &quot;Failure Notification&quot;;
      string mailMessage = &quot;Dear Team, \n\r&quot; + fileType + &quot; file upload failed.&quot;;
  
      var message = new MimeMessage();
      message.From.Add(mailFrom);
      message.ReplyTo.Add(mailFrom);
      message.To.Add(mailTo);
      message.Subject = mailTitle;
      message.Body = new TextPart(&quot;plain&quot;) { Text = mailMessage };
  
      using (var client = new SmtpClient())
      {
          //client.LocalDomain = &quot;localhost&quot;;
          client.Connect(host, port, true);
          client.Authenticate(username, password);
  
          client.Send(message);
          client.Disconnect(true);
      }
  }
  </code></pre>