Перейти к содержанию

ASP.NET Core

Инструкция для приложений на ASP.NET Core 8+ (.NET). Mailexam подключается как SMTP через библиотеку MailKit.

Что понадобится

  • Аккаунт Mailexam и проект с SMTP-учётными данными.
  • .NET SDK 8 или новее.

Скопируйте из приветственного письма (или кабинета) для вашего проекта:

  • ВАШ_ЛОГИН — SMTP-логин (например, xxxxx);
  • ВАШ_ПАРОЛЬ — SMTP-пароль (уникальная пара к логину);
  • хост — ВАШ_ЛОГИН.mailexam.ru (совпадает с логином).

1. Зависимости

dotnet new web -n MailexamWeb
cd MailexamWeb
dotnet add package MailKit

Фрагмент 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, а не реальному получателю.

Альтернативные порты

MAILEXAM_PORT=587

SecureSocketOptions.StartTls

MAILEXAM_PORT=2525

STARTTLS, как для 587.

MAILEXAM_PORT=465

SecureSocketOptions.SslOnConnect

MAILEXAM_PORT=25

SecureSocketOptions.None

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.

См. также