Implement e-mail changes

- Add canonical domain handling
- Bump version
This commit is contained in:
Daniel J. Summers 2023-07-12 20:46:01 -04:00
parent dd5f32e320
commit 39af0fb9a5
7 changed files with 43 additions and 18 deletions

View File

@ -1,2 +1,3 @@
**/bin/*
**/obj/*
**/appsettings.*

View File

@ -1,11 +1,11 @@
<Project>
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<AssemblyVersion>8.1.0.0</AssemblyVersion>
<FileVersion>8.1.0.0</FileVersion>
<AssemblyVersion>8.2.0.0</AssemblyVersion>
<FileVersion>8.2.0.0</FileVersion>
<Authors>danieljsummers</Authors>
<Company>Bit Badger Solutions</Company>
<Version>8.1.0</Version>
<Version>8.2.0</Version>
<DebugType>Embedded</DebugType>
</PropertyGroup>
</Project>

View File

@ -70,6 +70,9 @@ module Configure =
let _ = dsb.UseNodaTime()
Configuration.useDataSource (dsb.Build ())
let emailCfg = cfg.GetSection "Email"
if (emailCfg.GetChildren >> Seq.isEmpty >> not) () then ConfigurationBinder.Bind(emailCfg, Email.smtpOptions)
let _ = svc.AddSingleton<IDistributedCache, DistributedCache> ()
let _ = svc.AddSession ()
let _ = svc.AddAntiforgery ()
@ -182,19 +185,21 @@ module Configure =
|> function l -> l.AddConsole().AddDebug()
|> ignore
open BitBadger.AspNetCore.CanonicalDomains
open Microsoft.Extensions.Localization
open Microsoft.Extensions.Options
/// Configure the application
let app (app : IApplicationBuilder) =
let env = app.ApplicationServices.GetRequiredService<IWebHostEnvironment>()
let env = app.ApplicationServices.GetRequiredService<IWebHostEnvironment> ()
if env.IsDevelopment () then
let _ = app.UseDeveloperExceptionPage ()
()
app.UseDeveloperExceptionPage ()
else
let _ = app.UseGiraffeErrorHandler errorHandler
()
app.UseGiraffeErrorHandler errorHandler
|> ignore
let _ = app.UseForwardedHeaders ()
let _ = app.UseCanonicalDomains ()
let _ = app.UseStatusCodePagesWithReExecute "/error/{0}"
let _ = app.UseStaticFiles ()
let _ = app.UseCookiePolicy (CookiePolicyOptions (MinimumSameSitePolicy = SameSiteMode.Strict))

View File

@ -30,23 +30,39 @@ type EmailOptions =
Strings : IStringLocalizer
}
/// The e-mail address from which e-mail is sent
let private fromAddress = "prayer@bitbadger.solutions"
/// Options to use when sending e-mail
type SmtpServerOptions() =
/// The hostname of the SMTP server
member val SmtpHost : string = "localhost" with get, set
open MailKit.Security
open Microsoft.Extensions.Configuration
/// The port over which SMTP communication should occur
member val Port : int = 25 with get, set
/// Whether to use SSL when communicating with the SMTP server
member val UseSsl : bool = false with get, set
/// The authentication to use with the SMTP server
member val Authentication : string = "" with get, set
/// The e-mail address from which messages should be sent
member val FromAddress : string = "prayer@bitbadger.solutions" with get, set
/// The options for the SMTP server
let smtpOptions = SmtpServerOptions ()
/// Get an SMTP client connection
let getConnection (cfg : IConfiguration) = task {
let getConnection () = task {
let client = new SmtpClient ()
do! client.ConnectAsync (cfg.GetConnectionString "SmtpServer", 25, SecureSocketOptions.None)
do! client.ConnectAsync (smtpOptions.SmtpHost, smtpOptions.Port, smtpOptions.UseSsl)
do! client.AuthenticateAsync (smtpOptions.FromAddress, smtpOptions.Authentication)
return client
}
/// Create a mail message object, filled with everything but the body content
let createMessage opts =
let msg = new MimeMessage ()
msg.From.Add (MailboxAddress (opts.Group.Preferences.EmailFromName, fromAddress))
msg.From.Add (MailboxAddress (opts.Group.Preferences.EmailFromName, smtpOptions.FromAddress))
msg.Subject <- opts.Subject
msg.ReplyTo.Add (MailboxAddress (opts.Group.Preferences.EmailFromName, opts.Group.Preferences.EmailFromAddress))
msg

View File

@ -88,7 +88,7 @@ let email date : HttpHandler = requireAccess [ User ] >=> fun next ctx -> task {
let! list = generateRequestList ctx listDate
let group = ctx.Session.CurrentGroup.Value
let! recipients = Members.forGroup group.Id
use! client = Email.getConnection (ctx.GetService<IConfiguration> ())
use! client = Email.getConnection ()
do! Email.sendEmails
{ Client = client
Recipients = recipients
@ -98,6 +98,7 @@ let email date : HttpHandler = requireAccess [ User ] >=> fun next ctx -> task {
PlainTextBody = list.AsText s
Strings = s
}
do! client.DisconnectAsync true
return!
viewInfo ctx
|> Views.PrayerRequest.email { list with Recipients = recipients }

View File

@ -24,6 +24,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="BitBadger.AspNetCore.CanonicalDomains" Version="1.0.0" />
<PackageReference Include="Giraffe.Htmx" Version="1.9.2" />
<PackageReference Include="NodaTime.Serialization.JsonNet" Version="3.0.1" />
<PackageReference Update="FSharp.Core" Version="7.0.300" />

View File

@ -269,7 +269,7 @@ let sendAnnouncement : HttpHandler = requireAccess [ User ] >=> validateCsrf >=>
return users |> List.map (fun u -> { Member.empty with Name = u.Name; Email = u.Email })
else return! Members.forGroup group.Id
}
use! client = Email.getConnection (ctx.GetService<IConfiguration> ())
use! client = Email.getConnection ()
do! Email.sendEmails
{ Client = client
Recipients = recipients
@ -280,6 +280,7 @@ let sendAnnouncement : HttpHandler = requireAccess [ User ] >=> validateCsrf >=>
PlainTextBody = plainText
Strings = s
}
do! client.DisconnectAsync true
// Add to the request list if desired
match model.SendToClass, model.AddToRequestList with
| "N", _