Ejemplo n.º 1
0
        /// <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();
        }
Ejemplo n.º 2
0
 public AdminViewProvider(
     IEmailSettingsStore <EmailSettings> emailSettingsStore,
     IEmailSettingsManager emailSettingsManager,
     IOptions <PlatoOptions> platoOptions,
     ILogger <AdminViewProvider> logger,
     IShellSettings shellSettings,
     IEncrypter encrypter,
     IPlatoHost platoHost)
 {
     _emailSettingsManager = emailSettingsManager;
     _emailSettingsStore   = emailSettingsStore;
     _platoOptions         = platoOptions.Value;
     _shellSettings        = shellSettings;
     _platoHost            = platoHost;
     _encrypter            = encrypter;
     _logger = logger;
 }
Ejemplo n.º 3
0
        /// <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设置");
        }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
 /// <summary>
 /// 初始化类<see cref="EditModel"/>。
 /// </summary>
 /// <param name="settingsManager">邮件配置管理接口。</param>
 public EditModel(IEmailSettingsManager settingsManager)
 {
     _settingsManager = settingsManager;
 }
Ejemplo n.º 6
0
 /// <summary>
 /// 初始化类<see cref="EmailManager"/>。
 /// </summary>
 /// <param name="context">数据库操作接口。</param>
 /// <param name="localizer">本地化接口。</param>
 /// <param name="settingsManager">配置管理接口。</param>
 public EmailManager(IDbContext <Email> context, ILocalizer localizer, IEmailSettingsManager settingsManager)
 {
     _localizer       = localizer;
     _settingsManager = settingsManager;
     Context          = context;
 }
Ejemplo n.º 7
0
 /// <summary>
 /// 初始化类<see cref="IndexModel"/>。
 /// </summary>
 /// <param name="settingsManager">邮件配置接口。</param>
 public IndexModel(IEmailSettingsManager settingsManager)
 {
     _settingsManager = settingsManager;
 }
Ejemplo n.º 8
0
 /// <summary>
 /// 初始化类<see cref="EmailTaskService"/>。
 /// </summary>
 /// <param name="settingsManager">配置管理接口。</param>
 /// <param name="emailManager">电子邮件管理接口。</param>
 /// <param name="logger">日志接口。</param>
 public EmailTaskService(IEmailSettingsManager settingsManager, IEmailManager emailManager, ILogger <EmailTaskService> logger)
 {
     _settingsManager = settingsManager;
     _emailManager    = emailManager;
     _logger          = logger;
 }
Ejemplo n.º 9
0
 public DefaultEmailTaskService(IEmailSettingsManager settingsManager, IEmailManager emailManager, ILogger <EmailTaskService> logger)
     : base(settingsManager, emailManager, logger)
 {
 }
Ejemplo n.º 10
0
        /// <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);
        }