ASP.NET Core¶
Инструкция для приложений на ASP.NET Core 8+ (.NET). Mailexam подключается как SMTP через библиотеку MailKit.
Что понадобится¶
Скопируйте из приветственного письма (или кабинета) для вашего проекта:
ВАШ_ЛОГИН— SMTP-логин (например,xxxxx);ВАШ_ПАРОЛЬ— SMTP-пароль (уникальная пара к логину);- хост —
ВАШ_ЛОГИН.mailexam.ru(совпадает с логином).
1. Зависимости¶
Фрагмент MailexamWeb.csproj:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MailKit" Version="4.8.0" />
</ItemGroup>
</Project>
2. Переменные окружения¶
Перед запуском задайте переменные (User Secrets, Run Configuration IDE или .env через ваш инструмент):
MAILEXAM_LOGIN=ВАШ_ЛОГИН
MAILEXAM_PASSWORD=ВАШ_ПАРОЛЬ
MAILEXAM_PORT=587
MAIL_FROM=noreply@example.test
Хост SMTP: ВАШ_ЛОГИН.mailexam.ru.
Адрес отправителя
MAIL_FROM может быть любым тестовым адресом — письмо попадёт в Mailexam, а не реальному получателю.
Альтернативные порты¶
3. Сервис отправки¶
Services/MailService.cs:
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
namespace MailexamWeb.Services;
public class MailService
{
public async Task SendTestAsync(string? to, string? subject, string? body, CancellationToken ct = default)
{
var login = Environment.GetEnvironmentVariable("MAILEXAM_LOGIN")
?? throw new InvalidOperationException("MAILEXAM_LOGIN is not set");
var password = Environment.GetEnvironmentVariable("MAILEXAM_PASSWORD")
?? throw new InvalidOperationException("MAILEXAM_PASSWORD is not set");
var port = int.Parse(Environment.GetEnvironmentVariable("MAILEXAM_PORT") ?? "587");
var from = Environment.GetEnvironmentVariable("MAIL_FROM") ?? "noreply@example.test";
to ??= "user@example.test";
subject ??= "ASP.NET Core + Mailexam";
body ??= "Тест Mailexam из ASP.NET Core";
var message = new MimeMessage();
message.From.Add(MailboxAddress.Parse(from));
message.To.Add(MailboxAddress.Parse(to));
message.Subject = subject;
message.Body = new TextPart("plain") { Text = body };
using var client = new SmtpClient();
await client.ConnectAsync($"{login}.mailexam.ru", port, GetSecureSocketOptions(port), ct);
await client.AuthenticateAsync(login, password, ct);
await client.SendAsync(message, ct);
await client.DisconnectAsync(true, ct);
}
private static SecureSocketOptions GetSecureSocketOptions(int port) => port switch
{
465 => SecureSocketOptions.SslOnConnect,
25 => SecureSocketOptions.None,
_ => SecureSocketOptions.StartTls,
};
}
4. Minimal API¶
Program.cs:
using MailexamWeb.Services;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<MailService>();
var app = builder.Build();
app.MapPost("/mail/test", async (SendRequest request, MailService mail, CancellationToken ct) =>
{
await mail.SendTestAsync(request.To, request.Subject, request.Body, ct);
return Results.Ok(new { status = "ok" });
});
app.Run("http://127.0.0.1:8080");
public record SendRequest(string? To, string? Subject, string? Body);
Запуск и проверка:
export MAILEXAM_LOGIN=ВАШ_ЛОГИН
export MAILEXAM_PASSWORD=ВАШ_ПАРОЛЬ
export MAILEXAM_PORT=587
export MAIL_FROM=noreply@example.test
dotnet run
curl -X POST http://127.0.0.1:8080/mail/test \
-H 'Content-Type: application/json' \
-d '{"to":"user@example.test","subject":"Проверка","body":"Привет"}'
Письмо появится в кабинете Mailexam → ваш проект → входящие.
User Secrets (локально)¶
dotnet user-secrets init
dotnet user-secrets set MAILEXAM_LOGIN ВАШ_ЛОГИН
dotnet user-secrets set MAILEXAM_PASSWORD ВАШ_ПАРОЛЬ
Для чтения секретов как переменных окружения в dev можно подключить пакет Microsoft.Extensions.Configuration.UserSecrets — в примере выше достаточно export или секретов CI.
5. Локальная разработка и CI¶
| Среда | Рекомендация |
|---|---|
local |
User Secrets или переменные в Run Configuration |
| CI | секреты MAILEXAM_LOGIN, MAILEXAM_PASSWORD в GitLab CI/CD Variables |
Пример для .gitlab-ci.yml:
variables:
MAILEXAM_LOGIN: $MAILEXAM_LOGIN
MAILEXAM_PASSWORD: $MAILEXAM_PASSWORD
MAILEXAM_PORT: "587"
MAIL_FROM: "noreply@example.test"
После интеграционного теста проверьте доставку через API Mailexam.
6. Типичные проблемы¶
Ошибка TLS или authentication failed
- Хост подключения —
{логин}.mailexam.ru, логин вAuthenticateAsync— из письма. - Логин и пароль — пара из письма одного проекта.
Порт 587
- Используйте
SecureSocketOptions.StartTls, неSslOnConnect.
Письмо не в кабинете
- Смотрите входящие того же проекта Mailexam.
- Включите подробные логи:
"Logging:LogLevel:Default": "Debug"вappsettings.Development.json.