From b10ba343e2d2b792ca1f7945d498353007b15160 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 8 Jul 2019 16:18:31 +0300 Subject: [PATCH] added Volo.Abp.MailKit --- framework/Volo.Abp.sln | 11 ++- .../Volo.Abp.MailKit/Volo.Abp.MailKit.csproj | 24 +++++ .../Abp/MailKit/AbpMailKitConfiguration.cs | 9 ++ .../Volo/Abp/MailKit/AbpMailKitModule.cs | 15 +++ .../Abp/MailKit/IAbpMailKitConfiguration.cs | 9 ++ .../Abp/MailKit/IMailKitSmtpEmailSender.cs | 11 +++ .../Abp/MailKit/MailKitSmtpEmailSender.cs | 97 +++++++++++++++++++ 7 files changed, 174 insertions(+), 2 deletions(-) create mode 100644 framework/src/Volo.Abp.MailKit/Volo.Abp.MailKit.csproj create mode 100644 framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/AbpMailKitConfiguration.cs create mode 100644 framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/AbpMailKitModule.cs create mode 100644 framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/IAbpMailKitConfiguration.cs create mode 100644 framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/IMailKitSmtpEmailSender.cs create mode 100644 framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/MailKitSmtpEmailSender.cs diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index 3c3336de1f..ce8f43bbae 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -242,9 +242,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Ldap", "src\Volo.A EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Ldap.Tests", "test\Volo.Abp.Ldap.Tests\Volo.Abp.Ldap.Tests.csproj", "{38FB8F75-426E-4265-8D0E-E121837B6FCC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Dapper", "src\Volo.Abp.Dapper\Volo.Abp.Dapper.csproj", "{D863A3C3-CC1D-426F-BDD4-02E7AE2A3170}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Dapper", "src\Volo.Abp.Dapper\Volo.Abp.Dapper.csproj", "{D863A3C3-CC1D-426F-BDD4-02E7AE2A3170}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Dapper.Tests", "test\Volo.Abp.Dapper.Tests\Volo.Abp.Dapper.Tests.csproj", "{E026A085-D881-4AE0-9F08-422AC3903BD7}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Dapper.Tests", "test\Volo.Abp.Dapper.Tests\Volo.Abp.Dapper.Tests.csproj", "{E026A085-D881-4AE0-9F08-422AC3903BD7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.MailKit", "src\Volo.Abp.MailKit\Volo.Abp.MailKit.csproj", "{0CAED4CC-1CFD-4092-A326-AFE4DB3A9AB4}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -732,6 +734,10 @@ Global {E026A085-D881-4AE0-9F08-422AC3903BD7}.Debug|Any CPU.Build.0 = Debug|Any CPU {E026A085-D881-4AE0-9F08-422AC3903BD7}.Release|Any CPU.ActiveCfg = Release|Any CPU {E026A085-D881-4AE0-9F08-422AC3903BD7}.Release|Any CPU.Build.0 = Release|Any CPU + {0CAED4CC-1CFD-4092-A326-AFE4DB3A9AB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0CAED4CC-1CFD-4092-A326-AFE4DB3A9AB4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0CAED4CC-1CFD-4092-A326-AFE4DB3A9AB4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0CAED4CC-1CFD-4092-A326-AFE4DB3A9AB4}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -857,6 +863,7 @@ Global {38FB8F75-426E-4265-8D0E-E121837B6FCC} = {447C8A77-E5F0-4538-8687-7383196D04EA} {D863A3C3-CC1D-426F-BDD4-02E7AE2A3170} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {E026A085-D881-4AE0-9F08-422AC3903BD7} = {447C8A77-E5F0-4538-8687-7383196D04EA} + {0CAED4CC-1CFD-4092-A326-AFE4DB3A9AB4} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.MailKit/Volo.Abp.MailKit.csproj b/framework/src/Volo.Abp.MailKit/Volo.Abp.MailKit.csproj new file mode 100644 index 0000000000..8af1220e76 --- /dev/null +++ b/framework/src/Volo.Abp.MailKit/Volo.Abp.MailKit.csproj @@ -0,0 +1,24 @@ + + + + + + netstandard2.0 + Volo.Abp.MailKit + Volo.Abp.MailKit + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + false + false + false + + + + + + + + + + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/AbpMailKitConfiguration.cs b/framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/AbpMailKitConfiguration.cs new file mode 100644 index 0000000000..49091b8c82 --- /dev/null +++ b/framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/AbpMailKitConfiguration.cs @@ -0,0 +1,9 @@ +using MailKit.Security; + +namespace Volo.Abp.MailKit +{ + public class AbpMailKitConfiguration : IAbpMailKitConfiguration + { + public SecureSocketOptions? SecureSocketOption { get; set; } + } +} diff --git a/framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/AbpMailKitModule.cs b/framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/AbpMailKitModule.cs new file mode 100644 index 0000000000..1aa0101035 --- /dev/null +++ b/framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/AbpMailKitModule.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Emailing; +using Volo.Abp.Modularity; + +namespace Volo.Abp.MailKit +{ + [DependsOn(typeof(AbpEmailingModule))] + public class AbpMailKitModule : AbpModule + { + + } +} diff --git a/framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/IAbpMailKitConfiguration.cs b/framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/IAbpMailKitConfiguration.cs new file mode 100644 index 0000000000..c590db3774 --- /dev/null +++ b/framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/IAbpMailKitConfiguration.cs @@ -0,0 +1,9 @@ +using MailKit.Security; + +namespace Volo.Abp.MailKit +{ + public interface IAbpMailKitConfiguration + { + SecureSocketOptions? SecureSocketOption { get; set; } + } +} diff --git a/framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/IMailKitSmtpEmailSender.cs b/framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/IMailKitSmtpEmailSender.cs new file mode 100644 index 0000000000..54514814fc --- /dev/null +++ b/framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/IMailKitSmtpEmailSender.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; +using MailKit.Net.Smtp; +using Volo.Abp.Emailing; + +namespace Volo.Abp.MailKit +{ + public interface IMailKitSmtpEmailSender: IEmailSender + { + Task BuildClientAsync(); + } +} diff --git a/framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/MailKitSmtpEmailSender.cs b/framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/MailKitSmtpEmailSender.cs new file mode 100644 index 0000000000..5213a7b7f5 --- /dev/null +++ b/framework/src/Volo.Abp.MailKit/Volo/Abp/MailKit/MailKitSmtpEmailSender.cs @@ -0,0 +1,97 @@ +using System.Net.Mail; +using System.Threading.Tasks; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Emailing; +using Volo.Abp.Emailing.Smtp; +using MailKit.Security; +using Microsoft.Extensions.DependencyInjection; +using MimeKit; +using Volo.Abp.Threading; +using SmtpClient = MailKit.Net.Smtp.SmtpClient; + +namespace Volo.Abp.MailKit +{ + [Dependency(ServiceLifetime.Transient, ReplaceServices = true)] + public class MailKitSmtpEmailSender : EmailSenderBase, IMailKitSmtpEmailSender + { + protected IAbpMailKitConfiguration AbpMailKitConfiguration { get; } + + protected ISmtpEmailSenderConfiguration SmtpConfiguration { get; } + + public MailKitSmtpEmailSender(ISmtpEmailSenderConfiguration smtpConfiguration, + IBackgroundJobManager backgroundJobManager, + IAbpMailKitConfiguration abpMailKitConfiguration) + : base(smtpConfiguration, backgroundJobManager) + { + AbpMailKitConfiguration = abpMailKitConfiguration; + SmtpConfiguration = smtpConfiguration; + } + + protected override async Task SendEmailAsync(MailMessage mail) + { + using (var client = await BuildClientAsync()) + { + var message = MimeMessage.CreateFromMailMessage(mail); + await client.SendAsync(message); + await client.DisconnectAsync(true); + } + } + + protected override void SendEmail(MailMessage mail) + { + using (var client = AsyncHelper.RunSync(BuildClientAsync)) + { + var message = MimeMessage.CreateFromMailMessage(mail); + client.Send(message); + client.Disconnect(true); + } + } + + public async Task BuildClientAsync() + { + var client = new SmtpClient(); + + try + { + await ConfigureClient(client); + return client; + } + catch + { + client.Dispose(); + throw; + } + } + + protected virtual async Task ConfigureClient(SmtpClient client) + { + client.Connect( + await SmtpConfiguration.GetHostAsync(), + await SmtpConfiguration.GetPortAsync(), + await GetSecureSocketOption() + ); + + if (await SmtpConfiguration.GetUseDefaultCredentialsAsync()) + { + return; + } + + client.Authenticate( + await SmtpConfiguration.GetUserNameAsync(), + await SmtpConfiguration.GetPasswordAsync() + ); + } + protected virtual async Task GetSecureSocketOption() + { + if (AbpMailKitConfiguration.SecureSocketOption.HasValue) + { + return AbpMailKitConfiguration.SecureSocketOption.Value; + } + + return await SmtpConfiguration.GetEnableSslAsync() + ? SecureSocketOptions.SslOnConnect + : SecureSocketOptions.StartTlsWhenAvailable; + } + } +}