Implement e-mail changes
- Add canonical domain handling - Bump version
This commit is contained in:
parent
dd5f32e320
commit
39af0fb9a5
@ -1,2 +1,3 @@
|
|||||||
**/bin/*
|
**/bin/*
|
||||||
**/obj/*
|
**/obj/*
|
||||||
|
**/appsettings.*
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
<Project>
|
<Project>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net7.0</TargetFramework>
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
<AssemblyVersion>8.1.0.0</AssemblyVersion>
|
<AssemblyVersion>8.2.0.0</AssemblyVersion>
|
||||||
<FileVersion>8.1.0.0</FileVersion>
|
<FileVersion>8.2.0.0</FileVersion>
|
||||||
<Authors>danieljsummers</Authors>
|
<Authors>danieljsummers</Authors>
|
||||||
<Company>Bit Badger Solutions</Company>
|
<Company>Bit Badger Solutions</Company>
|
||||||
<Version>8.1.0</Version>
|
<Version>8.2.0</Version>
|
||||||
<DebugType>Embedded</DebugType>
|
<DebugType>Embedded</DebugType>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -70,6 +70,9 @@ module Configure =
|
|||||||
let _ = dsb.UseNodaTime()
|
let _ = dsb.UseNodaTime()
|
||||||
Configuration.useDataSource (dsb.Build ())
|
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.AddSingleton<IDistributedCache, DistributedCache> ()
|
||||||
let _ = svc.AddSession ()
|
let _ = svc.AddSession ()
|
||||||
let _ = svc.AddAntiforgery ()
|
let _ = svc.AddAntiforgery ()
|
||||||
@ -182,6 +185,7 @@ module Configure =
|
|||||||
|> function l -> l.AddConsole().AddDebug()
|
|> function l -> l.AddConsole().AddDebug()
|
||||||
|> ignore
|
|> ignore
|
||||||
|
|
||||||
|
open BitBadger.AspNetCore.CanonicalDomains
|
||||||
open Microsoft.Extensions.Localization
|
open Microsoft.Extensions.Localization
|
||||||
open Microsoft.Extensions.Options
|
open Microsoft.Extensions.Options
|
||||||
|
|
||||||
@ -189,12 +193,13 @@ module Configure =
|
|||||||
let app (app : IApplicationBuilder) =
|
let app (app : IApplicationBuilder) =
|
||||||
let env = app.ApplicationServices.GetRequiredService<IWebHostEnvironment> ()
|
let env = app.ApplicationServices.GetRequiredService<IWebHostEnvironment> ()
|
||||||
if env.IsDevelopment () then
|
if env.IsDevelopment () then
|
||||||
let _ = app.UseDeveloperExceptionPage ()
|
app.UseDeveloperExceptionPage ()
|
||||||
()
|
|
||||||
else
|
else
|
||||||
let _ = app.UseGiraffeErrorHandler errorHandler
|
app.UseGiraffeErrorHandler errorHandler
|
||||||
()
|
|> ignore
|
||||||
|
|
||||||
|
let _ = app.UseForwardedHeaders ()
|
||||||
|
let _ = app.UseCanonicalDomains ()
|
||||||
let _ = app.UseStatusCodePagesWithReExecute "/error/{0}"
|
let _ = app.UseStatusCodePagesWithReExecute "/error/{0}"
|
||||||
let _ = app.UseStaticFiles ()
|
let _ = app.UseStaticFiles ()
|
||||||
let _ = app.UseCookiePolicy (CookiePolicyOptions (MinimumSameSitePolicy = SameSiteMode.Strict))
|
let _ = app.UseCookiePolicy (CookiePolicyOptions (MinimumSameSitePolicy = SameSiteMode.Strict))
|
||||||
|
@ -30,23 +30,39 @@ type EmailOptions =
|
|||||||
Strings : IStringLocalizer
|
Strings : IStringLocalizer
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The e-mail address from which e-mail is sent
|
/// Options to use when sending e-mail
|
||||||
let private fromAddress = "prayer@bitbadger.solutions"
|
type SmtpServerOptions() =
|
||||||
|
/// The hostname of the SMTP server
|
||||||
|
member val SmtpHost : string = "localhost" with get, set
|
||||||
|
|
||||||
open MailKit.Security
|
/// The port over which SMTP communication should occur
|
||||||
open Microsoft.Extensions.Configuration
|
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
|
/// Get an SMTP client connection
|
||||||
let getConnection (cfg : IConfiguration) = task {
|
let getConnection () = task {
|
||||||
let client = new SmtpClient ()
|
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
|
return client
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a mail message object, filled with everything but the body content
|
/// Create a mail message object, filled with everything but the body content
|
||||||
let createMessage opts =
|
let createMessage opts =
|
||||||
let msg = new MimeMessage ()
|
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.Subject <- opts.Subject
|
||||||
msg.ReplyTo.Add (MailboxAddress (opts.Group.Preferences.EmailFromName, opts.Group.Preferences.EmailFromAddress))
|
msg.ReplyTo.Add (MailboxAddress (opts.Group.Preferences.EmailFromName, opts.Group.Preferences.EmailFromAddress))
|
||||||
msg
|
msg
|
||||||
|
@ -88,7 +88,7 @@ let email date : HttpHandler = requireAccess [ User ] >=> fun next ctx -> task {
|
|||||||
let! list = generateRequestList ctx listDate
|
let! list = generateRequestList ctx listDate
|
||||||
let group = ctx.Session.CurrentGroup.Value
|
let group = ctx.Session.CurrentGroup.Value
|
||||||
let! recipients = Members.forGroup group.Id
|
let! recipients = Members.forGroup group.Id
|
||||||
use! client = Email.getConnection (ctx.GetService<IConfiguration> ())
|
use! client = Email.getConnection ()
|
||||||
do! Email.sendEmails
|
do! Email.sendEmails
|
||||||
{ Client = client
|
{ Client = client
|
||||||
Recipients = recipients
|
Recipients = recipients
|
||||||
@ -98,6 +98,7 @@ let email date : HttpHandler = requireAccess [ User ] >=> fun next ctx -> task {
|
|||||||
PlainTextBody = list.AsText s
|
PlainTextBody = list.AsText s
|
||||||
Strings = s
|
Strings = s
|
||||||
}
|
}
|
||||||
|
do! client.DisconnectAsync true
|
||||||
return!
|
return!
|
||||||
viewInfo ctx
|
viewInfo ctx
|
||||||
|> Views.PrayerRequest.email { list with Recipients = recipients }
|
|> Views.PrayerRequest.email { list with Recipients = recipients }
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="BitBadger.AspNetCore.CanonicalDomains" Version="1.0.0" />
|
||||||
<PackageReference Include="Giraffe.Htmx" Version="1.9.2" />
|
<PackageReference Include="Giraffe.Htmx" Version="1.9.2" />
|
||||||
<PackageReference Include="NodaTime.Serialization.JsonNet" Version="3.0.1" />
|
<PackageReference Include="NodaTime.Serialization.JsonNet" Version="3.0.1" />
|
||||||
<PackageReference Update="FSharp.Core" Version="7.0.300" />
|
<PackageReference Update="FSharp.Core" Version="7.0.300" />
|
||||||
|
@ -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 })
|
return users |> List.map (fun u -> { Member.empty with Name = u.Name; Email = u.Email })
|
||||||
else return! Members.forGroup group.Id
|
else return! Members.forGroup group.Id
|
||||||
}
|
}
|
||||||
use! client = Email.getConnection (ctx.GetService<IConfiguration> ())
|
use! client = Email.getConnection ()
|
||||||
do! Email.sendEmails
|
do! Email.sendEmails
|
||||||
{ Client = client
|
{ Client = client
|
||||||
Recipients = recipients
|
Recipients = recipients
|
||||||
@ -280,6 +280,7 @@ let sendAnnouncement : HttpHandler = requireAccess [ User ] >=> validateCsrf >=>
|
|||||||
PlainTextBody = plainText
|
PlainTextBody = plainText
|
||||||
Strings = s
|
Strings = s
|
||||||
}
|
}
|
||||||
|
do! client.DisconnectAsync true
|
||||||
// Add to the request list if desired
|
// Add to the request list if desired
|
||||||
match model.SendToClass, model.AddToRequestList with
|
match model.SendToClass, model.AddToRequestList with
|
||||||
| "N", _
|
| "N", _
|
||||||
|
Loading…
Reference in New Issue
Block a user