在 .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"));
请确认文件路径正确,并且文件已生成或可访问。