mirror of
https://github.com/bitwarden/server.git
synced 2025-07-02 16:42:50 -05:00
remove markdown and razor mail templates/services
This commit is contained in:
@ -1,201 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Bit.Core.Models.Table;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace Bit.Core.Services
|
||||
{
|
||||
public class BackupMailService : IMailService
|
||||
{
|
||||
private readonly IMailService _primaryMailService;
|
||||
private readonly IMailService _backupMailService;
|
||||
private readonly ILogger<BackupMailService> _logger;
|
||||
|
||||
public BackupMailService(
|
||||
GlobalSettings globalSettings,
|
||||
IMailDeliveryService mailDeliveryService,
|
||||
ILogger<BackupMailService> logger)
|
||||
{
|
||||
_primaryMailService = new RazorMailService(globalSettings, mailDeliveryService);
|
||||
_backupMailService = new MarkdownMailService(globalSettings, mailDeliveryService);
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task SendVerifyEmailEmailAsync(string email, Guid userId, string token)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _primaryMailService.SendVerifyEmailEmailAsync(email, userId, token);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
LogError(e);
|
||||
await _backupMailService.SendVerifyEmailEmailAsync(email, userId, token);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task SendVerifyDeleteEmailAsync(string email, Guid userId, string token)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _primaryMailService.SendVerifyDeleteEmailAsync(email, userId, token);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
LogError(e);
|
||||
await _backupMailService.SendVerifyDeleteEmailAsync(email, userId, token);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task SendChangeEmailAlreadyExistsEmailAsync(string fromEmail, string toEmail)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _primaryMailService.SendChangeEmailAlreadyExistsEmailAsync(fromEmail, toEmail);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
LogError(e);
|
||||
await _backupMailService.SendChangeEmailAlreadyExistsEmailAsync(fromEmail, toEmail);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task SendChangeEmailEmailAsync(string newEmailAddress, string token)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _primaryMailService.SendChangeEmailEmailAsync(newEmailAddress, token);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
LogError(e);
|
||||
await _backupMailService.SendChangeEmailEmailAsync(newEmailAddress, token);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task SendTwoFactorEmailAsync(string email, string token)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _primaryMailService.SendTwoFactorEmailAsync(email, token);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
LogError(e);
|
||||
await _backupMailService.SendTwoFactorEmailAsync(email, token);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task SendMasterPasswordHintEmailAsync(string email, string hint)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _primaryMailService.SendMasterPasswordHintEmailAsync(email, hint);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
LogError(e);
|
||||
await _backupMailService.SendMasterPasswordHintEmailAsync(email, hint);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task SendNoMasterPasswordHintEmailAsync(string email)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _primaryMailService.SendNoMasterPasswordHintEmailAsync(email);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
LogError(e);
|
||||
await _backupMailService.SendNoMasterPasswordHintEmailAsync(email);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task SendOrganizationAcceptedEmailAsync(string organizationName, string userEmail,
|
||||
IEnumerable<string> adminEmails)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _primaryMailService.SendOrganizationAcceptedEmailAsync(organizationName, userEmail, adminEmails);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
LogError(e);
|
||||
await _backupMailService.SendOrganizationAcceptedEmailAsync(organizationName, userEmail, adminEmails);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task SendOrganizationConfirmedEmailAsync(string organizationName, string email)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _primaryMailService.SendOrganizationConfirmedEmailAsync(organizationName, email);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
LogError(e);
|
||||
await _backupMailService.SendOrganizationConfirmedEmailAsync(organizationName, email);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task SendOrganizationInviteEmailAsync(string organizationName, OrganizationUser orgUser, string token)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _primaryMailService.SendOrganizationInviteEmailAsync(organizationName, orgUser, token);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
LogError(e);
|
||||
await _backupMailService.SendOrganizationInviteEmailAsync(organizationName, orgUser, token);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task SendPasswordlessSignInAsync(string returnUrl, string token, string email)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _primaryMailService.SendPasswordlessSignInAsync(returnUrl, token, email);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
LogError(e);
|
||||
await _backupMailService.SendPasswordlessSignInAsync(returnUrl, token, email);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task SendWelcomeEmailAsync(User user)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _primaryMailService.SendWelcomeEmailAsync(user);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
LogError(e);
|
||||
await _backupMailService.SendWelcomeEmailAsync(user);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task SendInvoiceUpcomingAsync(string email, decimal amount, DateTime dueDate,
|
||||
List<string> items, bool mentionInvoices)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _primaryMailService.SendInvoiceUpcomingAsync(email, amount, dueDate, items, mentionInvoices);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
LogError(e);
|
||||
await _backupMailService.SendInvoiceUpcomingAsync(email, amount, dueDate, items, mentionInvoices);
|
||||
}
|
||||
}
|
||||
|
||||
private void LogError(Exception e)
|
||||
{
|
||||
_logger.LogError(e, "Error sending mail with primary service, using backup.");
|
||||
}
|
||||
}
|
||||
}
|
@ -1,245 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Bit.Core.Models.Table;
|
||||
using Bit.Core.Models.Mail;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Reflection;
|
||||
using Bit.Core.Utilities;
|
||||
|
||||
namespace Bit.Core.Services
|
||||
{
|
||||
public class MarkdownMailService : IMailService
|
||||
{
|
||||
private const string Namespace = "Bit.Core.MailTemplates.Markdown";
|
||||
|
||||
private readonly GlobalSettings _globalSettings;
|
||||
private readonly IMailDeliveryService _mailDeliveryService;
|
||||
|
||||
public MarkdownMailService(
|
||||
GlobalSettings globalSettings,
|
||||
IMailDeliveryService mailDeliveryService)
|
||||
{
|
||||
_globalSettings = globalSettings;
|
||||
_mailDeliveryService = mailDeliveryService;
|
||||
}
|
||||
|
||||
public async Task SendVerifyEmailEmailAsync(string email, Guid userId, string token)
|
||||
{
|
||||
var model = new Dictionary<string, string>
|
||||
{
|
||||
["url"] = string.Format("{0}/verify-email?userId={1}&token={2}",
|
||||
_globalSettings.BaseServiceUri.VaultWithHash, userId, WebUtility.UrlEncode(token))
|
||||
};
|
||||
|
||||
var message = await CreateMessageAsync("Verify Your Email", email, "VerifyEmail", model);
|
||||
message.MetaData.Add("SendGridBypassListManagement", true);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendVerifyDeleteEmailAsync(string email, Guid userId, string token)
|
||||
{
|
||||
var model = new Dictionary<string, string>
|
||||
{
|
||||
["url"] = string.Format("{0}/verify-recover-delete?userId={1}&token={2}&email={3}",
|
||||
_globalSettings.BaseServiceUri.VaultWithHash,
|
||||
userId,
|
||||
WebUtility.UrlEncode(token),
|
||||
WebUtility.UrlEncode(email)),
|
||||
["email"] = WebUtility.HtmlEncode(email)
|
||||
};
|
||||
|
||||
var message = await CreateMessageAsync("Delete Your Account", email, "VerifyDelete", model);
|
||||
message.MetaData.Add("SendGridBypassListManagement", true);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendChangeEmailAlreadyExistsEmailAsync(string fromEmail, string toEmail)
|
||||
{
|
||||
var model = new Dictionary<string, string>
|
||||
{
|
||||
["fromEmail"] = WebUtility.HtmlEncode(fromEmail),
|
||||
["toEmail"] = WebUtility.HtmlEncode(toEmail),
|
||||
};
|
||||
|
||||
var message = await CreateMessageAsync("Your Email Change", toEmail, "ChangeEmailAlreadyExists", model);
|
||||
message.MetaData.Add("SendGridBypassListManagement", true);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendChangeEmailEmailAsync(string newEmailAddress, string token)
|
||||
{
|
||||
var model = new Dictionary<string, string>
|
||||
{
|
||||
["token"] = token
|
||||
};
|
||||
|
||||
var message = await CreateMessageAsync("Your Email Change", newEmailAddress, "ChangeEmail", model);
|
||||
message.MetaData.Add("SendGridBypassListManagement", true);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendTwoFactorEmailAsync(string email, string token)
|
||||
{
|
||||
var model = new Dictionary<string, string>
|
||||
{
|
||||
["token"] = token
|
||||
};
|
||||
|
||||
var message = await CreateMessageAsync("Your Two-step Login Verification Code", email, "TwoFactorEmail", model);
|
||||
message.MetaData.Add("SendGridBypassListManagement", true);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendMasterPasswordHintEmailAsync(string email, string hint)
|
||||
{
|
||||
var model = new Dictionary<string, string>
|
||||
{
|
||||
["hint"] = WebUtility.HtmlEncode(hint),
|
||||
["vaultUrl"] = _globalSettings.BaseServiceUri.VaultWithHash
|
||||
};
|
||||
|
||||
var message = await CreateMessageAsync("Your Master Password Hint", email, "MasterPasswordHint", model);
|
||||
message.MetaData.Add("SendGridBypassListManagement", true);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendNoMasterPasswordHintEmailAsync(string email)
|
||||
{
|
||||
var message = await CreateMessageAsync("Your Master Password Hint", email, "NoMasterPasswordHint", null);
|
||||
message.MetaData.Add("SendGridBypassListManagement", true);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendOrganizationAcceptedEmailAsync(string organizationName, string userEmail,
|
||||
IEnumerable<string> adminEmails)
|
||||
{
|
||||
var model = new Dictionary<string, string>
|
||||
{
|
||||
["userEmail"] = WebUtility.HtmlEncode(userEmail),
|
||||
["organizationName"] = WebUtility.HtmlEncode(organizationName)
|
||||
};
|
||||
|
||||
var message = await CreateMessageAsync($"User {userEmail} Has Accepted Invite", adminEmails,
|
||||
"OrganizationUserAccepted", model);
|
||||
message.MetaData.Add("SendGridBypassListManagement", true);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendOrganizationConfirmedEmailAsync(string organizationName, string email)
|
||||
{
|
||||
var model = new Dictionary<string, string>
|
||||
{
|
||||
["organizationName"] = WebUtility.HtmlEncode(organizationName)
|
||||
};
|
||||
|
||||
var message = await CreateMessageAsync($"You Have Been Confirmed To {organizationName}", email,
|
||||
"OrganizationUserConfirmed", model);
|
||||
message.MetaData.Add("SendGridBypassListManagement", true);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendOrganizationInviteEmailAsync(string organizationName, OrganizationUser orgUser, string token)
|
||||
{
|
||||
var model = new Dictionary<string, string>
|
||||
{
|
||||
["organizationName"] = WebUtility.HtmlEncode(organizationName),
|
||||
["url"] = string.Format("{0}/accept-organization?organizationId={1}&organizationUserId={2}" +
|
||||
"&email={3}&organizationName={4}&token={5}",
|
||||
_globalSettings.BaseServiceUri.VaultWithHash,
|
||||
orgUser.OrganizationId,
|
||||
orgUser.Id,
|
||||
WebUtility.UrlEncode(orgUser.Email),
|
||||
WebUtility.UrlEncode(organizationName),
|
||||
WebUtility.UrlEncode(token))
|
||||
};
|
||||
|
||||
var message = await CreateMessageAsync($"Join {organizationName}", orgUser.Email, "OrganizationUserInvited", model);
|
||||
message.MetaData.Add("SendGridBypassListManagement", true);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendWelcomeEmailAsync(User user)
|
||||
{
|
||||
var model = new Dictionary<string, string>
|
||||
{
|
||||
["vaultUrl"] = _globalSettings.BaseServiceUri.VaultWithHash
|
||||
};
|
||||
|
||||
var message = await CreateMessageAsync("Welcome", user.Email, "Welcome", model);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendPasswordlessSignInAsync(string returnUrl, string token, string email)
|
||||
{
|
||||
var url = CoreHelpers.ExtendQuery(new Uri($"{_globalSettings.BaseServiceUri.Admin}/login/confirm"),
|
||||
new Dictionary<string, string>
|
||||
{
|
||||
["returnUrl"] = returnUrl,
|
||||
["email"] = email,
|
||||
["token"] = token,
|
||||
});
|
||||
var model = new Dictionary<string, string>
|
||||
{
|
||||
["url"] = url.ToString()
|
||||
};
|
||||
|
||||
var message = await CreateMessageAsync("[Admin] Continue Logging In", email, "PasswordlessSignIn", model);
|
||||
message.MetaData.Add("SendGridBypassListManagement", true);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendInvoiceUpcomingAsync(string email, decimal amount, DateTime dueDate,
|
||||
List<string> items, bool mentionInvoices)
|
||||
{
|
||||
var model = new Dictionary<string, string>
|
||||
{
|
||||
["vaultUrl"] = _globalSettings.BaseServiceUri.VaultWithHash,
|
||||
["dueDate"] = dueDate.ToString("MMM dd, yyyy"),
|
||||
["amountDue"] = amount.ToString("C")
|
||||
};
|
||||
|
||||
var message = await CreateMessageAsync("Your Subscription Will Renew Soon", email,
|
||||
"InvoiceUpcoming", model);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
private async Task<MailMessage> CreateMessageAsync(string subject, string toEmail, string fileName,
|
||||
Dictionary<string, string> model)
|
||||
{
|
||||
return await CreateMessageAsync(subject, new List<string> { toEmail }, fileName, model);
|
||||
}
|
||||
|
||||
private async Task<MailMessage> CreateMessageAsync(string subject, IEnumerable<string> toEmails, string fileName,
|
||||
Dictionary<string, string> model)
|
||||
{
|
||||
var message = new MailMessage
|
||||
{
|
||||
ToEmails = toEmails,
|
||||
Subject = subject,
|
||||
MetaData = new Dictionary<string, object>()
|
||||
};
|
||||
|
||||
var assembly = typeof(MarkdownMailService).GetTypeInfo().Assembly;
|
||||
using(var s = assembly.GetManifestResourceStream($"{Namespace}.{fileName}.md"))
|
||||
using(var sr = new StreamReader(s))
|
||||
{
|
||||
var markdown = await sr.ReadToEndAsync();
|
||||
|
||||
if(model != null)
|
||||
{
|
||||
foreach(var prop in model)
|
||||
{
|
||||
markdown = markdown.Replace($"{{{{{prop.Key}}}}}", prop.Value);
|
||||
}
|
||||
}
|
||||
|
||||
message.HtmlContent = CommonMark.CommonMarkConverter.Convert(markdown);
|
||||
message.TextContent = markdown;
|
||||
}
|
||||
|
||||
return message;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,300 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using Bit.Core.Models.Table;
|
||||
using RazorLight;
|
||||
using Bit.Core.Models.Mail;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using Bit.Core.Utilities;
|
||||
using RazorLight.Razor;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Bit.Core.Services
|
||||
{
|
||||
public class RazorMailService : IMailService
|
||||
{
|
||||
private readonly GlobalSettings _globalSettings;
|
||||
private readonly IRazorLightEngine _engine;
|
||||
private readonly IMailDeliveryService _mailDeliveryService;
|
||||
|
||||
public RazorMailService(
|
||||
GlobalSettings globalSettings,
|
||||
IMailDeliveryService mailDeliveryService)
|
||||
{
|
||||
_globalSettings = globalSettings;
|
||||
_mailDeliveryService = mailDeliveryService;
|
||||
|
||||
|
||||
var factory = new EngineFactory();
|
||||
_engine = factory.Create(new CustomEmbeddedRazorProject());
|
||||
}
|
||||
|
||||
public async Task SendVerifyEmailEmailAsync(string email, Guid userId, string token)
|
||||
{
|
||||
var message = CreateDefaultMessage("Verify Your Email", email);
|
||||
var model = new VerifyEmailModel
|
||||
{
|
||||
Token = WebUtility.UrlEncode(token),
|
||||
UserId = userId,
|
||||
WebVaultUrl = _globalSettings.BaseServiceUri.VaultWithHash,
|
||||
SiteName = _globalSettings.SiteName
|
||||
};
|
||||
message.HtmlContent = await _engine.CompileRenderAsync("VerifyEmail", model);
|
||||
message.TextContent = await _engine.CompileRenderAsync("VerifyEmail.text", model);
|
||||
message.MetaData.Add("SendGridBypassListManagement", true);
|
||||
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendVerifyDeleteEmailAsync(string email, Guid userId, string token)
|
||||
{
|
||||
var message = CreateDefaultMessage("Delete Your Account", email);
|
||||
var model = new VerifyDeleteModel
|
||||
{
|
||||
Token = WebUtility.UrlEncode(token),
|
||||
UserId = userId,
|
||||
WebVaultUrl = _globalSettings.BaseServiceUri.VaultWithHash,
|
||||
SiteName = _globalSettings.SiteName,
|
||||
Email = email,
|
||||
EmailEncoded = WebUtility.UrlEncode(email)
|
||||
};
|
||||
message.HtmlContent = await _engine.CompileRenderAsync("VerifyDelete", model);
|
||||
message.TextContent = await _engine.CompileRenderAsync("VerifyDelete.text", model);
|
||||
message.MetaData.Add("SendGridBypassListManagement", true);
|
||||
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendChangeEmailAlreadyExistsEmailAsync(string fromEmail, string toEmail)
|
||||
{
|
||||
var message = CreateDefaultMessage("Your Email Change", toEmail);
|
||||
var model = new ChangeEmailExistsViewModel
|
||||
{
|
||||
FromEmail = fromEmail,
|
||||
ToEmail = toEmail,
|
||||
WebVaultUrl = _globalSettings.BaseServiceUri.VaultWithHash,
|
||||
SiteName = _globalSettings.SiteName
|
||||
};
|
||||
message.HtmlContent = await _engine.CompileRenderAsync("ChangeEmailAlreadyExists", model);
|
||||
message.TextContent = await _engine.CompileRenderAsync("ChangeEmailAlreadyExists.text", model);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendChangeEmailEmailAsync(string newEmailAddress, string token)
|
||||
{
|
||||
var message = CreateDefaultMessage("Your Email Change", newEmailAddress);
|
||||
var model = new EmailTokenViewModel
|
||||
{
|
||||
Token = token,
|
||||
WebVaultUrl = _globalSettings.BaseServiceUri.VaultWithHash,
|
||||
SiteName = _globalSettings.SiteName
|
||||
};
|
||||
message.HtmlContent = await _engine.CompileRenderAsync("ChangeEmail", model);
|
||||
message.TextContent = await _engine.CompileRenderAsync("ChangeEmail.text", model);
|
||||
message.MetaData.Add("SendGridBypassListManagement", true);
|
||||
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendTwoFactorEmailAsync(string email, string token)
|
||||
{
|
||||
var message = CreateDefaultMessage("Your Two-step Login Verification Code", email);
|
||||
var model = new EmailTokenViewModel
|
||||
{
|
||||
Token = token,
|
||||
WebVaultUrl = _globalSettings.BaseServiceUri.VaultWithHash,
|
||||
SiteName = _globalSettings.SiteName
|
||||
};
|
||||
message.HtmlContent = await _engine.CompileRenderAsync("TwoFactorEmail", model);
|
||||
message.TextContent = await _engine.CompileRenderAsync("TwoFactorEmail.text", model);
|
||||
message.MetaData.Add("SendGridBypassListManagement", true);
|
||||
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendMasterPasswordHintEmailAsync(string email, string hint)
|
||||
{
|
||||
var message = CreateDefaultMessage("Your Master Password Hint", email);
|
||||
var model = new MasterPasswordHintViewModel
|
||||
{
|
||||
Hint = CoreHelpers.SanitizeForEmail(hint),
|
||||
WebVaultUrl = _globalSettings.BaseServiceUri.VaultWithHash,
|
||||
SiteName = _globalSettings.SiteName
|
||||
};
|
||||
message.HtmlContent = await _engine.CompileRenderAsync("MasterPasswordHint", model);
|
||||
message.TextContent = await _engine.CompileRenderAsync("MasterPasswordHint.text", model);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendNoMasterPasswordHintEmailAsync(string email)
|
||||
{
|
||||
var message = CreateDefaultMessage("Your Master Password Hint", email);
|
||||
var model = new BaseMailModel
|
||||
{
|
||||
WebVaultUrl = _globalSettings.BaseServiceUri.VaultWithHash,
|
||||
SiteName = _globalSettings.SiteName
|
||||
};
|
||||
message.HtmlContent = await _engine.CompileRenderAsync("NoMasterPasswordHint", model);
|
||||
message.TextContent = await _engine.CompileRenderAsync("NoMasterPasswordHint.text", model);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendOrganizationAcceptedEmailAsync(string organizationName, string userEmail,
|
||||
IEnumerable<string> adminEmails)
|
||||
{
|
||||
var message = CreateDefaultMessage($"User {userEmail} Has Accepted Invite", adminEmails);
|
||||
var model = new OrganizationUserAcceptedViewModel
|
||||
{
|
||||
OrganizationName = CoreHelpers.SanitizeForEmail(organizationName),
|
||||
UserEmail = userEmail,
|
||||
WebVaultUrl = _globalSettings.BaseServiceUri.VaultWithHash,
|
||||
SiteName = _globalSettings.SiteName
|
||||
};
|
||||
message.HtmlContent = await _engine.CompileRenderAsync("OrganizationUserAccepted", model);
|
||||
message.TextContent = await _engine.CompileRenderAsync("OrganizationUserAccepted.text", model);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendOrganizationConfirmedEmailAsync(string organizationName, string email)
|
||||
{
|
||||
var message = CreateDefaultMessage($"You Have Been Confirmed To {organizationName}", email);
|
||||
var model = new OrganizationUserConfirmedViewModel
|
||||
{
|
||||
OrganizationName = CoreHelpers.SanitizeForEmail(organizationName),
|
||||
WebVaultUrl = _globalSettings.BaseServiceUri.VaultWithHash,
|
||||
SiteName = _globalSettings.SiteName
|
||||
};
|
||||
message.HtmlContent = await _engine.CompileRenderAsync("OrganizationUserConfirmed", model);
|
||||
message.TextContent = await _engine.CompileRenderAsync("OrganizationUserConfirmed.text", model);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendOrganizationInviteEmailAsync(string organizationName, OrganizationUser orgUser, string token)
|
||||
{
|
||||
var message = CreateDefaultMessage($"Join {organizationName}", orgUser.Email);
|
||||
var model = new OrganizationUserInvitedViewModel
|
||||
{
|
||||
OrganizationName = CoreHelpers.SanitizeForEmail(organizationName),
|
||||
Email = WebUtility.UrlEncode(orgUser.Email),
|
||||
OrganizationId = orgUser.OrganizationId.ToString(),
|
||||
OrganizationUserId = orgUser.Id.ToString(),
|
||||
Token = WebUtility.UrlEncode(token),
|
||||
OrganizationNameUrlEncoded = WebUtility.UrlEncode(organizationName),
|
||||
WebVaultUrl = _globalSettings.BaseServiceUri.VaultWithHash,
|
||||
SiteName = _globalSettings.SiteName
|
||||
};
|
||||
message.HtmlContent = await _engine.CompileRenderAsync("OrganizationUserInvited", model);
|
||||
message.TextContent = await _engine.CompileRenderAsync("OrganizationUserInvited.text", model);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendWelcomeEmailAsync(User user)
|
||||
{
|
||||
var message = CreateDefaultMessage("Welcome", user.Email);
|
||||
var model = new BaseMailModel
|
||||
{
|
||||
WebVaultUrl = _globalSettings.BaseServiceUri.VaultWithHash,
|
||||
SiteName = _globalSettings.SiteName
|
||||
};
|
||||
message.HtmlContent = await _engine.CompileRenderAsync("Welcome", model);
|
||||
message.TextContent = await _engine.CompileRenderAsync("Welcome.text", model);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendPasswordlessSignInAsync(string returnUrl, string token, string email)
|
||||
{
|
||||
var message = CreateDefaultMessage("[Admin] Continue Logging In", email);
|
||||
|
||||
var url = CoreHelpers.ExtendQuery(new Uri($"{_globalSettings.BaseServiceUri.Admin}/login/confirm"),
|
||||
new Dictionary<string, string>
|
||||
{
|
||||
["returnUrl"] = returnUrl,
|
||||
["email"] = email,
|
||||
["token"] = token,
|
||||
});
|
||||
var model = new PasswordlessSignInModel
|
||||
{
|
||||
Url = url.ToString()
|
||||
};
|
||||
message.HtmlContent = await _engine.CompileRenderAsync("PasswordlessSignIn", model);
|
||||
message.TextContent = await _engine.CompileRenderAsync("PasswordlessSignIn.text", model);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
public async Task SendInvoiceUpcomingAsync(string email, decimal amount, DateTime dueDate,
|
||||
List<string> items, bool mentionInvoices)
|
||||
{
|
||||
var message = CreateDefaultMessage("Your Subscription Will Renew Soon", email);
|
||||
var model = new InvoiceUpcomingViewModel
|
||||
{
|
||||
WebVaultUrl = _globalSettings.BaseServiceUri.VaultWithHash,
|
||||
SiteName = _globalSettings.SiteName,
|
||||
AmountDue = amount,
|
||||
DueDate = dueDate,
|
||||
Items = items,
|
||||
MentionInvoices = mentionInvoices
|
||||
};
|
||||
message.HtmlContent = await _engine.CompileRenderAsync("InvoiceUpcoming", model);
|
||||
message.TextContent = await _engine.CompileRenderAsync("InvoiceUpcoming.text", model);
|
||||
await _mailDeliveryService.SendEmailAsync(message);
|
||||
}
|
||||
|
||||
private MailMessage CreateDefaultMessage(string subject, string toEmail)
|
||||
{
|
||||
return CreateDefaultMessage(subject, new List<string> { toEmail });
|
||||
}
|
||||
|
||||
private MailMessage CreateDefaultMessage(string subject, IEnumerable<string> toEmails)
|
||||
{
|
||||
return new MailMessage
|
||||
{
|
||||
ToEmails = toEmails,
|
||||
Subject = subject,
|
||||
MetaData = new Dictionary<string, object>()
|
||||
};
|
||||
}
|
||||
|
||||
public class CustomEmbeddedRazorProject : RazorLightProject
|
||||
{
|
||||
public override Task<RazorLightProjectItem> GetItemAsync(string templateKey)
|
||||
{
|
||||
if(string.IsNullOrWhiteSpace(templateKey))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(templateKey));
|
||||
}
|
||||
|
||||
var item = new CustomEmbeddedRazorProjectItem(templateKey);
|
||||
return Task.FromResult(item as RazorLightProjectItem);
|
||||
}
|
||||
|
||||
public override Task<IEnumerable<RazorLightProjectItem>> GetImportsAsync(string templateKey)
|
||||
{
|
||||
return Task.FromResult(Enumerable.Empty<RazorLightProjectItem>());
|
||||
}
|
||||
}
|
||||
|
||||
public class CustomEmbeddedRazorProjectItem : RazorLightProjectItem
|
||||
{
|
||||
private readonly string _fullTemplateKey;
|
||||
private readonly Assembly _assembly;
|
||||
|
||||
public CustomEmbeddedRazorProjectItem(string key)
|
||||
{
|
||||
if(string.IsNullOrWhiteSpace(key))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(key));
|
||||
}
|
||||
|
||||
Key = key;
|
||||
_assembly = GetType().Assembly;
|
||||
_fullTemplateKey = $"Bit.Core.MailTemplates.Razor.{key}.cshtml";
|
||||
}
|
||||
|
||||
public override string Key { get; set; }
|
||||
public override bool Exists => _assembly.GetManifestResourceNames().Any(f => f == _fullTemplateKey);
|
||||
public override Stream Read() => _assembly.GetManifestResourceStream(_fullTemplateKey);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user