[英]Sending emails, Why sometimes work sometimes operation time out?
我创建了一个后台异步任务,它应该发送 email 以及从数据库中获取的信息。 email 很简单,就像这样:
提醒一下,有作业给你:
这是自动生成的 email
如果有任何未完成的分配,查询将发送到 db,并将 email 发送到相应的电子邮件。 这些电子邮件就像 40 封电子邮件,可能更多取决于。 整个应用程序每天都会检查并永远运行。 问题是当我在预定的时间运行应用程序时,所有的电子邮件都被发送并且有效,但是当我运行应用程序并让它永远运行时,当它达到预定的时间时,它只发送一个 email,也许a 2 或 3 以上,然后操作超时。
这是 SendEmail Function:
private void SendEmail()
{
string connectionString = databaseSettings.Value.ConnectionString;
try
{
using OracleConnection connection = new OracleConnection(connectionString);
connection.Open();
using OracleCommand cmd = new OracleCommand("SELECT * FROM Assignment");
cmd.Connection = connection;
cmd.CommandType = CommandType.Text;
DataTable dt = new DataTable();
using OracleDataAdapter dataAdapter = new OracleDataAdapter();
dataAdapter.SelectCommand = cmd;
dataAdapter.Fill(dt);
_sending = false;
foreach (DataRow row in dt.Rows)
{
_sending = true;
string username = appSettings.Value.emailUser.ToString();
string password = appSettings.Value.emailPass.ToString();
string display = appSettings.Value.emailDisplay.ToString();
string smtp = appSettings.Value.emailSMTP.ToString();
bool ssl = appSettings.Value.emailSSL;
int port = appSettings.Value.emailPort;
string email = row["EMAIL"].ToString();
string AssignmentID= row["AssignmentID"].ToString();
string AssignmentName= row["AssignmentName"].ToString();
string AssignmentSummary= row["AssignmentSummary"].ToString();
string Subject = "Assignment Reminder";
string Body = string.Format("Reminder, there are assignments for you: <br><br>" +
"AssignmentID: " + AssignmentID+ "<br> Assignment Name: " + AssignmentName+ "<br> Assignment Summary: " + AssignmentSummary+
"<br><br>" + "This is auto generated email");
var smtpClient = new SmtpClient(smtp)
{
Port = port,
EnableSsl = ssl,
UseDefaultCredentials = false,
DeliveryMethod = SmtpDeliveryMethod.Network,
Credentials = new NetworkCredential(username, password)
};
var mailMessage = new MailMessage
{
From = new MailAddress(username, display),
Subject = Subject,
Body = Body,
IsBodyHtml = true
};
string debug = appSettings.Value.emailDebug.ToString();
string debugEmail = appSettings.Value.emailDebugAddr.ToString();
if (debug == "true")
{
mailMessage.To.Add(new MailAddress(debugEmail));
}
else
{
//foreach (var emails in email)
mailMessage.To.Add(new MailAddress(email));
}
smtpClient.Send(mailMessage);
smtpClient.Timeout = 1800000;
Console.WriteLine("Email Sent Successfully");
}
_sending = false;
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
所有这一切都在正常工作,只是它超时了。 调试时,调试器在“smtpClient.Send(mailMessage);”处停止。 如您所见,我尝试使用超时,但它仍然无法正常工作。 我的问题是为什么会发生这种情况,我该如何解决?
还有一件事,我在这里找到了一个在线建议: https://social.msdn.microsoft.com/Forums/en-US/ff467d0a-2ba7-4a2d-853a-c95d1d89bcc6/what-is-the-cause-of -smtpmail-the-operation-has-timed-out?forum=aspgettingstarted
这个家伙绕过的唯一方法是创建一个失败的电子邮件列表,该列表将在 email 任务完成后执行,以便它可以尝试重新发送电子邮件。 如果这是唯一的解决方法,请您帮我解决逻辑问题,因为我不知道该怎么做。
您是通过 Office365 发送它们吗? 如果是这样,请确保您没有超过每分钟 30 次的限制。
微软似乎在推荐 MailKit而不是他们自己的旧库(无论如何 MailKit 人在那里工作),所以如果不是限制的话,这里有一些建议:
new SmtpClient(new ProtocolLogger(Console.OpenStandardError()))
,然后下次您看到超时时将日志 output 粘贴到此处。var smtpSettings = new EmailSenderOptions(smtpHost, smtpPort, username, password, "");
using var smtpSender = SmtpSender.Create(smtpSettings);
await smtpSender.WriteEmail
.From("admin@localhost")
.To("user@example.com")
.Subject("Assignment Reminder")
.BodyHtml("Assignments: <br><br>")
.TrySendAsync();
注意:我编写了库,所以我愿意接受功能请求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.