Skip to content

Commit cba930f

Browse files
authored
Merge pull request #24 from PandaTechAM/development
SMTP user/pass not required
2 parents c835cd8 + e2b83d7 commit cba930f

File tree

5 files changed

+39
-37
lines changed

5 files changed

+39
-37
lines changed

src/Communicator/Communicator.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
<PackageIcon>pandatech.png</PackageIcon>
2222
<PackageReadmeFile>README.md</PackageReadmeFile>
2323

24-
<Version>4.0.1</Version>
25-
<PackageReleaseNotes>Multi-target net8.0/net9.0/net10.0, source-generated logging, removed unused OpenAPI reference, cleaned up models</PackageReleaseNotes>
24+
<Version>4.0.2</Version>
25+
<PackageReleaseNotes>Support email integration with username and password</PackageReleaseNotes>
2626

2727
<!-- Build quality -->
2828
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
@@ -49,8 +49,8 @@
4949
</ItemGroup>
5050

5151
<ItemGroup>
52-
<PackageReference Include="MailKit" Version="4.14.1"/>
53-
<PackageReference Include="MimeKit" Version="4.14.0"/>
52+
<PackageReference Include="MailKit" Version="4.15.1" />
53+
<PackageReference Include="MimeKit" Version="4.15.1" />
5454
</ItemGroup>
5555

5656
<!-- Analyzers -->

src/Communicator/Options/EmailConfiguration.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ public class EmailConfiguration
44
{
55
public required string SmtpServer { get; set; }
66
public int SmtpPort { get; set; }
7-
public required string SmtpUsername { get; set; }
8-
public required string SmtpPassword { get; set; }
7+
public string? SmtpUsername { get; set; }
8+
public string? SmtpPassword { get; set; }
99
public required string SenderEmail { get; set; }
1010
public string? SenderName { get; set; }
1111
public int TimeoutMs { get; set; } = 10000;

src/Communicator/Services/Implementations/EmailService.cs

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,27 @@ private static SmtpClient CreateClient(EmailConfiguration config)
7575
return client;
7676
}
7777

78-
private static async Task ConnectAndAuthAsync(SmtpClient client, EmailConfiguration config, CancellationToken ct)
78+
private static async Task ConnectAndAuthAsync(SmtpClient client,
79+
EmailConfiguration config,
80+
CancellationToken ct)
7981
{
80-
var socketOptions = ResolveSocketOptions(config.SmtpPort);
81-
await client.ConnectAsync(config.SmtpServer, config.SmtpPort, socketOptions, ct);
82+
await client.ConnectAsync(
83+
config.SmtpServer,
84+
config.SmtpPort,
85+
ResolveSocketOptions(config.SmtpPort),
86+
ct);
8287

83-
if (!string.IsNullOrWhiteSpace(config.SmtpUsername))
88+
var hasUser = !string.IsNullOrWhiteSpace(config.SmtpUsername);
89+
var hasPass = !string.IsNullOrWhiteSpace(config.SmtpPassword);
90+
91+
if (hasUser != hasPass)
8492
{
85-
await client.AuthenticateAsync(config.SmtpUsername, config.SmtpPassword, ct);
93+
throw new InvalidOperationException("SMTP username and password must both be set or both be empty.");
94+
}
95+
96+
if (hasUser)
97+
{
98+
await client.AuthenticateAsync(config.SmtpUsername!, config.SmtpPassword!, ct);
8699
}
87100
}
88101

@@ -98,36 +111,25 @@ private static SecureSocketOptions ResolveSocketOptions(int port)
98111

99112
private static MimeMessage CreateMimeMessage(EmailConfiguration config, EmailMessage emailMessage)
100113
{
101-
var senderEmail = !string.IsNullOrWhiteSpace(config.SenderEmail) ? config.SenderEmail : config.SmtpUsername;
114+
if (string.IsNullOrWhiteSpace(config.SenderEmail))
115+
{
116+
throw new InvalidOperationException("SenderEmail is required.");
117+
}
102118

103119
var message = new MimeMessage();
104120

105-
if (!string.IsNullOrWhiteSpace(config.SenderName) && !string.IsNullOrWhiteSpace(senderEmail))
106-
{
107-
message.From.Add(new MailboxAddress(config.SenderName, senderEmail));
108-
}
109-
else if (!string.IsNullOrWhiteSpace(senderEmail))
110-
{
111-
message.From.Add(MailboxAddress.Parse(senderEmail));
112-
}
113-
else
114-
{
115-
throw new InvalidOperationException("SenderEmail (or SmtpUsername fallback) is required.");
116-
}
121+
message.From.Add(!string.IsNullOrWhiteSpace(config.SenderName)
122+
? new MailboxAddress(config.SenderName, config.SenderEmail)
123+
: MailboxAddress.Parse(config.SenderEmail));
117124

118125
message.To.AddRange(ParseDistinct(emailMessage.Recipients));
119126
message.Subject = emailMessage.Subject;
120127

121-
var builder = new BodyBuilder();
122-
123-
if (emailMessage.IsBodyHtml)
128+
var builder = new BodyBuilder
124129
{
125-
builder.HtmlBody = emailMessage.Body;
126-
}
127-
else
128-
{
129-
builder.TextBody = emailMessage.Body;
130-
}
130+
HtmlBody = emailMessage.IsBodyHtml ? emailMessage.Body : null,
131+
TextBody = emailMessage.IsBodyHtml ? null : emailMessage.Body
132+
};
131133

132134
if (emailMessage.Attachments is { Count: > 0 })
133135
{

test/Communicator.Demo/Communicator.Demo.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
</PropertyGroup>
99

1010
<ItemGroup>
11-
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.0.2" />
12-
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.1.0"/>
11+
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="10.0.3" />
12+
<PackageReference Include="Swashbuckle.AspNetCore" Version="10.1.4" />
1313
</ItemGroup>
1414

1515
<ItemGroup>

test/Communicator.Tests/Communicator.Tests.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010
</PropertyGroup>
1111

1212
<ItemGroup>
13-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1"/>
13+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.3.0" />
1414
<PackageReference Include="xunit" Version="2.9.3"/>
1515
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
1616
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1717
<PrivateAssets>all</PrivateAssets>
1818
</PackageReference>
19-
<PackageReference Include="coverlet.collector" Version="6.0.4">
19+
<PackageReference Include="coverlet.collector" Version="8.0.0">
2020
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2121
<PrivateAssets>all</PrivateAssets>
2222
</PackageReference>

0 commit comments

Comments
 (0)