Files
contact/Services/MailSender.cs

48 lines
1.9 KiB
C#

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<int>("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", " ");
}
}