-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathProgram.cs
More file actions
154 lines (126 loc) · 5.57 KB
/
Copy pathProgram.cs
File metadata and controls
154 lines (126 loc) · 5.57 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
using System.Diagnostics.CodeAnalysis;
using System.Net;
using System.Net.Http.Headers;
using Mailtrap;
using Mailtrap.Configuration;
using Mailtrap.Emails;
using Mailtrap.Emails.Requests;
using Mailtrap.Emails.Responses;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
/// <summary>
/// Example demonstrating how to use Mailtrap API client with application host (which can be WebApp host as well).
/// </summary>
[SuppressMessage("CodeQuality", "IDE0051:Remove unused private members", Justification = "Example")]
internal sealed class Program
{
private static async Task Main(string[] args)
{
// Default host builder helper loads configuration from appsettings.json,
// appsettings.{Environment}.json, environment variables, user secrets and command-line arguments.
// Alternatively, you could provide in-memory configuration using hostBuilder.Configuration.AddInMemoryCollection().
HostApplicationBuilder hostBuilder = Host.CreateApplicationBuilder(args);
using IHost host = BuildHostWithConfigurationSection(hostBuilder);
ILogger logger = host.Services.GetRequiredService<ILogger<Program>>();
try
{
SendEmailRequest request = SendEmailRequest
.Create()
.From("john.doe@demomailtrap.com", "John Doe")
.To("hero.bill@galaxy.net")
.Subject("Invitation to Earth")
.Text("Dear Bill,\n\nIt will be a great pleasure to see you on our blue planet next weekend.\n\nBest regards, John.");
IMailtrapClient mailtrapClient = host.Services.GetRequiredService<IMailtrapClient>();
SendEmailResponse? response = await mailtrapClient
.Email() // Default client, depends on configuration
.Send(request);
ISendEmailClient transactionalClient = mailtrapClient.Transactional();
response = await transactionalClient.Send(request);
ISendEmailClient bulkClient = mailtrapClient.Bulk();
response = await bulkClient.Send(request);
var inboxId = 1234;
ISendEmailClient testClient = mailtrapClient.Test(inboxId);
response = await testClient.Send(request);
}
catch (Exception ex)
{
logger.LogError(ex, "An error occurred while sending email.");
Environment.FailFast(ex.Message);
throw;
}
}
/// <summary>
/// The simplest case, which uses configuration section from appsettings.json.
/// </summary>
private static IHost BuildHostWithConfigurationSection(HostApplicationBuilder hostBuilder)
{
// Loading config section, which can look like:
//"Mailtrap": {
// "ApiToken": "<API_KEY>"
// "PrettyJson": true
//}
IConfigurationSection config = hostBuilder.Configuration.GetSection("Mailtrap");
// Adding Mailtrap API client services to the container
hostBuilder.Services.AddMailtrapClient(config);
return hostBuilder.Build();
}
/// <summary>
/// Other simple one, which uses configuration delegate to configure Mailtrap API client.
/// </summary>
private static IHost BuildHostWithConfigurationDelegate(HostApplicationBuilder hostBuilder)
{
// For sure you should not hardcode apiKey for security reasons, and use environment variables
// or configuration files instead.
// But in case when some non-standard configuration/secrets storage is used, this can be an option.
var apiKey = "<API-KEY>";
hostBuilder.Services.AddMailtrapClient(options =>
{
options.ApiToken = apiKey;
options.PrettyJson = true;
});
return hostBuilder.Build();
}
/// <summary>
/// Optionally, we can provide preconfigured MaitrapiClientOptions instance.
/// </summary>
private static IHost BuildHostWithExplicitConfiguration(HostApplicationBuilder hostBuilder)
{
var apiKey = "<API-KEY>";
var settings = new MailtrapClientOptions(apiKey);
hostBuilder.Services.AddMailtrapClient(settings);
return hostBuilder.Build();
}
/// <summary>
/// More advanced scenario, where HttpClient is configured with custom fine-grain settings.<br/>
/// It can be used with any of configuration approaches (appsettings.json, delegate, explicit options).
/// </summary>
private static IHost BuildHostWithAdvancedHttpClientConfiguration(HostApplicationBuilder hostBuilder)
{
IConfigurationSection config = hostBuilder.Configuration.GetSection("Mailtrap");
IHttpClientBuilder httpClientBuilder = hostBuilder.Services.AddMailtrapClient(config);
// Adding resilience handler
httpClientBuilder.AddStandardResilienceHandler();
// Configuring HttpClient
httpClientBuilder.ConfigureHttpClient(client =>
{
client.DefaultRequestHeaders.CacheControl = new CacheControlHeaderValue
{
NoCache = true
};
});
// Adding proxy
httpClientBuilder.ConfigurePrimaryHttpMessageHandler(() =>
{
return new HttpClientHandler()
{
Proxy = new WebProxy("proxy.mailtrap.io", 8080),
CheckCertificateRevocationList = true
};
});
// Configure detailed HTTP request logging
httpClientBuilder.AddExtendedHttpClientLogging();
return hostBuilder.Build();
}
}