ASP.NET Core¶
适用于 ASP.NET Core 8+(.NET)应用的集成指南。Mailexam 通过 MailKit 库作为 SMTP 接入。
前置条件¶
从项目的欢迎邮件(或控制台)中复制:
YOUR_LOGIN— SMTP 登录名(例如xxxxx);YOUR_PASSWORD— SMTP 密码(与登录名成对的唯一凭据);- 主机 —
YOUR_LOGIN.mailexam.cn(与登录名一致)。
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、IDE 运行配置,或通过工具使用 .env):
MAILEXAM_LOGIN=YOUR_LOGIN
MAILEXAM_PASSWORD=YOUR_PASSWORD
MAILEXAM_PORT=587
MAIL_FROM=noreply@example.test
SMTP 主机:YOUR_LOGIN.mailexam.cn。
发件人地址
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 ??= "来自 ASP.NET Core 的 Mailexam 测试";
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.cn", 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=YOUR_LOGIN
export MAILEXAM_PASSWORD=YOUR_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 YOUR_LOGIN
dotnet user-secrets set MAILEXAM_PASSWORD YOUR_PASSWORD
要在开发环境将 secrets 作为环境变量读取,可添加 Microsoft.Extensions.Configuration.UserSecrets 包 — 上述示例中 export 或 CI 密钥已足够。
5. 本地开发与 CI¶
| 环境 | 建议 |
|---|---|
local |
User Secrets 或运行配置中的变量 |
| CI | GitLab CI/CD Variables 中的密钥 MAILEXAM_LOGIN、MAILEXAM_PASSWORD |
.gitlab-ci.yml 示例:
variables:
MAILEXAM_LOGIN: $MAILEXAM_LOGIN
MAILEXAM_PASSWORD: $MAILEXAM_PASSWORD
MAILEXAM_PORT: "587"
MAIL_FROM: "noreply@example.test"
集成测试后,通过 Mailexam API 验证投递。
6. 常见问题¶
TLS 或认证失败
- 连接主机 —
{login}.mailexam.cn,AuthenticateAsync中的登录名 — 来自邮件。 - 登录名和密码为同一项目的邮件成对凭据。
587 端口
- 使用
SecureSocketOptions.StartTls,而非SslOnConnect。
控制台中看不到邮件
- 查看同一 Mailexam 项目的收件箱。
- 启用详细日志:在
appsettings.Development.json中设置"Logging:LogLevel:Default": "Debug"。
参见¶
- 示例目录
- ASP.NET Core 实现示例
- Spring Boot — JVM 上的 SMTP
- Mailexam API 文档
- MailKit 文档