ZetCode

C# 发送邮件

最后修改于 2023 年 7 月 5 日

C# 发送邮件教程展示了如何使用 System.Net.Mail 和 Mailkit 在 C# 中发送简单的电子邮件。

SMTP

简单邮件传输协议 (SMTP) 是一种用于电子邮件传输的互联网标准通信协议。邮件服务器和客户端使用 SMTP 发送和接收邮件。

在 C# 中,我们可以使用 System.Net.Mail 和 Mailkit 发送电子邮件。 内置的 System.Net.Mail 可以用于简单的解决方案,而 Mailkit 更适合复杂的任务。

注意: Gmail 不适合测试邮件。 我们应该使用在线服务,例如 Mailtrap 或 Mailgun,或者使用 Webhosting 公司提供的 SMTP 服务器。

在本文中,我们将使用 Maitrap 服务来测试我们的示例。 Mailtrap 为个人测试提供免费计划。

C# 简单邮件示例

在第一个示例中,我们发送一条简单的消息。

Program.cs
using System.Net.Mail;
using System.Net;

var from = "from@example.com";
var to = "to@example.com";
var subject = "Test mail";
var body = "Test body";

var username = "username"; // get from Mailtrap
var password = "password"; // get from Mailtrap

var host = "smtp.mailtrap.io";
var port = 2525;

var client = new SmtpClient(host, port)
{
    Credentials = new NetworkCredential(username, password),
    EnableSsl = true
};

client.Send(from, to, subject, body);

Console.WriteLine("Email sent");

电子邮件使用 SmtpClient 发送。

var from = "from@example.com";
var to = "to@example.com";
var subject = "Test mail";
var body = "Test body";

这些是电子邮件详细信息。

var username = "username"; // get from Mailtrap
var password = "password"; // get from Mailtrap

我们使用从 Mailtrap 服务获得的用户名和密码。

var host = "smtp.mailtrap.io";
var port = 2525;

这是 SMTP 主机和端口。

var client = new SmtpClient(host, port)
{
    Credentials = new NetworkCredential(username, password),
    EnableSsl = true
};

创建一个 SmtpClient,通过它发送电子邮件。

client.Send(from, to, subject, body);

Send 方法将指定的电子邮件消息发送到 SMTP 服务器以进行传递。 消息发送者、收件人、主题和消息正文是字符串值。

C# 电子邮件 JSON 配置

在下一个示例中,我们将展示如何从 JSON 配置文件中读取电子邮件详细信息。

$ dotnet add package Microsoft.Extensions.Configuration.Json

我们添加 Microsoft.Extensions.Configuration.Json 包。

email.json
{
    "Smtp": {
      "Host": "smtp.mailtrap.io",
      "Port": 2525,
      "Username": "username",
      "Password": "password"
    }
  }

这是 JSON 配置文件。

Program.cs
using System.Net.Mail;
using System.Net;
using Microsoft.Extensions.Configuration;

var from = "from@example.com";
var to = "to@example.com";
var subject = "Test mail";
var body = "Test body";

var builder = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("email.json");
var config = builder.Build();

var host = config["Smtp:Host"];
var port = Convert.ToInt32(config["Smtp:Port"]);
var username = config["Smtp:Username"];
var password = config["Smtp:Password"];

var client = new SmtpClient(host, port);
client.Credentials = new NetworkCredential(username, password);
client.EnableSsl = true;

client.Send(from, to, subject, body);

Console.WriteLine("Email sent");

在该示例中,主机、端口、用户名和密码是从 JSON 配置文件中读取的。

C# HTML 电子邮件

在下一个示例中,我们发送 HTML 电子邮件。

Program.cs
using System.Net.Mail;
using System.Net;

var from = new MailAddress("from@example.com");
var to = new MailAddress("to@example.com");
var subject = "HTML email";
var body = "<p>An old <b>falcon</b> in the sky.</p>";

var username = "username"; // get from Mailtrap
var password = "password"; // get from Mailtrap

var host = "smtp.mailtrap.io";
var port = 2525;

var client = new SmtpClient(host, port);
client.Credentials = new NetworkCredential(username, passowrd);
client.EnableSsl = true;

var mail = new MailMessage();
mail.Subject = subject;
mail.From = from;
mail.To.Add(to);
mail.Body = body;
mail.IsBodyHtml = true;

client.Send(mail);

Console.WriteLine("Email sent");

我们使用 MailMessage 发送 HTML 电子邮件。

var mail = new MailMessage();
mail.Subject = subject;
mail.From = from;
mail.To.Add(to);
mail.Body = body;
mail.IsBodyHtml = true;

client.Send(mail);

现在,电子邮件详细信息已设置为 MailMessageIsBodyHtml 指示正文是 HTML 格式。

C# 电子邮件附件

在下一个示例中,我们将一个文本文件附加到电子邮件中。

words.txt
sky
blud
rock
water
poem

我们将此文本文件作为附件发送。

Program.cs
using System.Net.Mail;
using System.Net;

var from = new MailAddress("from@example.com");
var to = new MailAddress("to@example.com");
var subject = "Email with attachment";
var body = "Email body";

var username = "username"; // get from Mailtrap
var password = "password"; // get from Mailtrap

var host = "smtp.mailtrap.io";
var port = 2525;

var client = new SmtpClient(host, port);
client.Credentials = new NetworkCredential(username, passowrd);
client.EnableSsl = true;

var mail = new MailMessage();
mail.Subject = subject;
mail.From = from;
mail.To.Add(to);
mail.Body = body;

var attachment = new Attachment("words.txt");
mail.Attachments.Add(attachment);

client.Send(mail);

Console.WriteLine("Email sent");

我们使用 Attachments 属性和 Attachment 类来发送带有电子邮件的附件。

C# 使用 Mailkit 发送简单邮件

现在,我们使用 Mailkit 库发送一个简单的邮件。

$ dotnet add package Mailkit

我们将 Mailkit 包添加到项目中。

Program.cs
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;

var host = "smtp.mailtrap.io";
var port = 2525;

var username = "username"; // get from Mailtrap
var password = "password"; // get from Mailtrap

var message = new MimeMessage();

message.From.Add(new MailboxAddress("John Doe", "john.doe@example.com"));
message.To.Add(new MailboxAddress("Jane Doe", "jane.doe@example.com"));
message.Subject = "Test subject";

var bodyBuilder = new BodyBuilder();
bodyBuilder.TextBody = "Test body";
message.Body = bodyBuilder.ToMessageBody();

var client = new SmtpClient();

client.Connect(host, port, SecureSocketOptions.Auto);
client.Authenticate(username, password);

client.Send(message);
client.Disconnect(true);

Console.WriteLine("Email sent");

我们使用 MimeMessageBodyBuilderSmtpClient 类来生成电子邮件。 电子邮件使用 Send 发送。

C# 使用 Mailkit 发送 HTML 电子邮件

在下一个示例中,我们发送 HTML 电子邮件。

Program.cs
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;

var host = "smtp.mailtrap.io";
var port = 2525;

var username = "username"; // get from Mailtrap
var password = "password"; // get from Mailtrap

var message = new MimeMessage();

message.From.Add(new MailboxAddress("John Doe", "john.doe@example.com"));
message.To.Add(new MailboxAddress("Jane Doe", "jane.doe@example.com"));
message.Subject = "Test subject";

var bodyBuilder = new BodyBuilder();
bodyBuilder.HtmlBody = "<p>An old <b>falcon</b> in the sky.</p>";
message.Body = bodyBuilder.ToMessageBody();

var client = new SmtpClient();

client.Connect(host, port, SecureSocketOptions.Auto);
client.Authenticate(username, password);

client.Send(message);
client.Disconnect(true);

Console.WriteLine("Email sent");

HTML 正文使用 HtmlBody 属性添加。

来源

System.Net 命名空间

在本文中,我们已经用 C# 发送了简单的电子邮件。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。 我从 2007 年开始撰写编程文章。到目前为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程