using System.Threading.Tasks; using MailKit.Net.Smtp; using MailKit.Security; using Microsoft.Extensions.Configuration; using MimeKit; namespace contact.Services { //Sends web form submissions to support. //From is always the authenticated account; the visitor goes in Reply-To, so there is no sender spoofing. //SMTP settings come from the "Smtp" config section; the password is never in source. public class MailSender { private const string SupportAddress = "support@ayanova.com"; private readonly IConfiguration _configuration; public MailSender(IConfiguration configuration) { _configuration = configuration; } public async Task SendToSupportAsync(string subject, string body, string visitorName, string visitorEmail) { var smtp = _configuration.GetSection("Smtp"); var message = new MimeMessage(); message.From.Add(new MailboxAddress("AyaNova web forms", smtp["User"])); message.To.Add(MailboxAddress.Parse(SupportAddress)); if (MailboxAddress.TryParse(visitorEmail, out var replyTo)) { replyTo.Name = visitorName; message.ReplyTo.Add(replyTo); } message.Subject = OneLine(subject); message.Body = new TextPart("plain") { Text = body }; using var client = new SmtpClient(); await client.ConnectAsync(smtp["Host"], smtp.GetValue("Port"), SecureSocketOptions.StartTls); await client.AuthenticateAsync(smtp["User"], smtp["Password"]); await client.SendAsync(message); await client.DisconnectAsync(true); } //Subjects include visitor-supplied text; a hand-crafted POST could put line breaks in it private static string OneLine(string s) => s.Replace("\r", " ").Replace("\n", " "); } }