在网络服务器上转换 MSG 和 EML 文件
Windows
2000/2003/Vista
7/8/10/11
and
2012/2016/2019/2022 Server
and
Docker/Citrix/Wine
Total Mail Converter Pro X 是一款服务器端 SDK,可将 MSG 和 EML 邮件转换为 PDF、PDF/A、DOC、RTF、TXT、HTML、TIFF 和 JPEG — 附件会被渲染为同一目标格式并合并到单个输出文件中,且服务器上无需安装 Microsoft Outlook。它以无界面(headless)方式运行:没有图形界面、没有对话框、没有弹窗。Total Mail Converter Pro X 同时提供命令行程序和 ActiveX/COM 接口,因此可无缝集成到 ASP、PHP、.NET、Python、Ruby、Java 以及任何支持 COM 的后端环境。
Pro 版本与常规 X 版本的区别在于 -docs 开关。启用 -docs 后,每个受支持的附件 — Word 文档、电子表格、图像、PDF — 都会被转换为相同的目标格式(例如 PDF),并且要么合并到邮件 PDF 中,要么作为单独文档保存在其旁边。收件人打开一个文件,就能按阅读顺序看到邮件正文以及所有附件。受支持的附件输入类型:
-uattach 解压
除附件转换之外,Total Mail Converter Pro X 还覆盖了完整的电子取证(e-discovery)和档案保留场景:PDF/A 输出(-pdfa)、使用 X.509 证书进行数字签名(-PFXFile/-PFXPass)、保留 RFC-822 传输头(-rfcheaders)、附件元数据索引(-iattach)、跨合并文档的 Bates 风格页眉/页脚标记、带有按权限标志的密码保护 PDF,以及按文件夹递归并镜像原始邮箱结构(-Recurse -kfs)。
高速转换和批量处理让整个过程简单且不再枯燥 — 一夜之间处理数万封带附件的邮件是常态。免费试用(30 天试用期,无任何限制),亲自验证它确实物有所值。
当前支持的部分文件格式转换:
|
|
|
string src = @"C:\test\Source.eml";
string dest = @"C:\test\Dest.pdf";
var cnv = new MailConverterX();
cnv.Convert(src, dest, "-cPDF -attach -docs -log c:\\test\\Mail.log");
if (!string.IsNullOrEmpty(cnv.ErrorMessage))
throw new Exception(cnv.ErrorMessage);
public static class Function1
{
[FunctionName("Function1")]
public static async Task Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
StringBuilder sbLogs = new StringBuilder();
sbLogs.AppendLine("started...");
try
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
var assemblyDirectoryPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
assemblyDirectoryPath = assemblyDirectoryPath.Substring(0, assemblyDirectoryPath.Length - 4);
var executablePath = $@"{assemblyDirectoryPath}\Converter\MailConverterX.exe";
sbLogs.AppendLine(executablePath + "...");
var srcPath = $@"{assemblyDirectoryPath}\src\sample.msg";
var outPath = Path.GetTempFileName() + ".pdf";
startInfo.FileName = executablePath;
if (File.Exists(outPath))
{
File.Delete(outPath);
}
if (File.Exists(executablePath) && File.Exists(srcPath))
{
sbLogs.AppendLine("files exists...");
}
else
sbLogs.AppendLine("EXE & source files NOT exists...");
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.Arguments = $"{srcPath} {outPath} -cPDF -attach -docs";
using (Process exeProcess = Process.Start(startInfo))
{
sbLogs.AppendLine($"wait...{DateTime.Now.ToString()}");
exeProcess.WaitForExit();
sbLogs.AppendLine($"complete...{DateTime.Now.ToString()}");
}
int sleepCounter = 10;
while(!File.Exists(outPath) && sleepCounter > 0)
{
System.Threading.Thread.Sleep(1000);
sbLogs.AppendLine("sleep...");
sleepCounter--;
}
if (File.Exists(outPath))
sbLogs.AppendLine("Conversion complete successfully.");
}
catch (Exception ex)
{
sbLogs.AppendLine(ex.ToString());
}
return new OkObjectResult(sbLogs);
}
}
dim C
Set C=CreateObject("MailConverterPro.MailConverterX")
C.Convert "c:\test\source.eml", "c:\test\dest.pdf", "-cPDF -attach -docs -log c:\Mail.log"
Response.Write C.ErrorMessage
set C = nothing
dim C
Set C=CreateObject("MailConverterPro.MailConverterX")
Response.Clear
Response.AddHeader "Content-Type", "binary/octet-stream"
Response.AddHeader "Content-Disposition", "attachment; filename=test.pdf"
Response.BinaryWrite C.ConvertToStream("C:\www\ASP\Source.eml", "C:\www\ASP", "-cpdf -attach -docs -log c:\html.log")
set C = nothing
$src="C:\\test\\test.msg";
$dest="C:\\test\\test.pdf";
if (file_exists($dest)) unlink($dest);
$c= new COM("MailConverterPro.MailConverterX");
$c->convert($src,$dest, "-cPDF -attach -docs -log c:\\Mail.log");
if (file_exists($dest)) echo "OK"; else echo "fail:".$c->ErrorMessage;
require 'win32ole'
c = WIN32OLE.new('MailConverterPro.MailConverterX')
src = "C:\\test\\test.eml"
dest = "C:\\test\\test.pdf"
c.convert(src, dest, "-cPDF -attach -docs -log c:\\test\\Mail.log")
if not File.exist?(dest)
puts c.ErrorMessage
end
import win32com.client
import os.path
c = win32com.client.Dispatch("MailConverterPro.MailConverterX")
src = "C:\\test\\test.eml"
dest = "C:\\test\\test.pdf"
c.convert(src, dest, "-cPDF -attach -docs -log c:\\test\\Mail.log")
if not os.path.exists(dest):
print(c.ErrorMessage)
uses Dialogs, Vcl.OleAuto;
var
c: OleVariant;
begin
c := CreateOleObject('MailConverterPro.MailConverterX');
c.Convert('c:\test\source.eml', 'c:\test\dest.pdf', '-cPDF -attach -docs -log c:\test\Mail.log');
if c.ErrorMessage <> '' then
ShowMessage(c.ErrorMessage);
end;
var c = new ActiveXObject("MailConverterPro.MailConverterX");
c.Convert("C:\\test\\source.msg", "C:\\test\\dest.pdf", "-cPDF -attach -docs");
if (c.ErrorMessage != "")
alert(c.ErrorMessage)
use Win32::OLE; my $src = "C:\\test\\test.eml"; my $dest = "C:\\test\\test.pdf"; my $c = CreateObject Win32::OLE 'MailConverterPro.MailConverterX'; $c->convert($src, $dest, "-cPDF -attach -docs -log c:\\test\\Mail.log"); print $c->ErrorMessage if -e $dest;
"我们对 Total Mail Converter Pro 非常满意。我们用它将大约两万封邮件转换为 PDF;对我们而言关键的是它能够将邮件附件转换并合并到目标 PDF 中。在转换这两万封邮件时,只有大约十多封因附件无法读取而失败。我们的改进建议是:当某个附件失败时,请不要跳过整封邮件文件,而应继续转换其他附件,并在没有那一个有问题附件的情况下完成 PDF。请继续保持出色的工作。"
Manuel Schlief
www.darag.de
"我们为外部律师团队提供电子取证服务。客户发来 PST 导出文件;我们的处理流水线把每个 PST 转换为每个案件一份的 PDF,每封邮件加上每个已转换的附件按阅读顺序排列,并保留 RFC 头。Total Mail Converter Pro X 配合 -docs -iattach -rfcheaders 就是这套流程的引擎。在我们的硬件上,每小时约 8000 封邮件,包括 DOCX/XLSX 附件渲染。已在生产中使用五年,没有任何可归咎于该转换器的故障。"
Henrik J.
Senior Backend Developer at a legal-tech vendor
"患者通信归档必须以带 X.509 数字签名的 PDF/A 形式进入我们的文档管理系统 — 这是 HIPAA 监管链的要求。-pdfa 加上 -PFXFile/-PFXPass 再加上 -SignLoc/-SignCon/-SignRes 一次二进制调用即可覆盖整个签名场景。我们替换了一条原本需要三个独立库才能产出相同结果的 Java/iText 流水线。在 Windows Server Core 上无界面运行,无需 Outlook,没有任何意外。"
Renata B.
DevOps Engineer at a healthcare records platform
"我们以 Royalty-Free License 将 Total Mail Converter Pro X 集成到了我们的合规归档产品中。一次性的按项目费用只是 Aspose.Email 加 Aspose.Words 加 Aspose.PDF 整套方案成本的一小部分。我们的安装程序负责发布并注册 ActiveX,我们的应用程序直接调用它,最终用户只看到我们自己的界面。32 位 ActiveX 的限制让我们多花了几天时间重构流水线,但当我们询问解决方案时,技术支持响应及时。"
Daichi M.
Independent Software Vendor
"客户每晚从他们的企业 Exchange 租户向我们推送 EML 导出。我们的工作流水线把每个邮件线程合并为按案件文件夹组织的一份 Bates 标记 PDF。-Recurse -kfs 在输出端保留邮箱文件夹层级,-HeadText/-FootText 在邮件页和附件页上同时应用案件标签和分页编号。多次运行结果一致,这对法律审查至关重要。命令行稳定且文档完善。"
Aleksandra W.
Lead .NET Developer at a corporate-archive provider
Total Mail Converter Pro X 附带 MailConverterX.exe,这是一个可以从脚本、计划任务、邮件归档工作进程或任何后端服务驱动的控制台二进制程序。Pro 变体的特别之处在于 -docs 开关:Pro 不仅仅将附件保存在电子邮件旁边,而是将 Word 文档、电子表格、图像和其他附件转换为目标格式,并将它们合并到与邮件正文相同的输出文件中。标志集与 GUI 版的 MailConverter.exe 一致;完整参考请参阅命令行文档。下面的配方专注于只有 Pro 版支持的附件处理场景。
标志性的 Pro 工作流。-docs 告诉转换器将每个支持的附件渲染为 PDF;通过隐含的 -sdocs:off(默认),所有渲染的页面都附加到邮件 PDF。收件人打开一个文件,按阅读顺序看到电子邮件加上每个 Word、Excel、图像和 PDF 附件。
MailConverterX.exe "C:\mail\incoming\*.msg" "C:\out\" -cPDF -attach -docs
相同的转换,但 -sdocs 将每个转换后的附件作为自己的 PDF 与邮件 PDF 一起写入,而不是合并它们。当下游系统单独索引附件时很有用。
MailConverterX.exe "C:\mail\export\*.eml" "C:\out\" -cPDF -attach -docs -sdocs
将 Outlook PST 导出为 MSG 文件后,结果是反映原始邮箱的深层文件夹树。-Recurse 遍历每个子文件夹;-kfs 在输出端保持相同的结构,因此收件箱、已发送邮件和自定义文件夹保持分离。
MailConverterX.exe "C:\pst-export\Mailbox\*.msg" "C:\out\Mailbox\" -cPDF -Recurse -kfs -attach -docs
对于法律审查,您需要每个标头、每个收件人字段,以及附件的记录 —— 即使附件无法转换。-iattach 将附件元数据(文件名、大小、MIME 类型)写入文档;-rfcheaders 包括原始 RFC-822 传输标头;-uattach 解压 ZIP 附件,因此其内容也会被转换。
MailConverterX.exe "C:\case-2026-117\*.msg" "C:\review\case-2026-117\" -cPDF -Recurse -kfs -sender -rcpt -cc -bcc -date -subject -attach -iattach -uattach -docs -rfcheaders
用于单一交付物的移交:一份包含每条邮件和每个转换后附件的按时间顺序的 PDF。-combine 将所有源文件合并到一个文档中;-sort date 按邮件日期排序。
MailConverterX.exe "C:\mail\ProjectAcme\*.eml" "C:\out\ProjectAcme-archive.pdf" -cPDF -combine -sort date -attach -docs
当电子邮件加附件离开公司时,锁定输出。-mp 设置所有者密码(控制权限),-up 设置用户密码(打开所需),-perm 准确授予收件人允许的操作。
MailConverterX.exe "C:\mail\confidential\*.msg" "C:\out\" -cPDF -attach -docs -mp "owner-secret" -up "client-pwd" -perm Copy -pc Maximum
当合并的 PDF 携带电子邮件正文和转换后的附件时,在转换时应用的页眉/页脚一致地标记每页 —— 等同于跨整个包的 Bates 风格盖章。PDF 元数据字段使文件在文档管理系统中具有自描述性。
MailConverterX.exe "C:\mail\matter-4471\*.msg" "C:\out\matter-4471\" -cPDF -attach -docs -HeadText "Matter 4471 — CONFIDENTIAL" -HeadAlign center -FootText "Page [page] of [date]" -FootAlign right -PDFAuthor "Acme Legal" -PDFTitle "Matter 4471 mail archive" -PDFSubject "Privileged review copy"
对于记录管理工作流,合并的电子邮件加附件的 PDF 必须符合 ISO 19005 (PDF/A) 标准并使用组织证书进行数字签名。-pdfa 启用 PDF/A 模式;-PFXFile + -PFXPass 使用 X.509 证书签署文件。
MailConverterX.exe "C:\mail\archive\2026\*.eml" "C:\archive\2026\" -cPDF -Recurse -kfs -attach -docs -pdfa -PFXFile "C:\certs\acme-archive.pfx" -PFXPass "cert-pwd" -SignLoc "Acme HQ" -SignCon "[email protected]" -SignRes "Records retention seal"
默认文件名派生自源文件。-template 让您从邮件元数据 —— 日期、发件人、主题 —— 组合名称,这通常是档案和案件管理工具想要的。当 -sdocs 启用时,-atemplate 控制单独保存的附件的名称。
MailConverterX.exe "C:\mail\inbox\*.msg" "C:\out\" -cPDF -attach -docs -sdocs -template "[date:yyyy-mm-dd]_[sender]_[subject]" -atemplate "[mail]_attach[attach_index]_[attach]"
一旦 MailConverterX.exe 作为服务或计划作业运行,您唯一拥有的信号就是日志。-verbosity detail 每条邮件和每个附件写一行;-logmode append 在多次运行之间保留历史;-list 从工作进程生成的文本文件而不是命令行读取队列;-fo 在不提示的情况下覆盖以前的输出。
MailConverterX.exe -list "C:\queues\mail-batch.txt" "C:\out\" -cPDF -Recurse -kfs -attach -docs -fo -log "C:\logs\mailconv.log" -verbosity detail -logmode append
-docs 附件转换引擎。启用 -docs 后,转换器会将每个受支持的附件(Word、Excel、PowerPoint、图像、PDF)渲染为目标格式,并将它们与邮件正文合并到同一个输出文档中,或作为单独文档保存在旁边(-sdocs)。常规的 Mail Converter X 仅以原始文件类型保存附件。Pro 适合电子取证、档案保留以及任何需要每个邮件线程交付一份独立 PDF 的工作流。new COM("MailConverterPro.MailConverterX"),在 .NET 中(注册 Pro ActiveX 后)使用 new MailConverterX(),在 Python 中使用 win32com.client.Dispatch("MailConverterPro.MailConverterX"),在 Ruby 中使用 WIN32OLE.new('MailConverterPro.MailConverterX')。此外,MailConverterX.exe 命令行程序可以从任何进程、计划任务或 shell 脚本调用。还可通过 ConvertToStream 直接将 PDF 流式输出,用于 ASP/PHP Web 响应。-uattach 解压,使其内容也被转换。不受支持的附件类型会被记录在日志中并跳过,而不会中止该邮件的处理。-pdfa 实现 ISO 19005(PDF/A)合规,再使用 -PFXFile "C:\certs\acme.pfx" -PFXPass "cert-pwd" 通过组织的 X.509 证书进行数字签名。-SignLoc、-SignCon 和 -SignRes 用于附加签名元数据。结合 -rfcheaders 保留传输头和 -iattach 索引附件,可完整覆盖受监管行业所需的档案保留场景。-IgnoreInvalidSource 防止单个损坏源文件导致整批中止。-msuccess 和 -merror 将处理成功和失败的源文件分别归入不同文件夹。-list 队列文件输入加上 -log -verbosity detail,可为每条邮件和每个附件输出一行结构化日志,便于日志聚合系统接入。Docker docker run -p 5000:5000 tdhster/mailconverter-api