Files
server/src/Core/Services/Implementations/SmtpMailDeliveryService.cs

107 lines
3.9 KiB
C#
Raw Normal View History

2017-05-30 17:19:46 -04:00
using System;
using System.Threading.Tasks;
2017-05-30 22:40:02 -04:00
using System.Net.Mail;
using System.Net;
using System.Text;
2017-10-09 21:43:45 -04:00
using Microsoft.Extensions.Logging;
2017-05-30 17:19:46 -04:00
namespace Bit.Core.Services
{
public class SmtpMailDeliveryService : IMailDeliveryService
{
private readonly GlobalSettings _globalSettings;
2017-10-09 21:43:45 -04:00
private readonly ILogger<SmtpMailDeliveryService> _logger;
2017-05-30 17:19:46 -04:00
2017-10-09 21:43:45 -04:00
public SmtpMailDeliveryService(
GlobalSettings globalSettings,
ILogger<SmtpMailDeliveryService> logger)
2017-05-30 17:19:46 -04:00
{
2017-05-30 22:40:02 -04:00
if(globalSettings.Mail?.Smtp?.Host == null)
{
throw new ArgumentNullException(nameof(globalSettings.Mail.Smtp.Host));
}
2017-05-30 17:19:46 -04:00
2017-05-30 22:40:02 -04:00
_globalSettings = globalSettings;
2017-10-09 21:43:45 -04:00
_logger = logger;
2017-05-30 17:19:46 -04:00
}
2017-05-30 22:40:02 -04:00
public Task SendEmailAsync(Models.Mail.MailMessage message)
2017-05-30 17:19:46 -04:00
{
2017-08-21 22:36:31 -04:00
var client = new SmtpClient(_globalSettings.Mail.Smtp.Host, _globalSettings.Mail.Smtp.Port);
client.EnableSsl = _globalSettings.Mail.Smtp.Ssl;
2017-10-05 08:34:46 -04:00
client.UseDefaultCredentials = _globalSettings.Mail.Smtp.UseDefaultCredentials;
2017-08-21 22:36:31 -04:00
client.DeliveryMethod = SmtpDeliveryMethod.Network;
2017-10-05 08:34:46 -04:00
if(!string.IsNullOrWhiteSpace(_globalSettings.Mail.Smtp.Username) &&
!string.IsNullOrWhiteSpace(_globalSettings.Mail.Smtp.Password))
{
2018-08-22 23:40:50 -04:00
if(!string.IsNullOrWhiteSpace(_globalSettings.Mail.Smtp.AuthType))
{
var cred = new NetworkCredential(_globalSettings.Mail.Smtp.Username,
_globalSettings.Mail.Smtp.Password);
var cache = new CredentialCache();
cache.Add(_globalSettings.Mail.Smtp.Host, _globalSettings.Mail.Smtp.Port,
_globalSettings.Mail.Smtp.AuthType, cred);
client.Credentials = cache;
}
else
{
client.Credentials = new NetworkCredential(_globalSettings.Mail.Smtp.Username,
_globalSettings.Mail.Smtp.Password);
}
2017-10-05 08:34:46 -04:00
}
2017-05-30 22:40:02 -04:00
2017-08-21 22:36:31 -04:00
var smtpMessage = new MailMessage();
smtpMessage.From = new MailAddress(_globalSettings.Mail.ReplyToEmail, _globalSettings.SiteName);
smtpMessage.Subject = message.Subject;
smtpMessage.SubjectEncoding = Encoding.UTF8;
smtpMessage.BodyEncoding = Encoding.UTF8;
smtpMessage.BodyTransferEncoding = System.Net.Mime.TransferEncoding.QuotedPrintable;
foreach(var address in message.ToEmails)
{
smtpMessage.To.Add(new MailAddress(address));
}
2017-05-30 22:40:02 -04:00
2018-05-11 08:29:23 -04:00
if(message.BccEmails != null)
{
foreach(var address in message.BccEmails)
{
smtpMessage.Bcc.Add(new MailAddress(address));
}
}
2017-08-21 22:36:31 -04:00
if(string.IsNullOrWhiteSpace(message.TextContent))
{
smtpMessage.IsBodyHtml = true;
smtpMessage.Body = message.HtmlContent;
}
else
{
smtpMessage.Body = message.TextContent;
var htmlView = AlternateView.CreateAlternateViewFromString(message.HtmlContent);
htmlView.ContentType = new System.Net.Mime.ContentType("text/html");
smtpMessage.AlternateViews.Add(htmlView);
}
2017-05-30 22:40:02 -04:00
2017-10-09 21:43:45 -04:00
client.SendCompleted += (sender, e) =>
2017-08-21 22:36:31 -04:00
{
2017-10-09 21:43:45 -04:00
if(e.Error != null)
{
_logger.LogError(e.Error, "Mail send failed.");
}
if(e.Cancelled)
{
_logger.LogWarning("Mail send canceled.");
}
2017-08-21 22:36:31 -04:00
smtpMessage.Dispose();
client.Dispose();
};
2017-05-30 22:40:02 -04:00
2017-08-21 22:36:31 -04:00
client.SendAsync(smtpMessage, null);
return Task.FromResult(0);
2017-05-30 17:19:46 -04:00
}
}
}