diff --git a/src/Email.Tests/Email.Tests.csproj b/src/Email.Tests/Email.Tests.csproj new file mode 100644 index 0000000000000000000000000000000000000000..de237a6820c6a51a940996909608ab5c026f0308 --- /dev/null +++ b/src/Email.Tests/Email.Tests.csproj @@ -0,0 +1,22 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>net6.0</TargetFramework> + <Nullable>enable</Nullable> + + <IsPackable>false</IsPackable> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="Coscine.Configuration" Version="2.1.0" /> + <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.11.0" /> + <PackageReference Include="NUnit" Version="3.13.2" /> + <PackageReference Include="NUnit3TestAdapter" Version="4.0.0" /> + <PackageReference Include="coverlet.collector" Version="3.1.0" /> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\Email\Email.csproj" /> + </ItemGroup> + +</Project> diff --git a/src/Email.Tests/EmailTest.cs b/src/Email.Tests/EmailTest.cs new file mode 100644 index 0000000000000000000000000000000000000000..24bab35c10fb155332e98156e3697f969ca26038 --- /dev/null +++ b/src/Email.Tests/EmailTest.cs @@ -0,0 +1,40 @@ +using NUnit.Framework; +using System; +using System.Threading.Tasks; +using Coscine.Configuration; + +namespace Coscine.Email.Tests +{ + public class EmailTest + { + private static readonly IConfiguration _configuration = new ConsulConfiguration(); + + private static readonly string _port = _configuration.GetStringAndWait("coscine/global/email/port"); + private static readonly string _host = _configuration.GetStringAndWait("coscine/global/email/host"); + private static readonly string _from = _configuration.GetStringAndWait("coscine/global/email/from"); + + private static readonly string to = "westerhoff@itc.rwth-aachen.de"; + private static readonly string mailSubject = "Test Email"; + private static readonly string content = "Das ist eine Test Email."; + + + [Test] + public void SendEmailTest() + { + Email email = new Email(_port, _host, null, null); + bool a = email.SendEmail(_from, to, null, mailSubject, content); + email.Dispose(); + Assert.True(a); + } + + [Test] + public async Task SendEmailAsyncTest() + { + Email email = new Email(_port, _host, null, null); + await email.SendEmailAsync(_from, to, null, mailSubject, content); + email.Dispose(); + Assert.Pass(); + } + + } +} \ No newline at end of file diff --git a/src/Email.sln b/src/Email.sln index 7a34c35ed6d4742b72061d5a65d998263bf76d80..be1df033ba2210b93152da5cea42a8859f7b1d53 100644 --- a/src/Email.sln +++ b/src/Email.sln @@ -1,9 +1,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28803.352 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.32112.339 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Email", "Email/Email.csproj", "{2A331B4B-50C2-43BD-9178-06F138B5E4DB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Email", "Email\Email.csproj", "{2A331B4B-50C2-43BD-9178-06F138B5E4DB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Email.Tests", "Email.Tests\Email.Tests.csproj", "{84D59E93-9BF9-4BCD-A9DF-166ECBAA57B2}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -15,6 +17,10 @@ Global {2A331B4B-50C2-43BD-9178-06F138B5E4DB}.Debug|Any CPU.Build.0 = Debug|Any CPU {2A331B4B-50C2-43BD-9178-06F138B5E4DB}.Release|Any CPU.ActiveCfg = Release|Any CPU {2A331B4B-50C2-43BD-9178-06F138B5E4DB}.Release|Any CPU.Build.0 = Release|Any CPU + {84D59E93-9BF9-4BCD-A9DF-166ECBAA57B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {84D59E93-9BF9-4BCD-A9DF-166ECBAA57B2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {84D59E93-9BF9-4BCD-A9DF-166ECBAA57B2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {84D59E93-9BF9-4BCD-A9DF-166ECBAA57B2}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Email/Email.cs b/src/Email/Email.cs index a0e3e23bc204d7ff1f46247693893691a39b1b5f..dd89fa8e0202145809e176f1a570571a1a80284d 100644 --- a/src/Email/Email.cs +++ b/src/Email/Email.cs @@ -1,37 +1,33 @@ -using System; +using MailKit.Net.Smtp; +using MailKit.Security; +using MimeKit; +using MimeKit.Text; +using System; using System.IO; -using System.Net.Mail; using System.Threading.Tasks; using System.Web; namespace Coscine.Email { - // TODO: Migrate to Mailkit - public class Email : IEmail, IDisposable { private readonly SmtpClient _client; - public Email(string port, string host, string credentialName, string credentialPasswort, bool ssl = false) + public Email(string port, string host, string credentialName, string credentialPassword, bool ssl = false) { _client = new SmtpClient(); - int.TryParse(port, out int portTemp); - _client.Port = portTemp; - _client.DeliveryMethod = SmtpDeliveryMethod.Network; - if (string.IsNullOrWhiteSpace(credentialName)) - { - _client.UseDefaultCredentials = false; - } - else + + bool parsed = int.TryParse(port, out int portTemp); + if (!parsed) { - _client.Credentials = new System.Net.NetworkCredential(credentialName, credentialPasswort); + throw new FormatException("Please check the provided port!"); } - if (ssl) + _client.Connect(host, portTemp, ssl); + if (!string.IsNullOrEmpty(credentialName) && !string.IsNullOrEmpty(credentialPassword)) { - _client.EnableSsl = true; - } - _client.Host = host; + _client.Authenticate(credentialName, credentialPassword); + } } public bool SendEmail(string from, string to, string cc, string mailSubject, Stream content) @@ -43,11 +39,11 @@ namespace Coscine.Email { try { - MailMessage mail = CreateMailMessage(from, to, cc, mailSubject, content); + MimeMessage mail = CreateMailMessage(from, to, cc, mailSubject, content); _client.Send(mail); return true; } - catch (SmtpException) + catch (Exception) { return false; } @@ -60,8 +56,8 @@ namespace Coscine.Email public async Task SendEmailAsync(string from, string to, string cc, string mailSubject, string content) { - MailMessage mail = CreateMailMessage(from, to, cc, mailSubject, content); - await _client.SendMailAsync(mail); + MimeMessage mail = CreateMailMessage(from, to, cc, mailSubject, content); + await _client.SendAsync(mail); } private static string StreamToString(Stream content) @@ -74,22 +70,21 @@ namespace Coscine.Email return s; } - private static MailMessage CreateMailMessage(string from, string to, string cc, string mailSubject, string content) + private static MimeMessage CreateMailMessage(string from, string to, string cc, string mailSubject, string content) { - MailMessage mail = new MailMessage(from, to) - { - Subject = HttpUtility.HtmlDecode(mailSubject), - IsBodyHtml = true - - }; - mail.SubjectEncoding = System.Text.Encoding.UTF8; + MimeMessage email = new MimeMessage(); + + email.From.Add(MailboxAddress.Parse(from)); + email.To.Add(MailboxAddress.Parse(to)); + email.Subject = HttpUtility.HtmlDecode(mailSubject); + email.Body = new TextPart(TextFormat.Html) { Text = content }; if (!string.IsNullOrEmpty(cc)) { - mail.CC.Add(new MailAddress(cc)); + email.Cc.Add(MailboxAddress.Parse(cc)); } - mail.Body = content; - return mail; + + return email; } public void Dispose()