代码之家  ›  专栏  ›  技术社区  ›  Mike Flynn

在控制台应用程序中强制关闭发送SMTP电子邮件,然后才能在.NET中发送电子邮件

  •  1
  • Mike Flynn  · 技术社区  · 7 年前

    我有一个电子邮件通知应用程序,发送电子邮件,我们这样做,在一个控制台应用程序,每5分钟运行。我们在任务中运行电子邮件部分,以便它可以继续发送到另一组通知。

    然而,我们运行一个通知,控制台关闭,电子邮件永远不会被发送。在SMTP端,它说主机被强制关闭。如何使控制台应用程序在所有任务完成之前保持活动状态,但仍然能够使用多线程。

    读取操作失败。传输的字节数:0远程IP: 44.444.444.44,会话:124992,代码:10054,消息:远程主机已强制关闭现有连接

    private Task SendFromServer(MailMessage mailMessage, bool reuse, bool useServerSmtp)
    {
        return Task.Factory.StartNew(() =>
                    {
                        var smtp = new SmtpClient();
                        smtp.Send(mailMessage);
                    }
                    catch (Exception ex)
                    {
                        Logger.Error(ex.InnerException ?? ex);
                    }
                    finally
                    {
                        if(!reuse)
                            mailMessage.Dispose();
                    }
                });
            }
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Nkosi    7 年前

    SmtpClient.SendMailAsync 这是可以等待的。

    private async Task SendFromServer(MailMessage mailMessage) {
        using (var smtp = new SmtpClient()) {
            try {
                await smtp.SendMailAsync(mailMessage);
            } catch (Exception ex) {
                Logger.Error(ex.InnerException ?? ex);
            }
        }
    }
    

    //get all notification tasks. Assuming notifications => List<MailMessage>
    var tasks = notifications.Select(message => SendFromServer(message));
    //execute all asynchronously
    Task.WhenAll(tasks).GetAwaiter().GetResult();
    

    因此,控制台应用程序等待所有人完成任务