Convert MSG, EML to PDF/PDF/A with attachments converted and merged on Windows servers — without Microsoft Outlook.
Windows
2000/2003/Vista
7/8/10/11
and
2012/2016 / 2019/2022 Server
and
Docker / Citrix / Wine
Total Mail Converter Pro X is a server-side SDK that converts MSG and EML emails to PDF, PDF/A, DOC, RTF, TXT, HTML, TIFF, and JPEG — with attachments rendered to the same target format and merged into one output file, without Microsoft Outlook on the server. It runs headless: no GUI, no dialogs, no popups. Total Mail Converter Pro X ships with both a command-line binary and an ActiveX/COM interface, so it drops into ASP, PHP, .NET, Python, Ruby, Java, and any other COM-aware backend.
What makes the Pro variant different from the regular X edition is the -docs switch. With -docs on, every supported attachment — Word documents, spreadsheets, images, PDFs — is converted to the same target format (e.g. PDF) and either merged into the message PDF or saved as separate documents alongside it. The recipient opens one file and sees the email body plus every attachment in reading order. Supported attachment input types:
-uattach
Beyond attachment conversion, Total Mail Converter Pro X covers the full e-discovery and records-retention scenario: PDF/A output (-pdfa), digital signing with X.509 certificates (-PFXFile/-PFXPass), RFC-822 transport-header inclusion (-rfcheaders), attachment metadata indexing (-iattach), Bates-style header/footer stamping across the merged document, password-protected PDFs with per-permission flags, and per-folder recursion mirroring the original mailbox structure (-Recurse -kfs).
High converting speed and batch conversions result in a simple and boredom-free process — tens of thousands of messages with attachments per overnight run is normal. Try it for free (30 days trial period, no limitations) and find out that it is really worth its money.
Some of the currently supported file format conversions:
|
|
|
(includes 30 day FREE trial)
(only $1900.00)
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;
"We are very happy with the Total Mail Converter Pro. We used it to convert around 20 thousand mails to PDF; important for us was its ability to convert mail attachments into the target PDF. On converting the 20 thousand messages, only around a dozen failed because of unreadable attachments. Our suggestion for improvement: when an attachment fails, do not skip the whole mail file but rather convert the other attachments and complete the PDF without the single faulty attachment. Keep up the good work."
Manuel Schlief
www.darag.de
"We do e-discovery for outside counsel. Customers send PST exports; our pipeline turns each PST into one PDF per matter, every email plus every converted attachment in reading order with RFC headers preserved. Total Mail Converter Pro X with -docs -iattach -rfcheaders is the engine. Around 8,000 messages per hour on our hardware including DOCX/XLSX attachment rendering. Five years in production, no failures we can blame on the converter."
Henrik J.
Senior Backend Developer at a legal-tech vendor
"Patient communication archives have to land in our document-management system as PDF/A with X.509 digital signatures — HIPAA chain-of-custody requirement. -pdfa plus -PFXFile/-PFXPass plus -SignLoc/-SignCon/-SignRes covers the whole signing scenario in one binary call. We replaced a Java/iText pipeline that needed three separate libraries to produce the same output. Headless on Windows Server Core, no Outlook, no surprises."
Renata B.
DevOps Engineer at a healthcare records platform
"Bundled Total Mail Converter Pro X into our compliance-archiving product under the Royalty-Free License. The one-time per-project fee was a fraction of what Aspose.Email plus Aspose.Words plus Aspose.PDF would have cost as a stack. Our installer ships and registers the ActiveX, our app calls it directly, end users see only our UI. The 32-bit ActiveX limitation cost us a couple of days of pipeline rework, but support was responsive when we asked about workarounds."
Daichi M.
Independent Software Vendor
"Customers ship us nightly EML exports from their corporate Exchange tenants. Our worker pipeline merges each thread into one Bates-stamped PDF per case folder. -Recurse -kfs preserves the mailbox folder hierarchy on the output side, -HeadText/-FootText applies the case label and pagination across both message and attachment pages. Deterministic across runs, which matters for legal review. The CLI is stable and well-documented."
Aleksandra W.
Lead .NET Developer at a corporate-archive provider
Total Mail Converter Pro X ships with MailConverterX.exe, a console binary you can drive from scripts, scheduled tasks, mail-archive workers, or any backend service. What sets the Pro variant apart is the -docs switch: instead of just saving attachments next to the email, Pro converts Word documents, spreadsheets, images, and other attachments to the target format and merges them into the same output file as the message body. The flag set matches the GUI MailConverter.exe; for the full reference see the command-line documentation. The recipes below focus on attachment-handling scenarios that only the Pro edition supports.
The signature Pro workflow. -docs tells the converter to render every supported attachment to PDF; with -sdocs:off implied (default), all rendered pages are appended to the message PDF. The recipient opens one file and sees the email plus every Word, Excel, image, and PDF attachment in reading order.
MailConverterX.exe "C:\mail\incoming\*.msg" "C:\out\" -cPDF -attach -docs
Same conversion, but -sdocs writes each converted attachment as its own PDF alongside the message PDF instead of merging them. Useful when downstream systems index attachments individually.
MailConverterX.exe "C:\mail\export\*.eml" "C:\out\" -cPDF -attach -docs -sdocs
After exporting an Outlook PST to MSG files, the result is a deep folder tree mirroring the original mailbox. -Recurse traverses every subfolder; -kfs keeps the same structure on the output side so Inbox, Sent Items, and custom folders stay separated.
MailConverterX.exe "C:\pst-export\Mailbox\*.msg" "C:\out\Mailbox\" -cPDF -Recurse -kfs -attach -docs
For legal review you need every header, every recipient field, and a record of what was attached — even when an attachment couldn't be converted. -iattach writes attachment metadata (file name, size, MIME type) into the document; -rfcheaders includes the raw RFC-822 transport headers; -uattach unpacks ZIPped attachments so their contents are also converted.
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
Useful for single-deliverable handoffs: one PDF containing every message and every converted attachment in chronological order. -combine merges all source files into one document; -sort date orders them by message date.
MailConverterX.exe "C:\mail\ProjectAcme\*.eml" "C:\out\ProjectAcme-archive.pdf" -cPDF -combine -sort date -attach -docs
When emails plus attachments leave the company, lock the output. -mp sets the owner password (controls permissions), -up sets the user password (required to open), and -perm grants exactly the operations the recipient is allowed.
MailConverterX.exe "C:\mail\confidential\*.msg" "C:\out\" -cPDF -attach -docs -mp "owner-secret" -up "client-pwd" -perm Copy -pc Maximum
When the merged PDF carries email body and converted attachments, a header/footer applied at conversion time labels every page consistently — equivalent to a Bates-style stamp across the whole package. PDF metadata fields make the file self-describing in document-management systems.
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"
For records-management workflows the merged email-plus-attachments PDF must be ISO 19005 (PDF/A) compliant and digitally signed with an organizational certificate. -pdfa enables PDF/A mode; -PFXFile + -PFXPass sign the file with an X.509 certificate.
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"
Default file names are derived from the source file. -template lets you compose names from message metadata — date, sender, subject — which is what archives and case-management tools usually want. -atemplate controls the names of separately saved attachments when -sdocs is on.
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]"
Once MailConverterX.exe runs as a service or scheduled job, the only signal you have is the log. -verbosity detail writes one line per message and per attachment; -logmode append keeps history across runs; -list reads the queue from a worker-produced text file instead of from the command line; -fo overwrites previous output without prompting.
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
Updated Tue, 05 May 2026
(only $1900.00)
-docs attachment-conversion engine. With -docs the converter renders every supported attachment (Word, Excel, PowerPoint, images, PDFs) to the target format and merges them into the same output document as the email body, or saves them as separate documents alongside it (-sdocs). The regular Mail Converter X only saves attachments as their original file types next to the email. Pro is the right choice for e-discovery, records retention, and any workflow where the deliverable is one self-contained PDF per email thread.new COM("MailConverterPro.MailConverterX") in PHP, new MailConverterX() in .NET (after registering the Pro ActiveX), win32com.client.Dispatch("MailConverterPro.MailConverterX") in Python, WIN32OLE.new('MailConverterPro.MailConverterX') in Ruby. Alternatively, the MailConverterX.exe command-line binary can be invoked from any process, scheduler, or shell script. Direct PDF streaming via ConvertToStream is also available for ASP/PHP web responses.-uattach so their contents are also converted. Unsupported attachment types are noted in the log and skipped without aborting the message.-pdfa for ISO 19005 (PDF/A) compliance, then -PFXFile "C:\certs\acme.pfx" -PFXPass "cert-pwd" to digitally sign with an organizational X.509 certificate. -SignLoc, -SignCon, and -SignRes attach signature metadata. Combined with -rfcheaders for transport-header preservation and -iattach for attachment indexing, this covers the full archival-records scenario regulated industries need.-IgnoreInvalidSource keeps a single bad source file from aborting the whole batch. -msuccess and -merror route processed and failed source files into separate folders. -list queue-file input plus -log -verbosity detail writes one structured line per message and per attachment for log-aggregator ingestion.Updated Tue, 05 May 2026
(only $1900.00)
Download free trial and convert your files in minutes.
No credit card or email required.
Docker docker run -p 5000:5000 tdhster/mailconverter-api