public class EmailModel : IDisposable
{
public FromEmail fromEmail { get; set; }
public List<ToEmail> toMails { get; set; }
public string Header { get; set; }
public string Body { get; set; }
public bool IsBodyHTML { get; set; }
public MailMessage message { get; set; }
public SendEmailResult _result;
public event EventHandler<SendEmailResult> EmailSendCompleted;
public EmailModel(string Company, string Header, string Body, bool IsBodyHTML)
{
this.Header = Header;
this.Body = Body;
this.IsBodyHTML = IsBodyHTML;
try
{
using (var db = new DeepViewEntities(ConnectStringBuilder.DeepViewConnectionString().ToString()))
{
var fromMails = db.FromEmail.Where(email => email.Company.ToLower() == Company);
if (fromMails.Count() > 0)
fromEmail = fromMails.First();
else
throw new Exception("formMail에 일치하는 Company가 없습니다.");
if (fromEmail != null)
{
var toMailList = db.ToEmail.Where(tomail => tomail.ServiceID == fromEmail.ID &&
tomail.IsActive == true).ToList();
if (toMailList.Count > 0)
toMails = toMailList;
else
throw new Exception("toMail에 해당하는 유저 정보가 없습니다.");
}
}
}
catch (Exception ex)
{
_result = new SendEmailResult(false, ex);
}
}
public void MailSend()
{
string smtpServer = fromEmail.Smtp;
message = new MailMessage();
message.Subject = Header;
message.Body = Body;
message.BodyEncoding = System.Text.Encoding.UTF8;
message.Priority = MailPriority.High;
if (IsBodyHTML)
message.IsBodyHtml = true;
toMails.ForEach(to => message.To.Add(to.MailID));
// Credentials 계정이랑 From 계정이랑 동일 해야한다.
message.From = new MailAddress(fromEmail.MailID);
SmtpClient client = new SmtpClient(smtpServer);
client.Port = fromEmail.SmtpPort;
client.UseDefaultCredentials = true;
client.Credentials = new NetworkCredential(fromEmail.MailID, fromEmail.Password);
try
{
if (_result != null)
throw _result.Exception;
client.Send(message);
}
catch (Exception ex)
{
_result = new SendEmailResult(false, ex);
if (EmailSendCompleted != null)
EmailSendCompleted(this, _result);
}
}
public void Dispose()
{
message.Dispose();
GC.Collect(2);
GC.WaitForPendingFinalizers();
}
}