在 .NET 开发中,使用 C# 发送带附件的电子邮件是非常常见的需求,广泛应用于报表推送、合同传输、日志归档等业务场景。相比系统自带的基础邮件类库,开发者常常需要更灵活的方式来添加本地文件、内存流(MemoryStream)或字节数组作为邮件附件,并支持配置各类 SMTP 服务。
本文将通过实际示例,介绍如何在 C# 中实现发送带附件的邮件,涵盖磁盘文件、内存流、字节流等多种附件添加方式,并提供完整的配置流程。教程适用于 C# 控制台应用、ASP.NET 网站等多种 .NET 应用,帮助你快速掌握 C# 邮件发送与附件处理技巧。
目录
- 1. 邮件处理组件安装
- 2. 用 C# 从本地磁盘添加附件发送邮件
- 3. 从内存流或字节数组添加附件
- 4. 完整示例:发送个性化内容与附件的邮件
- 5. 常见错误与解决方法
- 6. 总结
- 7. 常见问题解答(FAQ)
1. 邮件处理环境配置:Spire.Email 组件安装
Spire.Email for .NET 是一款专为 .NET 平台设计的邮件开发库,支持邮件的创建、发送、接收及管理。无需依赖客户端或其他外部工具,即可处理 SMTP、POP3 和 IMAP 协议,并支持附件、HTML 正文、内嵌资源等常见邮件功能。
安装方式
可通过 NuGet 安装:
Install-Package Spire.Email
也可以从官方页面下载 Spire.Email for .NET 并手动集成到项目中。
2. 用 C# 从本地磁盘添加附件发送邮件
在自动化报表分发、文档传输等场景中,邮件附件功能非常常见。本节展示如何将本地的 PDF 文件作为邮件附件发送。
主要流程包括:
- 设置发件人、收件人地址
- 创建带 HTML 格式的邮件正文
- 使用 Attachment 类添加附件
- 配置 SMTP 客户端并进行身份验证
以下是具体示例代码:
using Spire.Email;
using Spire.Email.Smtp;
class Program
{
static void Main()
{
try
{
// 创建发件人、收件人和抄送人的地址对象
MailAddress addressFrom = new MailAddress("该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。", "发件人");
MailAddress addressTo = new MailAddress("该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。", "收件人");
MailAddress addressCc = new MailAddress("该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。", "抄送人");
// 创建邮件对象并设置发件人和收件人地址
MailMessage message = new MailMessage(addressFrom, addressTo);
// 添加抄送人
message.Cc.Add(addressCc);
// 设置邮件主题和正文(中文格式)
message.Subject = "2025年6月月度报告";
message.BodyHtml =
"<div style='font-family:Microsoft YaHei, sans-serif; font-size:14px; color:#333; line-height:1.8;'>" +
"<p>尊敬的收件人:</p>" +
"<p>  您好!现将2025年6月的月度报告发送给您,详见附件 <strong style='color:#2E86C1;'>Sample.pdf</strong>。</p>" +
"<p>  如您在查阅过程中有任何疑问,欢迎随时与我联系。</p>" +
"<p>  感谢您的支持与配合!</p>" +
"<p style='margin-top:30px;'>此致</p>" +
"<p>敬礼!</p>" +
"<p style='margin-top:20px;'>发件人</p>" +
"<p>2025年6月26日</p>" +
"</div>";
// 添加附件
string filePath = @"Sample.pdf";
Attachment attachment = new Attachment(filePath);
message.Attachments.Add(attachment);
// 配置SMTP客户端
SmtpClient smtp = new SmtpClient();
smtp.Host = "smtp.yourcompany.com"; // SMTP服务器地址
smtp.Port = 587; // SMTP端口
smtp.Username = "your_username"; // 登录用户名
smtp.Password = "your_password"; // 登录密码
smtp.ConnectionProtocols = ConnectionProtocols.StartTls;
// 发送邮件
smtp.SendOne(message);
Console.WriteLine("邮件发送成功。");
}
catch (Exception ex)
{
Console.WriteLine("邮件发送失败。");
Console.WriteLine("错误信息: " + ex.Message);
}
}
}
以下为发送成功的邮件截图:
你可能还感兴趣:使用 C# 添加、提取及删除电子邮件附件
3. 从内存流或字节数组添加附件
在生成报表或图像等内容后,有时无需将文件写入磁盘,而是希望直接从内存发送附件。Spire.Email 支持通过 MemoryStream 或 byte[] 添加附件,适用于 Web API、自动化任务等场景。
从 MemoryStream 添加 PDF 文件
using System.IO;
using Spire.Email;
String filePath = @"Sample.pdf";
MemoryStream stream = new MemoryStream(File.ReadAllBytes(filePath));
Attachment attachment = new Attachment(stream, Path.GetFileName(filePath));
message.Attachments.Add(attachment);
从字节数组添加附件:
String filePath = @"Sample.pdf";
byte[] fileBytes = File.ReadAllBytes(filePath);
MemoryStream memStream = new MemoryStream(fileBytes);
Attachment imgAttachment = new Attachment(memStream, Path.GetFileName(filePath));
message.Attachments.Add(imgAttachment);
? 提示:通过 MemoryStream 或 byte[] 添加附件时,请确保为附件名添加正确的文件扩展名(如 .pdf、.xlsx 等),以确保能正确识别文件类型。
相关文章:如何使用 C# 接受和保存邮件
4. 完整示例:发送个性化内容与附件的邮件
在实际项目中,常需批量发送包含个性化称呼、正文及多种附件的邮件。例如向多个客户发送不同的报表或通知。Spire.Email 提供灵活的 API 支持多收件人、动态内容生成、附件管理等复杂需求。
以下示例展示了如何向多个客户发送状态报告,包含个性化问候语,并附上 PDF 或 Excel 附件。
using Spire.Email;
using Spire.Email.Smtp;
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// 定义发件人
MailAddress addressFrom = new MailAddress("该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。", "发件人");
// 定义收件人列表
List<MailAddress> recipients = new List<MailAddress>
{
new MailAddress("该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。", "收件人1"),
new MailAddress("该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。", "收件人2"),
new MailAddress("该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。", "收件人3")
};
// 附件文件
string[] attachmentFiles = { @"Sample.pdf", @"Sample.xlsx" };
// 配置SMTP客户端
SmtpClient smtp = new SmtpClient();
smtp.Host = "smtp.yourcompany.com";
smtp.Port = 587;
smtp.Username = "your_username";
smtp.Password = "your_password";
smtp.ConnectionProtocols = ConnectionProtocols.StartTls;
// 循环发送邮件
foreach (var recipient in recipients)
{
try
{
// 为每个收件人创建邮件
MailMessage message = new MailMessage(addressFrom, recipient);
message.Subject = "2025年第二季度项目进展报告";
// 中文称呼
string displayName = string.IsNullOrEmpty(recipient.DisplayName) ? "收件人" : recipient.DisplayName;
// 设置邮件正文
message.BodyHtml = $@"
<div style='font-family:Microsoft YaHei, sans-serif; font-size:14px; color:#333; line-height:1.8;'>
<p>{displayName}:</p>
<p>  您好!附件为2025年第二季度项目进展报告,内容包括:</p>
<ul style='padding-left:20px;'>
<li>已完成的里程碑</li>
<li>待完成的任务</li>
<li>关键发现与分析</li>
</ul>
<p>  如您有任何疑问,欢迎随时联系我,我们也可安排时间进一步沟通。</p>
<p style='margin-top:30px;'>此致</p>
<p>敬礼!</p>
<p style='margin-top:20px;'>发件人</p>
<p>2025年6月26日</p>
</div>";
// 添加多个附件
foreach (string file in attachmentFiles)
{
Attachment attachment = new Attachment(file);
message.Attachments.Add(attachment);
}
// 发送邮件
smtp.SendOne(message);
Console.WriteLine($"邮件已发送至:{recipient.Address}");
}
catch (Exception ex)
{
Console.WriteLine($"发送到 {recipient.Address} 失败。");
Console.WriteLine("错误信息: " + ex.Message);
}
}
}
}
此代码适用于 C# 控制台应用、ASP.NET 应用 或任何需要发送邮件功能的 .NET 项目。
生成的邮件效果如下图所示:
5. 常见错误与解决方法
- SMTP 登录失败:检查用户名、密码、端口号及加密协议设置是否正确
- 端口被限制:建议使用端口 587(TLS)或 465(SSL)
- 附件体积过大:可压缩文件或限制大小
- 账号安全性:避免将敏感信息硬编码,推荐使用配置文件或环境变量
- 文件类型识别失败:通过内存流添加附件时,确保文件名包含后缀名
6. 总结
本文详细介绍了如何在 C# 中使用 Spire.Email 发送带附件的邮件,包括基本邮件构建、从内存中添加附件、配置 SMTP 服务以及动态批量发送的应用场景。Spire.Email 提供清晰易用的 API,非常适合各类 .NET 项目集成邮件功能。
你可以 联系销售申请免费临时授权,将 Spire.Email 集成到实际项目中试用。
7. 常见问题解答(FAQ)
❓ 如何在 C# 中添加邮件附件?
通过 Spire.Email 的 Attachment 类即可:
message.Attachments.Add(new Attachment(@"file.pdf"));
若文件内容存在于内存中,也可以使用 MemoryStream 或字节数组添加。
❓ 如何发送包含附件的邮件?
在添加附件后,调用 SmtpClient.SendOne() 方法即可发送,注意确保 SMTP 设置正确无误。
❓ 是否支持 .NET Core?
支持。Spire.Email for .NET 兼容 .NET Core、.NET Framework、.NET 5+、.NET Standard、ASP.NET、MonoAndroid 和 Xamarin.iOS,同时支持 C# 和 VB.NET 开发。
❓ 如何发送带 Excel 文件的邮件?
操作方式与其他文件相同,直接添加即可:
message.Attachments.Add(new Attachment(@"report.xlsx"));
请确认文件路径正确,并且文件已生成或可访问。