当发送带附件的群发电子邮件时,远程主机强制关闭现有连接

时间:2017-08-24 15:50:51

标签: c# email smtp

我有一个更新表中行的方法。它通过所有受此更改影响的公司客户,并通过电子邮件发送所有应通知此更改的用户,并附上可能的pdf文件。该文件保存在特定位置的服务器上。 这可能最终导致从此方法调用发送的20到500封电子邮件。

客户端调用此方法一次,然后服务器完成所有工作。用于电子邮件的PDF文件永远不会更改,它始终保持不变。

也许这个方法有更好的结构,或者我可以采取一些保护措施来避免服务器在运行该脚本时耗尽资源?

截至目前,发生以下错误:An existing connection was forcibly closed by the remote host System.Net.SocketsException: An existing connection was forcibly closed by the remote host以下是客户服务发送给我的堆栈跟踪。 enter image description here

以下是该方法的大部分代码:

string attach = null;
string mergerFile = FileHelper.DirectoryName.MergerDocumentDirectory(instId) + mergerDocumentFileName;
        if (System.IO.File.Exists(mergerFile))
            attach = mergerFile;
string subject = "subject";
StringBuilder sbEmailBody = new StringBuilder();
sbEmailBody.Append("the email body etc...");

foreach(Company in companies){
    //do some business logic here
    foreach(User in Company.Users){
        CustomLibrary.Mail.SendEmail("from@mail.com", user.Email.Trim(), "", "", subject, true, emailBody, attach);
    }
}

方法CustomLibrary.Mail.SendEmail

    SmtpClient smtpClient = new SmtpClient();
        MailMessage message = new MailMessage();

        smtpClient.Host = WebConfigurationManager.AppSettings["mailServer"];
        smtpClient.Port = 25;

        message.From = new MailAddress(EmailFrom);

        message.To.Add(EmailTo);
        message.Subject = EmailSubject;

         #region mail body

        System.Text.StringBuilder sb = new System.Text.StringBuilder();
        //add some header, body and footer to the email body here

         #endregion

        // Message body content
        message.Body = sb.ToString();

        //Attachment
        message.Attachments.Clear();
        if (!String.IsNullOrEmpty(AttachmentFile))
        {
            Attachment myattach = new Attachment(AttachmentFile);
            message.Attachments.Add(myattach);
        }

        // Send SMTP mail
        smtpClient.Send(message);

1 个答案:

答案 0 :(得分:0)

您应该检查邮件服务器的日志。您可能超过了服务器设置的某个限制,导致它拒绝您的连接。

如果您无法控制邮件服务器,我建议您设置本地SMTP服务器(例如,IIS SMTP服务非常简单且功能强大)。您的代码会将本地SMTP服务中的电子邮件假脱机,然后可以进行正确的重试,超时等。