|
|
|
|
using BookingJieFeng.DB;
|
|
|
|
|
using log4net;
|
|
|
|
|
using MimeKit;
|
|
|
|
|
using MimeKit.Utils;
|
|
|
|
|
using MailKit.Net.Smtp;
|
|
|
|
|
using Quartz;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Web;
|
|
|
|
|
using System.Configuration;
|
|
|
|
|
|
|
|
|
|
namespace BookingJieFeng.Job
|
|
|
|
|
{
|
|
|
|
|
public class SendMailJob : IJob
|
|
|
|
|
{
|
|
|
|
|
private static readonly string SendMailServer = ConfigurationManager.AppSettings["sendMailServer"];
|
|
|
|
|
private static readonly int SendMailPort = Convert.ToInt32(ConfigurationManager.AppSettings["sendMailPort"]);
|
|
|
|
|
private static readonly bool SendMailUseSSL = Convert.ToBoolean(ConfigurationManager.AppSettings["sendMailUseSSL"]);
|
|
|
|
|
private static readonly string SendMailAccount = ConfigurationManager.AppSettings["sendMailAccount"];
|
|
|
|
|
private static readonly string SendMailPassword = ConfigurationManager.AppSettings["sendMailPassword"];
|
|
|
|
|
|
|
|
|
|
private const int MailSendTryCount = 3;
|
|
|
|
|
|
|
|
|
|
private BookingDB bookingDB = new BookingDB();
|
|
|
|
|
private ILog log = LogManager.GetLogger("SendMailJob");
|
|
|
|
|
|
|
|
|
|
public void Execute(IJobExecutionContext context)
|
|
|
|
|
{
|
|
|
|
|
var staCreate = SendMailStatus.Create.ToString();
|
|
|
|
|
var staSending = SendMailStatus.Sending.ToString();
|
|
|
|
|
var staSuccess = SendMailStatus.Success.ToString();
|
|
|
|
|
var staFail = SendMailStatus.Fail.ToString();
|
|
|
|
|
|
|
|
|
|
var sendMail = bookingDB.SendMails.Where(m => m.STATUS == staCreate).OrderBy(m => m.CREATE_TIME).FirstOrDefault();
|
|
|
|
|
if (sendMail != null)
|
|
|
|
|
{
|
|
|
|
|
//置发送状态
|
|
|
|
|
log.Debug($"准备发送邮件:{sendMail.TITLE}");
|
|
|
|
|
sendMail.STATUS = staSending;
|
|
|
|
|
sendMail.SEND_TIME = DateTime.Now;
|
|
|
|
|
sendMail.TRY_COUNT += 1;
|
|
|
|
|
bookingDB.SaveChanges();
|
|
|
|
|
|
|
|
|
|
//获取配置并发送
|
|
|
|
|
if (string.IsNullOrEmpty(SendMailServer)
|
|
|
|
|
|| string.IsNullOrEmpty(SendMailAccount)
|
|
|
|
|
|| string.IsNullOrEmpty(SendMailPassword)
|
|
|
|
|
|| SendMailPort <= 0)
|
|
|
|
|
{
|
|
|
|
|
log.Error($"邮件<{sendMail.TITLE}>发送失败:未正确配置邮件发送服务器");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
var message = new MimeMessage();
|
|
|
|
|
message.Subject = sendMail.TITLE;
|
|
|
|
|
message.To.Add(new MailboxAddress(sendMail.SEND_TO));
|
|
|
|
|
message.MessageId = MimeUtils.GenerateMessageId();
|
|
|
|
|
message.Date = DateTimeOffset.Now;
|
|
|
|
|
message.From.Add(new MailboxAddress(SendMailAccount));
|
|
|
|
|
if (!string.IsNullOrEmpty(sendMail.CC_TO))
|
|
|
|
|
{
|
|
|
|
|
message.Cc.Add(new MailboxAddress(sendMail.CC_TO));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (sendMail.BODY_TYPE == SendMailBodyType.Text.ToString())
|
|
|
|
|
{
|
|
|
|
|
var plain = new TextPart("plain")
|
|
|
|
|
{
|
|
|
|
|
Text = sendMail.BODY
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
message.Body = plain;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
using (var client = new SmtpClient())
|
|
|
|
|
{
|
|
|
|
|
client.Connect(SendMailServer, SendMailPort, SendMailUseSSL);
|
|
|
|
|
client.Authenticate(SendMailAccount, SendMailPassword);
|
|
|
|
|
client.Send(message);
|
|
|
|
|
|
|
|
|
|
log.Debug($"已发送邮件:{message.Subject}");
|
|
|
|
|
|
|
|
|
|
client.Disconnect(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sendMail.STATUS = staSuccess;
|
|
|
|
|
bookingDB.SaveChanges();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
if (sendMail.TRY_COUNT < MailSendTryCount) //会继续尝试发送
|
|
|
|
|
{
|
|
|
|
|
sendMail.STATUS = staCreate;
|
|
|
|
|
bookingDB.SaveChanges();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
sendMail.STATUS = staFail;
|
|
|
|
|
bookingDB.SaveChanges();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log.Error($"发送邮件<{message.Subject}>时出错:");
|
|
|
|
|
log.Error($"{ex.Message}");
|
|
|
|
|
log.Error($"{ex.StackTrace}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|