-
-
Notifications
You must be signed in to change notification settings - Fork 271
Expand file tree
/
Copy pathMailServiceRegistration.cs
More file actions
165 lines (150 loc) · 6.67 KB
/
Copy pathMailServiceRegistration.cs
File metadata and controls
165 lines (150 loc) · 6.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
using System;
using System.Collections.Generic;
using System.Net.Security;
using Coravel.Mailer.Mail;
using Coravel.Mailer.Mail.Interfaces;
using Coravel.Mailer.Mail.Mailers;
using Coravel.Mailer.Mail.Renderers;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace Coravel
{
/// <summary>
/// IServiceCollection extensions for registering Coravel's Mailer.
/// </summary>
public static class MailServiceRegistration
{
/// <summary>
/// Register Coravel's mailer using the IConfiguration to provide all configuration details.
/// </summary>
/// <param name="services"></param>
/// <param name="config"></param>
public static IServiceCollection AddMailer(this IServiceCollection services, IConfiguration config)
{
string mailerType = config.GetValue<string>("Coravel:Mail:Driver", "FileLog");
var strategies = new Dictionary<string, Action>(StringComparer.OrdinalIgnoreCase);
strategies.Add("SMTP", () => AddSmtpMailer(services, config));
strategies.Add("FILELOG", () => AddFileLogMailer(services, config));
strategies[mailerType].Invoke();
return services;
}
public static WebApplicationBuilder AddMailer(this WebApplicationBuilder builder)
{
builder.Services.AddMailer(builder.Configuration);
return builder;
}
/// <summary>
/// Register Coravel's mailer using the File Log Mailer - which sends mail to a file.
/// Useful for testing.
/// </summary>
/// <param name="services"></param>
/// <param name="config"></param>
public static IServiceCollection AddFileLogMailer(this IServiceCollection services, IConfiguration config)
{
var globalFrom = GetGlobalFromRecipient(config);
RazorRenderer renderer = RazorRendererFactory.MakeInstance(config);
var mailer = new FileLogMailer(renderer, globalFrom);
services.AddSingleton<IMailer>(mailer);
return services;
}
public static WebApplicationBuilder AddFileLogMailer(this WebApplicationBuilder builder)
{
builder.Services.AddFileLogMailer(builder.Configuration);
return builder;
}
/// <summary>
/// Register Coravel's mailer using the Smtp Mailer.
/// </summary>
/// <param name="services"></param>
/// <param name="config"></param>
/// <param name="certCallback"></param>
public static IServiceCollection AddSmtpMailer(this IServiceCollection services, IConfiguration config, RemoteCertificateValidationCallback certCallback)
{
var globalFrom = GetGlobalFromRecipient(config);
RazorRenderer renderer = RazorRendererFactory.MakeInstance(config);
IMailer mailer = new SmtpMailer(
renderer,
config.GetValue<string>("Coravel:Mail:Host", ""),
config.GetValue<int>("Coravel:Mail:Port", 0),
config.GetValue<string>("Coravel:Mail:Username", null),
config.GetValue<string>("Coravel:Mail:Password", null),
globalFrom,
certCallback
);
services.AddSingleton<IMailer>(mailer);
return services;
}
public static WebApplicationBuilder AddSmtpMailer(this WebApplicationBuilder builder, RemoteCertificateValidationCallback certCallback)
{
builder.Services.AddSmtpMailer(builder.Configuration, certCallback);
return builder;
}
/// <summary>
/// Register Coravel's mailer using the Smtp Mailer.
/// </summary>
/// <param name="services"></param>
/// <param name="config"></param>
public static IServiceCollection AddSmtpMailer(this IServiceCollection services, IConfiguration config)
{
AddSmtpMailer(services, config, null);
return services;
}
public static WebApplicationBuilder AddSmtpMailer(this WebApplicationBuilder builder)
{
builder.Services.AddSmtpMailer(builder.Configuration);
return builder;
}
/// <summary>
/// Register Coravel's mailer using the Custom Mailer.
/// </summary>
/// <param name="services"></param>
/// <param name="config"></param>
/// <param name="sendMailAsync"></param>
public static IServiceCollection AddCustomMailer(this IServiceCollection services, IConfiguration config, CustomMailer.SendAsyncFunc sendMailAsync)
{
var globalFrom = GetGlobalFromRecipient(config);
RazorRenderer renderer = RazorRendererFactory.MakeInstance(config);
var mailer = new CustomMailer(renderer, sendMailAsync, globalFrom);
services.AddSingleton<IMailer>(mailer);
return services;
}
public static WebApplicationBuilder AddCustomMailer(this WebApplicationBuilder builder, CustomMailer.SendAsyncFunc sendMailAsync)
{
builder.Services.AddCustomMailer(builder.Configuration, sendMailAsync);
return builder;
}
/// <summary>
/// Register Coravel's mailer a Custom Mailer that implements `ICanSendMail`.
/// </summary>
/// <param name="services"></param>
/// <param name="config"></param>
public static IServiceCollection AddCustomMailer<T>(this IServiceCollection services, IConfiguration config) where T : ICanSendMail
{
var globalFrom = GetGlobalFromRecipient(config);
RazorRenderer renderer = RazorRendererFactory.MakeInstance(config);
services.AddSingleton<IMailer>(p =>
new CanSendMailWrapper<T>(renderer, p.GetRequiredService<IServiceScopeFactory>(), globalFrom)
);
return services;
}
public static WebApplicationBuilder AddCustomMailer<T>(this WebApplicationBuilder builder) where T : ICanSendMail
{
builder.Services.AddCustomMailer<T>(builder.Configuration);
return builder;
}
private static MailRecipient GetGlobalFromRecipient(IConfiguration config)
{
string globalFromAddress = config.GetValue<string>("Coravel:Mail:From:Address", null);
string globalFromName = config.GetValue<string>("Coravel:Mail:From:Name", null);
if (globalFromAddress != null)
{
return new MailRecipient(globalFromAddress, globalFromName);
}
else
{
return null;
}
}
}
}