SmtpClient.Send() 在发送几封邮件后超时

SmtpClient.Send() times out after sending a couple of mails

提问人:hagru 提问时间:10/18/2023 最后编辑:Yehor Androsovhagru 更新时间:10/20/2023 访问量:44

问:

我使用 RazorPages 为狩猎组织制作了一个网上商店。每个星期四,他们都会进行抽签,用户在周六或周日预订的每个地形都会进入抽奖。每个用户可以赢得一个地形,并且每个地形每天只有一个赢家。

我设置了程序,以便每个中奖者都会收到一封电子邮件,告诉他们他们在彩票中赢得了哪个地形。用户多于地形,所以会有人没有赢得任何地形。我在每个日期收集每个地形的所有赢家和输家,并将它们放在赢家和输家列表中。然后,我从输家列表中删除每个赢家,这样用户就只能收到通知他们获胜的邮件,或者收到通知他们输钱的邮件。

获奖者的邮件很顺利,每个人都收到了他们的邮件。

然后,我运行此代码向每个失败者发送一封邮件:

public void SendLoserMails(List<string> distinctLosers){
    foreach (string loserMail in distinctLosers)
    {
        _mailSender.SetRecipient(loserMail);
        _mailSender.SetSubject("Du har dessverre ikke blitt tildelt jakt!");
        _mailSender.SetContents("<html><body> <h1>Jaktdag ikke tildelt.</h1>" +
                                "Du har dessverre ikke blitt tildelt noen jaktdager i trekningen " + DateTime.Today.ToString("dd.MM.yyyy")
                                + "<br /> <br />"
                                + "Jaktkortet ditt vil bli lagt tilbake på profilen din og kan brukes ved neste bestilling"
                                + "<br /> <br />"
                                + "Med vennlig hilsen <br/> - Telemark Jeger- og Fiskerforening <br />" + loserMail
                                + "</body></html>");
        _mailSender.SendMail();
    }
}

每次尝试时,我都会经历 2 次迭代,这意味着前两次收到一封邮件,然后操作超时,其余的失败者永远不会收到他们的邮件,因为每次都超时。

这是我使用的 MailSender 类:

public class MailSender
{

    private string Recipient;
    private string Subject;
    private string Contents;

    private string SenderName;
    private string SenderMail;
    private string SmtpUsername;
    private string SmtpPassword;
    private string SmtpMail;

    private SmtpClient smtpClient;

    public MailSender() { }

    public void SetRecipient(string recipient) => Recipient = recipient;
    public void SetSubject(string subject) => Subject = subject;
    public void SetContents(string contents) => Contents = contents;

    public void SetSecrets(IConfiguration config)
    {
        SenderName = config.GetValue<string>("SMTP_SENDER_NAME");
        SenderMail = config.GetValue<string>("SMTP_SENDER_MAIL");
        SmtpUsername = config.GetValue<string>("SMTP_CRED_USERNAME");
        SmtpPassword = config.GetValue<string>("SMTP_CRED_PASSWORD");
        SmtpMail = config.GetValue<string>("SMTP_CRED_MAIL");
    }


    public void SendMail()
    {
        if (Recipient == default || Subject == default || Contents == default)
            return;

        try
        {
            var newMail = new MailMessage();
            smtpClient = new SmtpClient(SmtpMail);

            newMail.From = new MailAddress(SenderMail, SenderName);
            newMail.To.Add(Recipient);
            newMail.Subject = Subject;
            newMail.IsBodyHtml = true;
            newMail.Body = Contents;

            smtpClient.EnableSsl = false;
            smtpClient.Port = 587;
            smtpClient.Timeout = 100000;
            smtpClient.Credentials = new NetworkCredential(
                SmtpUsername,
                SmtpPassword);

            smtpClient.Send(newMail);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error - " + ex.Message);
        }
    }
}

有什么原因为什么在向失败者发送了几封电子邮件后总是超时?

请记住,所有获奖者每次都会收到他们的电子邮件。因此,MailSender在一定程度上可以工作。

C# .NET 电子邮件 SMTPConlient

评论

1赞 gunr2171 10/18/2023
您使用的是什么 SMTP 服务?这个服务费率会限制你吗?
0赞 hagru 10/18/2023
我正在使用我的工作场所使用的 SMTP 服务,该服务托管在外部提供商处。不幸的是,我对有关该服务的细节知之甚少。我大概可以弄清楚是否有任何具体的东西可能很有趣。
1赞 Matthew Watson 10/18/2023
您可能应该处理该对象或(更好的是)重用现有对象。此外,您还应该处理该对象。SmtpClientMailMessage
0赞 hagru 10/18/2023
我在我的 MailSender 类之后添加了,似乎这成功了!将修改代码以重用现有代码。还将处理 MailMessage 以采取安全措施smtpClient.Dispose()smtpClient.Send()
1赞 Panagiotis Kanavos 10/18/2023
现有代码为每封电子邮件创建了与服务器的新连接,而不关闭前一封电子邮件。主机可能不允许同一帐户超过 2 个连接,因此它阻止了您。不要调用 inside,而是在构造函数中创建。并记得在发送所有消息时处理它smtpClient.Dispose()SendMailsmtpClientMailSender

答: 暂无答案