
在 .NET 开发中,使用 C# 发送带附件的电子邮件是非常常见的需求,广泛应用于报表推送、合同传输、日志归档等业务场景。相比系统自带的基础邮件类库,开发者常常需要更灵活的方式来添加本地文件、内存流(MemoryStream)或字节数组作为邮件附件,并支持配置各类 SMTP 服务。
本文将通过实际示例,介绍如何在 C# 中实现发送带附件的邮件,涵盖磁盘文件、内存流、字节流等多种附件添加方式,并提供完整的配置流程。教程适用于 C# 控制台应用、ASP.NET 网站等多种 .NET 应用,帮助你快速掌握 C# 邮件发送与附件处理技巧。
目录
Spire.Email for .NET 是一款专为 .NET 平台设计的邮件开发库,支持邮件的创建、发送、接收及管理。无需依赖客户端或其他外部工具,即可处理 SMTP、POP3 和 IMAP 协议,并支持附件、HTML 正文、内嵌资源等常见邮件功能。
可通过 NuGet 安装:
Install-Package Spire.Email
也可以从官方页面下载 Spire.Email for .NET 并手动集成到项目中。
在自动化报表分发、文档传输等场景中,邮件附件功能非常常见。本节展示如何将本地的 PDF 文件作为邮件附件发送。
主要流程包括:
以下是具体示例代码:
using Spire.Email;
using Spire.Email.Smtp;
class Program
{
static void Main()
{
try
{
// 创建发件人、收件人和抄送人的地址对象
MailAddress addressFrom = new MailAddress("user@yourcompany.com", "发件人");
MailAddress addressTo = new MailAddress("recipient@yourcompany.com", "收件人");
MailAddress addressCc = new MailAddress("copy@yourcompany.com", "抄送人");
// 创建邮件对象并设置发件人和收件人地址
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# 添加、提取及删除电子邮件附件
在生成报表或图像等内容后,有时无需将文件写入磁盘,而是希望直接从内存发送附件。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# 接受和保存邮件
在实际项目中,常需批量发送包含个性化称呼、正文及多种附件的邮件。例如向多个客户发送不同的报表或通知。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("user@yourcompany.com", "发件人");
// 定义收件人列表
List<MailAddress> recipients = new List<MailAddress>
{
new MailAddress("sales@clientA.com", "收件人1"),
new MailAddress("manager@clientB.com", "收件人2"),
new MailAddress("support@clientC.com", "收件人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 项目。
生成的邮件效果如下图所示:

本文详细介绍了如何在 C# 中使用 Spire.Email 发送带附件的邮件,包括基本邮件构建、从内存中添加附件、配置 SMTP 服务以及动态批量发送的应用场景。Spire.Email 提供清晰易用的 API,非常适合各类 .NET 项目集成邮件功能。
你可以 联系销售申请免费临时授权,将 Spire.Email 集成到实际项目中试用。
通过 Spire.Email 的 Attachment 类即可:
message.Attachments.Add(new Attachment(@"file.pdf"));
若文件内容存在于内存中,也可以使用 MemoryStream 或字节数组添加。
在添加附件后,调用 SmtpClient.SendOne() 方法即可发送,注意确保 SMTP 设置正确无误。
支持。Spire.Email for .NET 兼容 .NET Core、.NET Framework、.NET 5+、.NET Standard、ASP.NET、MonoAndroid 和 Xamarin.iOS,同时支持 C# 和 VB.NET 开发。
操作方式与其他文件相同,直接添加即可:
message.Attachments.Add(new Attachment(@"report.xlsx"));
请确认文件路径正确,并且文件已生成或可访问。
Spire.Doc for Python 13.6.4 现已正式发布。该版本主要新增了一个功能,即开发或测试授权支持解除绑定。详情请查阅以下内容。
新功能:
from spire.doc.common import *
from spire.doc import *
from spire.doc import LicenseProvider as docLicense
docLicense.SetLicenseKey("key",True)
#testing code
docLicense.UnbindDevelopmentOrTestingLicenses()
Spire.Presentation 10.6.4 现已正式发布。最新版本增强了从 PowerPoint 演示文稿到 PDF 的转换功能。此外,最新版本还修复了 slide 转 SVG ,shape 效果不正确的问题。更多详情请查阅下列内容。
问题修复:
Spire.Doc for Java 13.6.2 现已正式发布。该版本新增对图表标题、数据标签、坐标轴、图例、数据表等格式的读取与设置,优化了表格格式的读取设置功能,并提升了Word 转PDF 的转换性能,在处理大文件或复杂布局时内存使用效率更高。同时,该版本还修复了目录域更新失败、SVG 转换参数无效、文档比较出错等多个问题。详情请阅读以下内容。
新功能:
问题修复:
Spire.DocViewer 8.9.1 现已发布,该版本主要提高了文档在WPF应用中的展示效果。具体更新如下。
问题修复:
Spire.PDF 11.6.14 现已正式发布。该版本增强了PDF到Excel、Markdown和图片的转换,并成功修复了一些在设置字体和绘制阿拉伯文本时出现的问题。详情请查阅以下内容。
问题修复:
Spire.XLS 15.6.6 现已正式发布。最新版本支持 SHEETS 函数。此外,一些已知问题也在本次更新时被成功修复,例如 AutoFitColumns效果不正确的问题。详情请查阅下面的内容。
新功能:
sheet.Range["B2"].Formula = "=SHEETS()";
sheet.Range["B3"].Formula = "=SHEETS(Sheet2!C5)";
sheet.Range["B4"].Formula = "=SHEETS(Sheet3:Sheet5!A1)";
sheet.Range["B6"].Formula = "=SHEETS(Sheet4!C5)";
问题修复:

在 Python 中读取 PDF 文档是实现文档自动化、内容分析和数据提取的基础操作之一。无论你处理的是合同、报告、发票,还是科研论文,能够通过代码访问 PDF 内容,不仅能节省时间,还能带来更高效的处理流程。
要在 Python 中准确提取 PDF 的文本、表格、图像和元数据,一个稳定、功能完善的 PDF 操作库是关键。本文将介绍如何使用 Spire.PDF for Python 实现用 Python 读取 PDF 文档。该库提供简单易用、功能强大的API,无需依赖第三方工具。
目录
Spire.PDF for Python 是一款功能全面的 PDF 读取库,支持通过 Python 代码提取 PDF 中的文本、表格、图像和文档信息。其主要特点包括:
非常适合希望快速集成 PDF 数据读取功能的开发者。
使用 pip 安装 Spire.PDF for Python:
pip install spire.pdf
或安装适用于轻量任务的 Free Spire.PDF for Python:
pip install spire.pdf.free
在读取 PDF 内容之前,需先将其加载到内存中。Spire.PDF 支持从文件路径或内存字节流加载文档,非常适用于处理网页上传或 API 返回的 PDF 数据。
使用 PdfDocument.LoadFromFile() 方法从本地读取 PDF 文件:
from spire.pdf import PdfDocument
# 创建一个 PdfDocument 实例
pdf = PdfDocument()
# 加载一个 PDF 文档
pdf.LoadFromFile("sample.pdf")
如果不希望将文件保存到磁盘,可以先读取字节数据,并使用 Stream 对象加载:
from spire.pdf import PdfDocument, Stream
# 将 PDF 文件读取为字节数组
with open("sample.pdf", "rb") as f:
byte_data = f.read()
# 使用字节数组创建一个流对象
pdfStream = Stream(byte_data)
# 使用流对象创建一个 PdfDocument 实例
pdf = PdfDocument(pdfStream)
更多参考:通过字节流加载和保存 PDF
提取 PDF 中的文本内容是最常见的需求之一。Spire.PDF 提供简单方法,可获取整篇文档或指定页面中的所有可见文本。
遍历每一页,使用 PdfTextExtractor.ExtractText() 提取内容:
from spire.pdf import PdfDocument, PdfTextExtractor, PdfTextExtractOptions
# 创建一个 PdfDocument 实例
pdf = PdfDocument()
# 加载一个 PDF 文档
pdf.LoadFromFile("sample.pdf")
all_text = ""
# 遍历每一页
for pageIndex in range(pdf.Pages.Count):
page = pdf.Pages.get_Item(pageIndex)
# 创建一个 PdfTextExtractor 实例
text_extractor = PdfTextExtractor(page)
# 配置提取选项
options = PdfTextExtractOptions()
options.IsExtractAllText = True
options.IsSimpleExtraction = True
# 从当前页面提取文本
all_text += text_extractor.ExtractText(options)
# 打印提取到的全部文本
print(all_text)

如只需获取页面中某一特定区域的文本,可通过设置坐标区域实现:
from spire.pdf import RectangleF, PdfDocument, PdfTextExtractor, PdfTextExtractOptions
# 加载 PDF 文件
pdf = PdfDocument()
pdf.LoadFromFile("sample.pdf")
# 获取第一页
page = pdf.Pages.get_Item(0)
# 创建一个 PdfTextExtractor 实例
textExtractor = PdfTextExtractor(page)
# 设置提取区域,通过配置 PdfTextExtractOptions
options = PdfTextExtractOptions()
area = RectangleF.FromLTRB(0, 200, page.Size.Width, 270) # x, y, width, height
options.ExtractArea = area
options.IsSimpleExtraction = True
# 从指定区域提取文本
text = textExtractor.ExtractText(options)
print(text)

PDF 中的表格广泛用于财务、账单等场景。借助 Spire.PDF 提供的表格提取器,你可以精准读取页面中的表格内容。
from spire.pdf import PdfDocument, PdfTableExtractor
# 加载 PDF 文件
pdf = PdfDocument()
pdf.LoadFromFile("sample.pdf")
# 创建一个 PdfTableExtractor 实例
table_extractor = PdfTableExtractor(pdf)
# 从第一页提取表格
tables = table_extractor.ExtractTable(0)
for table in tables:
# 获取行数和列数
row_count = table.GetRowCount()
column_count = table.GetColumnCount()
# 遍历每一行
for i in range(row_count):
table_row = []
# 遍历每一列
for j in range(column_count):
# 获取单元格文本
cell_text = table.GetText(i, j)
table_row.append(cell_text)
print(table_row)

相关文章:在 Python 中使用 OCR 识别图像中的文本
PDF 文件常含有徽标、插图或扫描图像。Spire.PDF 支持提取并保存这些嵌入图像,方便后续使用或归档。
from spire.pdf import PdfDocument, PdfImageHelper
# 加载 PDF 文件
pdf = PdfDocument()
pdf.LoadFromFile("sample.pdf")
# 获取第一页
page = pdf.Pages.get_Item(0)
# 创建一个 PdfImageHelper 对象
image_helper = PdfImageHelper()
# 获取页面上的图像信息
images_info = image_helper.GetImagesInfo(page)
# 将页面中的图像保存为图像文件
for i in range(len(images_info)):
images_info[i].Image.Save("output/Images/image" + str(i) + ".png")

你可以通过 Spire.PDF 获取文档的元数据信息,如标题、作者、主题和关键词等,有助于文档管理与归档。
from spire.pdf import PdfDocument
# 加载 PDF 文件
pdf = PdfDocument()
pdf.LoadFromFile("sample.pdf")
# 获取文档属性
properties = pdf.DocumentInformation
print("标题: " + properties.Title)
print("作者: " + properties.Author)
print("主题: " + properties.Subject)
print("关键词: " + properties.Keywords)

可以。Spire.PDF for Python 提供了读取文本、提取表格、图像和元数据的完整 API,支持结构化内容的精准解析。
当然可以。只需通过 pip 安装,就能在 Jupyter Notebook 中调用 API 读取 PDF 文件、提取文本与图像等内容。
加载文档后,使用 PdfTextExtractor.ExtractText() 方法遍历每一页即可提取所有可见文本。
可以。通过 LoadFromStream() 方法可直接读取字节数据,非常适合处理网页上传或接口返回的临时文件。
借助 Spire.PDF for Python,你可以轻松完成 PDF 文件的读取和处理任务,包括文本、表格、图像和元数据的提取,还可将 PDF 转换为可分析的文本内容,是实现数据采集与文档自动化的理想方案。
如需处理更大的 PDF 文件或解锁更多 PDF 操作,联系销售申请免费授权,充分利用 Spire.PDF for Python 的全部能力!

在 PDF 文档的 .NET 平台处理流程中,使用 C# 读取 PDF 条码 是一项常见需求,特别适用于处理扫描件或电子表单。无论是物流、金融、医疗还是制造行业,PDF 文档中经常包含用于追踪或识别的条码。这些条码可能是嵌入图像,也可能是矢量绘制图形。通过自动识别,可显著减少人工操作并提升数据处理效率。
本文将介绍两种方法,讲述如何使用 C# 从 PDF 中提取条码信息:一种是提取 PDF 页面中的嵌入图片后识别条码,另一种是将整个页面渲染为图像再进行识别。这两种方法都支持识别多种 1D 和 2D 条码类型。
文章目录
要在 C# 中实现 PDF 条码识别功能,你需要以下工具:
通过 NuGet 安装命令如下:
Install-Package Spire.Barcode
Install-Package Spire.PDF
下面将介绍两种方式从 PDF 中提取条码数据,可根据 PDF 文件中条码的具体类型选择合适的方法。
适用于扫描类 PDF,通常每一页都包含条码图像。可通过 BarcodeScanner.ScanOne() 方法读取单个图像中的一个条码。
using Spire.Barcode;
using Spire.Pdf;
using Spire.Pdf.Utilities;
using System.Drawing;
namespace ReadPDFBarcodeByExtracting
{
class Program
{
static void Main(string[] args)
{
// 载入PDF文件
PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile("Sample.pdf");
// 获取页面图片信息
PdfPageBase page = pdf.Pages[0];
PdfImageHelper imageHelper = new PdfImageHelper();
PdfImageInfo[] imagesInfo = imageHelper.GetImagesInfo(page);
// 遍历页面图片并读取条码信息
int index = 0;
foreach (PdfImageInfo imageInfo in imagesInfo)
{
Image image = imageInfo.Image;
string scanResult = BarcodeScanner.ScanOne((Bitmap)image);
Console.WriteLine($"第 {index + 1} 个图像的扫描结果:\n" + scanResult + "\n");
index++;
}
}
}
}
以下图像展示了 PDF 页面截图与条码识别结果:

适用场景:PDF 是扫描件或条码以图像形式嵌入时。
你可能感兴趣:C# 生成二维码教程
当条码是通过矢量方式绘制在 PDF 页面上(而非图片)时,可将页面渲染为图像,再识别其中的条码。此时使用 BarcodeScanner.Scan() 方法可识别多个条码。
using Spire.Barcode;
using Spire.Pdf;
using System.Drawing;
namespace ReadPDFBarcodeByExtracting
{
class Program
{
static void Main(string[] args)
{
// 载入PDF文件
PdfDocument pdf = new PdfDocument();
pdf.LoadFromFile("Sample.pdf");
// 遍历文档页面并保存页面为图像
for (int i = 0; i < pdf.Pages.Count; i++)
{
Image image = pdf.SaveAsImage(i);
// 扫描识别图像中的所有二维码信息
string[] scanResults = BarcodeScanner.Scan((Bitmap)image);
for (int j = 0; j < scanResults.Length; j++)
{
Console.WriteLine($"第 {i + 1} 页第 {j + 1} 个条码扫描结果:\n" + scanResults[j] + "\n");
}
}
}
}
}
下面展示的是使用方法二识别 PDF 页面中矢量条码的效果:

适用场景:条码是以绘图形式嵌入页面,而非图片。
相关阅读:C# 将 PDF 页面转换为图片
PDF 文件来源多为扫描件或在线系统生成,条码既可能作为图像嵌入,也可能直接绘制在页面中,推荐根据实际情况灵活选择方法。建议在不确定文档结构时结合两种方法使用,以提升识别成功率。
| 使用场景 | 推荐方法 |
|---|---|
| 扫描件或图像式条码 | 提取嵌入图片并识别 |
| 数字 PDF、矢量绘制条码 | 渲染整页图像再识别 |
| 混合内容或不确定结构 | 可尝试结合两种方法使用 |
通过本教程,你可以使用 C# 从 PDF 中提取条码信息,无论条码是图像嵌入还是矢量绘制,两种方法都能为你提供稳定的识别结果。在数据自动化处理场景中,这将大幅提升效率与准确性。
问:支持多页 PDF 吗?
答:支持。你可以循环处理 PDF 中的每一页,逐页识别条码。
问:能否识别每页多个条码?
答:可以。使用 BarcodeScanner.Scan() 方法可返回图像中所有检测到的条码。
问:提高识别精度的方法有哪些?
答:渲染页面时可设置更高 DPI,例如使用 SaveAsImage(int pageIndex, PdfImageType.Bitmap, int dpiX, int dpiY) 方法,推荐 300 DPI 以上。
问:是否可以免费使用?
答:可以。你可使用 Free Spire.Barcode for .NET 和 Free Spire.PDF for .NET 来实现基本的 PDF 条码识别功能。但免费版本可能存在页数限制或条码类型限制。如需完整功能,可 申请免费试用授权。
Spire.PDF for Java 11.6.2 已发布。本次更新增强了 PDF 到 PDFA3B 和 PDFA1A,以及 OFD 到 PDF 的转换功能。此外,一些已知问题也在该版本中成功修复,如替换文本,字体不正确的问题。详情请阅读以下内容。
问题修复: