refactor(*): Move EmailService inside the main project

This commit is contained in:
Josh Creek
2021-04-04 09:33:42 +01:00
parent 142c48323c
commit b89a7ab7aa
13 changed files with 23 additions and 43 deletions
@@ -13,7 +13,7 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Extensions.Logging;
using EmailService;
using My.ProjectName.Services.EmailService;
namespace My.ProjectName.Areas.Identity.Pages.Account
{
@@ -22,14 +22,14 @@ namespace My.ProjectName.Areas.Identity.Pages.Account
{
private readonly SignInManager<IdentityUser> _signInManager;
private readonly UserManager<IdentityUser> _userManager;
private readonly EmailService.IEmailSender _emailSender;
private readonly Services.EmailService.IEmailSender _emailSender;
private readonly ILogger<ExternalLoginModel> _logger;
public ExternalLoginModel(
SignInManager<IdentityUser> signInManager,
UserManager<IdentityUser> userManager,
ILogger<ExternalLoginModel> logger,
EmailService.IEmailSender emailSender)
Services.EmailService.IEmailSender emailSender)
{
_signInManager = signInManager;
_userManager = userManager;
@@ -10,7 +10,7 @@ using Microsoft.AspNetCore.Identity.UI.Services;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.WebUtilities;
using EmailService;
using My.ProjectName.Services.EmailService;
namespace My.ProjectName.Areas.Identity.Pages.Account
{
@@ -18,9 +18,9 @@ namespace My.ProjectName.Areas.Identity.Pages.Account
public class ForgotPasswordModel : PageModel
{
private readonly UserManager<IdentityUser> _userManager;
private readonly EmailService.IEmailSender _emailSender;
private readonly Services.EmailService.IEmailSender _emailSender;
public ForgotPasswordModel(UserManager<IdentityUser> userManager, EmailService.IEmailSender emailSender)
public ForgotPasswordModel(UserManager<IdentityUser> userManager, Services.EmailService.IEmailSender emailSender)
{
_userManager = userManager;
_emailSender = emailSender;
@@ -10,7 +10,7 @@ using Microsoft.AspNetCore.Identity.UI.Services;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.WebUtilities;
using EmailService;
using My.ProjectName.Services.EmailService;
namespace My.ProjectName.Areas.Identity.Pages.Account.Manage
{
@@ -18,12 +18,12 @@ namespace My.ProjectName.Areas.Identity.Pages.Account.Manage
{
private readonly UserManager<IdentityUser> _userManager;
private readonly SignInManager<IdentityUser> _signInManager;
private readonly EmailService.IEmailSender _emailSender;
private readonly Services.EmailService.IEmailSender _emailSender;
public EmailModel(
UserManager<IdentityUser> userManager,
SignInManager<IdentityUser> signInManager,
EmailService.IEmailSender emailSender)
Services.EmailService.IEmailSender emailSender)
{
_userManager = userManager;
_signInManager = signInManager;
@@ -13,7 +13,7 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Extensions.Logging;
using EmailService;
using My.ProjectName.Services.EmailService;
namespace My.ProjectName.Areas.Identity.Pages.Account
{
@@ -23,13 +23,13 @@ namespace My.ProjectName.Areas.Identity.Pages.Account
private readonly SignInManager<IdentityUser> _signInManager;
private readonly UserManager<IdentityUser> _userManager;
private readonly ILogger<RegisterModel> _logger;
private readonly EmailService.IEmailSender _emailSender;
private readonly Services.EmailService.IEmailSender _emailSender;
public RegisterModel(
UserManager<IdentityUser> userManager,
SignInManager<IdentityUser> signInManager,
ILogger<RegisterModel> logger,
EmailService.IEmailSender emailSender)
Services.EmailService.IEmailSender emailSender)
{
_userManager = userManager;
_signInManager = signInManager;
@@ -10,7 +10,7 @@ using Microsoft.AspNetCore.Identity.UI.Services;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.WebUtilities;
using EmailService;
using My.ProjectName.Services.EmailService;
namespace My.ProjectName.Areas.Identity.Pages.Account
{
@@ -18,9 +18,9 @@ namespace My.ProjectName.Areas.Identity.Pages.Account
public class ResendEmailConfirmationModel : PageModel
{
private readonly UserManager<IdentityUser> _userManager;
private readonly EmailService.IEmailSender _emailSender;
private readonly Services.EmailService.IEmailSender _emailSender;
public ResendEmailConfirmationModel(UserManager<IdentityUser> userManager, EmailService.IEmailSender emailSender)
public ResendEmailConfirmationModel(UserManager<IdentityUser> userManager, Services.EmailService.IEmailSender emailSender)
{
_userManager = userManager;
_emailSender = emailSender;
+3 -5
View File
@@ -8,6 +8,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="5.0.4" />
<PackageReference Include="Microsoft.AspNetCore.Http.Features" Version="5.0.4" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="5.0.4" />
<PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="5.0.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.4" />
@@ -17,9 +18,10 @@
</PackageReference>
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.10.13" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="5.0.2" />
<PackageReference Include="NETCore.MailKit" Version="2.0.3" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="5.0.2" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL.Design" Version="1.1.0" />
<PackageReference Include="Serilog.AspNetCore" Version="4.0.0" />
<PackageReference Include="Serilog.AspNetCore" Version="4.1.0" />
<PackageReference Include="Serilog.Enrichers.Environment" Version="2.1.3" />
<PackageReference Include="Serilog.Exceptions" Version="6.1.0" />
<PackageReference Include="Serilog.Exceptions.EntityFrameworkCore" Version="6.1.0" />
@@ -27,8 +29,4 @@
<PackageReference Include="Serilog.Sinks.Elasticsearch" Version="8.4.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\EmailService\EmailService.csproj" />
</ItemGroup>
</Project>
@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace My.ProjectName.Services.EmailService
{
public class EmailConfiguration
{
public string From { get; set; }
public string SmtpServer { get; set; }
public int Port { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
}
}
@@ -0,0 +1,111 @@
using MailKit.Net.Smtp;
using MimeKit;
using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
namespace My.ProjectName.Services.EmailService
{
public class EmailSender : IEmailSender
{
private readonly EmailConfiguration _emailConfig;
public EmailSender(EmailConfiguration emailConfig)
{
_emailConfig = emailConfig;
}
public void SendEmail(Message message)
{
var emailMessage = CreateEmailMessage(message);
Send(emailMessage);
}
public async Task SendEmailAsync(Message message)
{
var mailMessage = CreateEmailMessage(message);
await SendAsync(mailMessage);
}
private MimeMessage CreateEmailMessage(Message message)
{
var emailMessage = new MimeMessage();
emailMessage.From.Add(new MailboxAddress(_emailConfig.From));
emailMessage.To.AddRange(message.To);
emailMessage.Subject = message.Subject;
var bodyBuilder = new BodyBuilder { HtmlBody = string.Format("<h2 style='color:red;'>{0}</h2>", message.Content) };
if (message.Attachments != null && message.Attachments.Any())
{
byte[] fileBytes;
foreach (var attachment in message.Attachments)
{
using (var ms = new MemoryStream())
{
attachment.CopyTo(ms);
fileBytes = ms.ToArray();
}
bodyBuilder.Attachments.Add(attachment.FileName, fileBytes, ContentType.Parse(attachment.ContentType));
}
}
emailMessage.Body = bodyBuilder.ToMessageBody();
return emailMessage;
}
private void Send(MimeMessage mailMessage)
{
using (var client = new SmtpClient())
{
try
{
client.Connect(_emailConfig.SmtpServer, _emailConfig.Port, true);
client.AuthenticationMechanisms.Remove("XOAUTH2");
client.Authenticate(_emailConfig.UserName, _emailConfig.Password);
client.Send(mailMessage);
}
catch
{
//log an error message or throw an exception, or both.
throw;
}
finally
{
client.Disconnect(true);
client.Dispose();
}
}
}
private async Task SendAsync(MimeMessage mailMessage)
{
using (var client = new SmtpClient())
{
try
{
await client.ConnectAsync(_emailConfig.SmtpServer, _emailConfig.Port, true);
client.AuthenticationMechanisms.Remove("XOAUTH2");
await client.AuthenticateAsync(_emailConfig.UserName, _emailConfig.Password);
await client.SendAsync(mailMessage);
}
catch
{
//log an error message or throw an exception, or both.
throw;
}
finally
{
await client.DisconnectAsync(true);
client.Dispose();
}
}
}
}
}
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
namespace My.ProjectName.Services.EmailService
{
public interface IEmailSender
{
void SendEmail(Message message);
Task SendEmailAsync(Message message);
}
}
@@ -0,0 +1,28 @@
using Microsoft.AspNetCore.Http;
using MimeKit;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace My.ProjectName.Services.EmailService
{
public class Message
{
public List<MailboxAddress> To { get; set; }
public string Subject { get; set; }
public string Content { get; set; }
public IFormFileCollection Attachments { get; set; }
public Message(IEnumerable<string> to, string subject, string content, IFormFileCollection attachments = null)
{
To = new List<MailboxAddress>();
To.AddRange(to.Select(x => new MailboxAddress(x)));
Subject = subject;
Content = content;
Attachments = attachments;
}
}
}
+1 -1
View File
@@ -1,4 +1,4 @@
using EmailService;
using My.ProjectName.Services.EmailService;
using My.ProjectName.Data;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;