Private Email Service Support (#1028)
* Added ServerSettingKey's for SMTP and moved email service code to Kavita. Nothing integrated in the UI yet. * Undo all the custom SMTP stuff and prepare for custom email service url. * Foundation for email service to use a custom url is setup. * Implemented the ability to hook up custom email url
This commit is contained in:
parent
2517ee75b2
commit
2ae9f8c203
21 changed files with 193 additions and 54 deletions
|
@ -1,10 +1,11 @@
|
|||
using System;
|
||||
using System.Net.Http;
|
||||
using System.Threading.Tasks;
|
||||
using API.Data;
|
||||
using API.DTOs.Email;
|
||||
using API.Services.Tasks;
|
||||
using API.Entities.Enums;
|
||||
using Flurl.Http;
|
||||
using Kavita.Common.EnvironmentInfo;
|
||||
using Kavita.Common.Helpers;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
|
@ -16,25 +17,39 @@ public interface IEmailService
|
|||
Task<bool> CheckIfAccessible(string host);
|
||||
Task SendMigrationEmail(EmailMigrationDto data);
|
||||
Task SendPasswordResetEmail(PasswordResetEmailDto data);
|
||||
Task<bool> TestConnectivity(string emailUrl);
|
||||
}
|
||||
|
||||
public class EmailService : IEmailService
|
||||
{
|
||||
private readonly ILogger<EmailService> _logger;
|
||||
private const string ApiUrl = "https://email.kavitareader.com";
|
||||
private readonly IUnitOfWork _unitOfWork;
|
||||
|
||||
public EmailService(ILogger<EmailService> logger)
|
||||
/// <summary>
|
||||
/// This is used to initially set or reset the ServerSettingKey. Do not access from the code, access via UnitOfWork
|
||||
/// </summary>
|
||||
public const string DefaultApiUrl = "https://email.kavitareader.com";
|
||||
|
||||
public EmailService(ILogger<EmailService> logger, IUnitOfWork unitOfWork)
|
||||
{
|
||||
_logger = logger;
|
||||
_unitOfWork = unitOfWork;
|
||||
|
||||
FlurlHttp.ConfigureClient(ApiUrl, cli =>
|
||||
FlurlHttp.ConfigureClient(DefaultApiUrl, cli =>
|
||||
cli.Settings.HttpClientFactory = new UntrustedCertClientFactory());
|
||||
}
|
||||
|
||||
public async Task<bool> TestConnectivity(string emailUrl)
|
||||
{
|
||||
FlurlHttp.ConfigureClient(emailUrl, cli =>
|
||||
cli.Settings.HttpClientFactory = new UntrustedCertClientFactory());
|
||||
|
||||
return await SendEmailWithGet(emailUrl + "/api/email/test");
|
||||
}
|
||||
|
||||
public async Task SendConfirmationEmail(ConfirmationEmailDto data)
|
||||
{
|
||||
|
||||
var success = await SendEmailWithPost(ApiUrl + "/api/email/confirm", data);
|
||||
var success = await SendEmailWithPost(DefaultApiUrl + "/api/email/confirm", data);
|
||||
if (!success)
|
||||
{
|
||||
_logger.LogError("There was a critical error sending Confirmation email");
|
||||
|
@ -43,17 +58,20 @@ public class EmailService : IEmailService
|
|||
|
||||
public async Task<bool> CheckIfAccessible(string host)
|
||||
{
|
||||
return await SendEmailWithGet(ApiUrl + "/api/email/reachable?host=" + host);
|
||||
// This is the only exception for using the default because we need an external service to check if the server is accessible for emails
|
||||
return await SendEmailWithGet(DefaultApiUrl + "/api/email/reachable?host=" + host);
|
||||
}
|
||||
|
||||
public async Task SendMigrationEmail(EmailMigrationDto data)
|
||||
{
|
||||
await SendEmailWithPost(ApiUrl + "/api/email/email-migration", data);
|
||||
var emailLink = (await _unitOfWork.SettingsRepository.GetSettingAsync(ServerSettingKey.EmailServiceUrl)).Value;
|
||||
await SendEmailWithPost(emailLink + "/api/email/email-migration", data);
|
||||
}
|
||||
|
||||
public async Task SendPasswordResetEmail(PasswordResetEmailDto data)
|
||||
{
|
||||
await SendEmailWithPost(ApiUrl + "/api/email/email-password-reset", data);
|
||||
var emailLink = (await _unitOfWork.SettingsRepository.GetSettingAsync(ServerSettingKey.EmailServiceUrl)).Value;
|
||||
await SendEmailWithPost(emailLink + "/api/email/email-password-reset", data);
|
||||
}
|
||||
|
||||
private static async Task<bool> SendEmailWithGet(string url)
|
||||
|
@ -106,4 +124,5 @@ public class EmailService : IEmailService
|
|||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ using API.DTOs.Stats;
|
|||
using API.Entities.Enums;
|
||||
using Flurl.Http;
|
||||
using Kavita.Common.EnvironmentInfo;
|
||||
using Kavita.Common.Helpers;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
|
|
|
@ -1,14 +1,13 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Threading.Tasks;
|
||||
using API.DTOs.Update;
|
||||
using API.SignalR;
|
||||
using API.SignalR.Presence;
|
||||
using Flurl.Http;
|
||||
using Flurl.Http.Configuration;
|
||||
using Kavita.Common.EnvironmentInfo;
|
||||
using Kavita.Common.Helpers;
|
||||
using MarkdownDeep;
|
||||
using Microsoft.AspNetCore.SignalR;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
|
@ -44,15 +43,6 @@ internal class GithubReleaseMetadata
|
|||
public string Published_At { get; init; }
|
||||
}
|
||||
|
||||
public class UntrustedCertClientFactory : DefaultHttpClientFactory
|
||||
{
|
||||
public override HttpMessageHandler CreateMessageHandler() {
|
||||
return new HttpClientHandler {
|
||||
ServerCertificateCustomValidationCallback = (_, _, _, _) => true
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public interface IVersionUpdaterService
|
||||
{
|
||||
Task<UpdateNotificationDto> CheckForUpdate();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue