Otherwise, most of your emails will be marked by spam.
Why is that? How is it different from using an ESP?
public IQueryable<QueuedEmail> GetReadyToSendEmails()
{
var now = DateTime.Now;
var query = from qe in _queuedEmailRepository.Table
where !qe.WasSent && now >=
(EntityFunctions.AddMinutes(qe.CreationDate, _messageSettings.ResendInterval * qe.SentTries))
select qe;
return query;
}
public void SendQueuedEmail()
{
var stopTime = DateTime.Now.AddSeconds(45);//probably switch this to a setting so it can be adjusted when needed
var maxTries = _messageSettings.MaxNumberOfSendTries;
var queuedEmails = _queuedEmailService.GetReadyToSendEmails().ToList();
foreach (var queuedEmail in queuedEmails)
{
var now = DateTime.Now;
if(now >= stopTime)
break;
var emailAccount = queuedEmail.EmailAccount;
if (queuedEmail.SentTries > maxTries)
{
//log it
_logger.EmailMaxTries(string.Format("The maximum number of email tries has been met for '{0}'", queuedEmail.To),
queuedEmail.CustomerId);
//delete it
_queuedEmailService.DeleteQueuedEmail(queuedEmail);
}
else
SendEmail(emailAccount, queuedEmail);
}
}
private void SendEmail(EmailAccount emailAccount, QueuedEmail queuedEmail)
{
//addressing section same as nop
var isSuccessful = true;
#region Send Message
using (var smtpClient = new SmtpClient())
{
try
{
smtpClient.UseDefaultCredentials = emailAccount.UseDefaultCredentials;
smtpClient.Host = emailAccount.Host;
smtpClient.Port = emailAccount.Port;
smtpClient.EnableSsl = emailAccount.EnableSsl;
smtpClient.Credentials = emailAccount.UseDefaultCredentials
? CredentialCache.DefaultNetworkCredentials
: new NetworkCredential(emailAccount.Username, emailAccount.Password);
smtpClient.Send(message);
}
catch (SmtpException exc)
{
queuedEmail.SentTries = queuedEmail.SentTries + 1;
if (queuedEmail.SentTries > _messageSettings.MaxNumberOfSendTries)
{
//log only the last attempt to get status code
_logger.Email(string.Format("Error sending email: '{0}' - Status Code: {1} - Message: {2}",
queuedEmail.To, exc.StatusCode, exc.Message),
queuedEmail.CustomerId, exc.InnerException);
}
//keep trying
_queuedEmailService.UpdateQueuedEmail(queuedEmail);
isSuccessful = false;
}
catch (Exception exc)
{
queuedEmail.SentTries = queuedEmail.SentTries + 1;
//log all general exceptions
_logger.Email(string.Format("General Exception when sending Email: '{0}' - Inner Exception: {1} - Message: {2}",
queuedEmail.To, exc.InnerException, exc.Message), queuedEmail.CustomerId, exc.InnerException);
//keep trying
_queuedEmailService.UpdateQueuedEmail(queuedEmail);
isSuccessful = false;
}
#endregion
if (!isSuccessful)
return;
queuedEmail.WasSent = true;
queuedEmail.SentTries = queuedEmail.SentTries + 1;
_queuedEmailService.UpdateQueuedEmail(queuedEmail);
//log it
var sentEmailLog = new SentEmailLog
{
CustomerId = queuedEmail.CustomerId,
EmailTemplateTypeId = queuedEmail.EmailTemplateTypeId,
SentTries = queuedEmail.SentTries,
DateSent = DateTime.Now
};
_queuedEmailService.InsertSentEmailLog(sentEmailLog);
}
public IQueryable<QueuedEmail> GetReadyToSendEmails()
{
var now = DateTime.Now;
var query = from qe in _queuedEmailRepository.Table
where !qe.WasSent && now >=
(EntityFunctions.AddMinutes(qe.CreationDate, _messageSettings.ResendInterval * qe.SentTries))
select qe;
return query;
}