using System;
using System.Threading.Tasks;
using FoodsharingSiegen.Contracts.Model;
using MailKit.Net.Smtp;
using MailKit.Security;
using Microsoft.Extensions.Options;
using MimeKit;
using MimeKit.Text;
namespace FoodsharingSiegen.Server.Service
{
///
/// Default implementation of which sends emails via SMTP using MailKit.
///
public class MailService : IMailService
{
private readonly MailSettings _mailSettings;
private readonly TermSettings _termSettings;
private readonly Func _smtpClientFactory;
///
/// Initializes a new instance of the class.
///
/// The configured application settings injected by DI, containing the .
public MailService(IOptions appSettings, Func? smtpClientFactory = null)
{
_mailSettings = appSettings.Value.Mail;
_termSettings = appSettings.Value.Terms;
_smtpClientFactory = smtpClientFactory ?? (() => new SmtpClient());
}
///
public async Task SendEmailAsync(string toEmail, string subject, string htmlBody)
{
var email = new MimeMessage();
email.From.Add(new MailboxAddress(_termSettings.Title, _mailSettings.FromAddress));
email.To.Add(MailboxAddress.Parse(toEmail));
email.Subject = subject;
var textPart = new TextPart(TextFormat.Html)
{
Text = htmlBody
};
email.Body = textPart;
using var smtp = _smtpClientFactory();
var secureOptions = _mailSettings.UseSsl ? SecureSocketOptions.StartTls : SecureSocketOptions.Auto;
await smtp.ConnectAsync(_mailSettings.Host, _mailSettings.Port, secureOptions);
if (!string.IsNullOrWhiteSpace(_mailSettings.Username))
{
await smtp.AuthenticateAsync(_mailSettings.Username, _mailSettings.Password);
}
await smtp.SendAsync(email);
await smtp.DisconnectAsync(true);
}
}
}