/// <summary> /// 任务执行的内容 /// </summary> /// <param name="taskDetail">任务配置状态信息</param> public void Execute(TaskDetail taskDetail = null) { EmailService emailService = new EmailService(); List <int> successedIds = new List <int>(); List <int> failedIds = new List <int>(); RWLock.EnterWriteLock(); //从配置文件读取配置 IEmailSettingsManager emailSettingsManager = DIContainer.Resolve <IEmailSettingsManager>(); EmailSettings settings = emailSettingsManager.Get(); //1 首先获取待发送的邮件列表 Dictionary <int, MailMessage> emailQueue = emailService.Dequeue(settings.BatchSendLimit); //2 逐个邮件进行发送(非异步发送) //3 记录记录发送成功的和发送失败的ID foreach (var item in emailQueue) { if (emailService.Send(item.Value)) { successedIds.Add(item.Key); } else { failedIds.Add(item.Key); } } //4 发送成功的记录删除 emailService.SendFailed(failedIds, settings.SendTimeInterval, settings.NumberOfTries); //从配置文件读取 //5 发送失败的记录更新 emailService.Delete(successedIds); //从配置文件读取 RWLock.ExitWriteLock(); }
/// <summary> /// 获取下一个可以用的Smtp设置 /// </summary> /// <param name="service"></param> /// <returns></returns> private SmtpSettings NextSmtpSettings() { if (AllSmtpSettings == null) { IEmailSettingsManager emailSettingsManager = DIContainer.Resolve <IEmailSettingsManager>(); EmailSettings settings = emailSettingsManager.Get(); return(settings.SmtpSettings); } int index = 0; lock (_lock) { _index = (_index + 1) % AllSmtpSettings.Count(); index = _index; } //以下代码是为了维持邮箱的发送邮件的均衡 for (int i = index; i < AllSmtpSettings.Count(); i++) { SmtpSettings settings = AllSmtpSettings.ElementAt(i); if (settings.DailyLimit > settings.TodaySendCount) { settings.TodaySendCount++; return(settings); } } for (int i = 0; i < index; i++) { SmtpSettings settings = AllSmtpSettings.ElementAt(i); if (settings.DailyLimit > settings.TodaySendCount) { settings.TodaySendCount++; return(settings); } } throw new Exception("所有的Smtp设置都超出了使用限制,请尝试添加更多的Smtp设置"); }
/// <summary> /// 获取StmpClient /// </summary> private static SmtpClient GetSmtpClient(SmtpSettings smtpSettings = null) { SmtpClient client = null; IEmailSettingsManager emailSettingsManager = DIContainer.Resolve <IEmailSettingsManager>(); EmailSettings settings = emailSettingsManager.Get(); if (smtpSettings == null) { smtpSettings = settings.SmtpSettings; } client = new SmtpClient(smtpSettings.Host, smtpSettings.Port); client.EnableSsl = smtpSettings.EnableSsl; //for SMTP Authentication if (smtpSettings.RequireCredentials) { client.UseDefaultCredentials = false; client.Credentials = new System.Net.NetworkCredential(smtpSettings.UserName, smtpSettings.Password); client.DeliveryMethod = SmtpDeliveryMethod.Network; } return(client); }
/// <summary> /// 生成MailMessage /// </summary> /// <param name="templateName">邮件模板名称</param> /// <param name="model">解析模板使用的数据</param> /// <param name="from">发件人</param> /// <param name="to">收件人</param> /// <param name="cc">抄送地址</param> /// <param name="bcc">密送地址</param> /// <exception cref="CommonExceptionDescriptor">发件人不能为null</exception> /// <exception cref="CommonExceptionDescriptor">编译邮件模板标题时报错</exception> /// <exception cref="CommonExceptionDescriptor">编译邮件模板内容时报错</exception> /// <exception cref="CommonExceptionDescriptor">邮件模板中Body、BodyUrl必须填一个</exception> /// <returns>返回生成的MailMessage</returns> public MailMessage Resolve(string templateName, dynamic model, IEnumerable <string> to, string from = null, IEnumerable <string> cc = null, IEnumerable <string> bcc = null) { if (to == null) { return(null); } if (model == null) { model = new ExpandoObject(); } IEmailSettingsManager emailSettingsManager = DIContainer.Resolve <IEmailSettingsManager>(); EmailSettings settings = emailSettingsManager.Get(); //if (settings.SmtpSettings.ForceSmtpUserAsFromAddress) // from = settings.SmtpSettings.UserEmailAddress; EmailTemplate emailTemplate = GetEmailTemplate(templateName); if (string.IsNullOrEmpty(from)) { if (string.Equals(emailTemplate.From, "NoReplyAddress", StringComparison.CurrentCultureIgnoreCase)) { from = settings.NoReplyAddress; } else if (string.Equals(emailTemplate.From, "AdminAddress", StringComparison.CurrentCultureIgnoreCase)) { from = settings.AdminEmailAddress; } else { throw new ExceptionFacade(new CommonExceptionDescriptor("发件人不能为null")); } } MailMessage email = new MailMessage(); email.IsBodyHtml = true; try { //todo all by bianchx:为了保证发送出去的邮件发送人名称显示都是相同的,所以需要保证Model中的SiteName都是有效的 email.From = new MailAddress(from, model.SiteName); } catch { } foreach (var toAddress in to) { try { email.To.Add(toAddress); } catch { } } if (cc != null) { foreach (var ccAddress in cc) { try { email.CC.Add(ccAddress); } catch { } } } if (bcc != null) { foreach (var bccAddress in bcc) { try { email.Bcc.Add(bccAddress); } catch { } } } //使用RazorEngine解析 EmailTemplate.Subject try { email.Subject = Razor.Parse(emailTemplate.Subject, model, emailTemplate.TemplateName); } catch (Exception e) { throw new ExceptionFacade(new CommonExceptionDescriptor("编译邮件模板标题时报错"), e); } email.Priority = emailTemplate.Priority; if (!string.IsNullOrEmpty(emailTemplate.Body)) { try { email.Body = Razor.Parse(emailTemplate.Body, model, emailTemplate.Body); } catch (Exception e) { throw new ExceptionFacade("编译邮件模板内容时报错", e); } } else if (!string.IsNullOrEmpty(emailTemplate.BodyUrl)) { email.Body = HttpCollects.GetHTMLContent(emailTemplate.BodyUrl); } else { throw new ExceptionFacade("邮件模板中Body、BodyUrl必须填一个"); } return(email); }