Convert MSG, EML, MBOX to PDF, DOC, TIFF, HTML 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 X is a server-side SDK that converts MSG, EML, and MBOX emails to PDF, DOC, RTF, HTML, XHTML, TXT, TIFF, JPEG, EML, MSG, and PST — without Microsoft Outlook, MAPI, or any Office Interop on the server. It runs silent: no GUI, no dialogs, no popups. Total Mail Converter 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 this Standard variant does:
-atemplate; ZIP attachments unpacked with -uattach
-HeadText / -FootText) for legal e-discovery
-mp, -up, -perm)
-rfcheaders)
-Recurse + -kfs for whole-mailbox-tree processing
Standard vs Pro X: the Standard edition saves attachments as their original file types next to the email PDF. The Pro version with -docs renders attachments (DOCX, XLSX, images, PDFs) into the target format and merges them into the same output file as the message body. Choose Standard for plain mailbox archival; choose Pro for e-discovery deliverables where the output is one self-contained PDF per email thread.
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 $950.00)
string src = @"C:\test\Source.eml";
string dest = @"C:\test\Dest.pdf";
var cnv = new MailConverterX();
cnv.Convert(src, dest, "-cPDF -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";
using (Process exeProcess = Process.Start(startInfo))
{
sbLogs.AppendLine($"wait...{DateTime.Now.ToString()}");
exeProcess.WaitForExit();
sbLogs.AppendLine($"complete...{DateTime.Now.ToString()}");
}
sbLogs.AppendLine("Conversion complete.");
}
catch (Exception ex)
{
sbLogs.AppendLine(ex.ToString());
}
return new OkObjectResult(sbLogs);
}
}
dim C
Set C=CreateObject("MailConverter.MailConverterX")
C.Convert "c:\test\source.eml", "c:\test\dest.pdf", "-cPDF -log c:\mail.log"
Response.Write C.ErrorMessage
set C = nothing
dim C
Set C=CreateObject("MailConverter.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 -log c:\mail.log")
set C = nothing
$src="C:\\test\\test.msg";
$dest="C:\\test\\test.pdf";
if (file_exists($dest)) unlink($dest);
$c= new COM("MailConverter.MailConverterX");
$c->convert($src,$dest, "-cPDF -log c:\\Mail.log");
if (file_exists($dest)) echo "OK"; else echo "fail:".$c->ErrorMessage;
require 'win32ole'
c = WIN32OLE.new('MailConverter.MailConverterX')
src = "C:\\test\\test.eml"
dest = "C:\\test\\test.pdf"
c.convert(src, dest, "-cPDF -log c:\\test\\Mail.log")
if not File.exist?(dest)
puts c.ErrorMessage
end
import win32com.client
import os.path
c = win32com.client.Dispatch("MailConverter.MailConverterX")
src = "C:\\test\\test.eml"
dest = "C:\\test\\test.pdf"
c.convert(src, dest, "-cPDF -log c:\\test\\Mail.log")
if not os.path.exists(dest):
print(c.ErrorMessage)
uses Dialogs, Vcl.OleAuto;
var
c: OleVariant;
begin
c := CreateOleObject('MailConverter.MailConverterX');
c.Convert('c:\test\source.eml', 'c:\test\dest.pdf', '-cPDF -log c:\test\Mail.log');
if c.ErrorMessage <> '' then
ShowMessage(c.ErrorMessage);
end;
var c = new ActiveXObject("MailConverter.MailConverterX");
c.Convert("C:\\test\\source.msg", "C:\\test\\dest.pdf", "-cPDF");
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 'MailConverter.MailConverterX'; $c->convert($src, $dest, "-cPDF -log c:\\test\\Mail.log"); print $c->ErrorMessage if -e $dest;
"I work for Freeland Cooper & Foreman LLP and I am currently handling the project for which we purchased Total Mail Converter X. We purchased the program for the purpose of merging large numbers of .msg files into .pst form, and so far I am very pleased with the results; it is reliable, highly functional, and easy to use."
Max Canin
www.freelandlaw.com
"We use SharePoint as a document library and access it through UNC. I use Total Mail Converter X to archive e-mail messages. I use the subject line as part of the resultant filename, but that presents a problem: SharePoint does not allow certain characters in filenames. I was wondering if there could be a command-line option added to remove the unsafe characters for use in SharePoint UNC paths."
Shane Adam
Systems Analyst & Developer, http://eigltd.com
"We archive employee mailbox exports from departing staff. Customers ship us PST/MBOX dumps; our pipeline turns each one into a folder of self-contained PDFs with full RFC-822 headers preserved for forensic review. Total Mail Converter X with -Recurse -kfs -rfcheaders -combine is the engine. Six years in production, throughput around 5,000 messages per hour on our hardware. No Outlook anywhere in the pipeline."
Bartosz K.
Senior Backend Developer at a compliance-archive vendor
"Tickets attach EML files; the support team needs PDF copies for the ticket trail. Total Mail Converter X plus Total Folder Monitor: tickets drop EML into an inbox folder, the converter clears them, the support tool picks up the PDFs. Clean Bates-style page numbers thanks to -HeadText/-FootText, no manual intervention. Headless on Windows Server Core, no Outlook, no licensing surprises."
Soledad O.
DevOps Engineer at a customer-support SaaS
"Bundled Total Mail Converter X into our records-management product under the Royalty-Free License. The one-time per-project fee was a fraction of what Aspose.Email wanted on a per-developer subscription. 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."
Niko T.
Independent Software Vendor
Total Mail ConverterX ships with MailConverterX.exe, a console binary you can drive from scripts, scheduled tasks, mail-archive workers, or any backend service. The flag set matches the GUI MailConverter.exe; for the full reference see the command-line documentation. The recipes below cover the cases we hear about most often from SDK customers working with MSG, EML, and MBOX mailboxes.
The smallest possible call — one Outlook message in, one PDF out.
MailConverterX.exe "C:\mailbox\invoice.msg" "C:\out\invoice.pdf" -cPDF
Process a whole folder of EML files exported from Thunderbird, Apple Mail, or any IMAP client and drop the PDFs into a sibling output directory.
MailConverterX.exe "C:\mailbox\*.eml" "C:\out\" -cPDF
Swap the mask for *.msg or *.mbox to pick a different source format, or -cDOC / -cTXT / -cTIFF to pick a different target.
An Outlook export rarely lives in one flat folder — you usually get Inbox, Sent, Archive, and dozens of subfolders. -Recurse walks subdirectories; -kfs recreates the same tree on the output side instead of flattening everything into one bucket.
MailConverterX.exe "C:\export\Mailbox\*.msg" "C:\out\Mailbox\" -cPDF -Recurse -kfs
For e-discovery and case files you usually want one PDF per matter, not one per email. -combine merges the matched messages into a single PDF in source-file order; -sort date arranges them chronologically.
MailConverterX.exe "C:\cases\Acme\*.eml" "C:\out\Acme-thread.pdf" -cPDF -combine -sort date
The Standard edition converts the email body and writes original attachments to disk next to the output document. -attach turns attachment extraction on; -atemplate controls the attachment file-name pattern.
MailConverterX.exe "C:\mailbox\*.msg" "C:\out\" -cPDF -attach -atemplate "[mail]_[attach_index]_[attach]"
Add -uattach to unpack ZIP attachments automatically, or -images to embed inline images directly in the PDF body.
By default every header field is exported. To produce a clean print-ready PDF that shows only From, Date, and Subject — no CC, no BCC, no transport headers — switch the unwanted fields off explicitly.
MailConverterX.exe "C:\mailbox\*.eml" "C:\out\" -cPDF -sender -date -subject -cc:off -bcc:off -rcpt:off
Add -rfcheaders if you instead need the full RFC-822 transport headers preserved for forensic review.
Bates-style stamping for litigation hand-offs: a footer with a running page number on every page, plus a header with the production date. [page] and [date] are the built-in placeholders.
MailConverterX.exe "C:\cases\Acme\*.msg" "C:\out\Acme.pdf" -cPDF -combine -sort date -HeadText "ACME-PROD [date]" -HeadAlign right -FootText "Page [page]" -FootAlign center
Standard for sending privileged correspondence to opposing counsel: an owner password locks edit/print permissions, a user password gates opening the file, and -perm grants exactly the rights you allow.
MailConverterX.exe "C:\mailbox\*.msg" "C:\out\" -cPDF -mp "owner-pwd" -up "user-pwd" -perm Copy
Once MailConverterX.exe runs as a service or scheduled job, the only way to know what happened is the log. -verbosity detail writes one line per file; -logmode append keeps history across runs; -fo overwrites earlier output silently instead of stopping on collisions.
MailConverterX.exe "C:\mailbox\*.eml" "C:\out\" -cPDF -log "C:\logs\mailconv.log" -verbosity detail -logmode append -fo
When a mail-archive worker writes a queue file and the converter consumes it, you don't want to encode the file paths into the command line itself. -list reads file masks (one per line) from a text file.
MailConverterX.exe -list "C:\queues\mail-batch.txt" "C:\out\" -cPDF -log "C:\logs\mailconv.log"
Updated Tue, 05 May 2026
(only $950.00)
-docs attachment-conversion engine, which renders every supported attachment (Word, Excel, PowerPoint, images, PDFs) to the target format and merges them into the same output PDF as the email body. Choose Standard for plain mailbox archival; choose Pro for e-discovery deliverables where the output is one self-contained PDF per email thread.new COM("MailConverter.MailConverterX") in PHP, new MailConverterX() in .NET, win32com.client.Dispatch("MailConverter.MailConverterX") in Python, WIN32OLE.new('MailConverter.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.-c <FORMAT> to pick the target.-attach to enable attachment extraction. Attachments land in the same folder as the output PDF by default. Use -atemplate "[mail]_[attach_index]_[attach]" to define a custom naming pattern based on message and attachment metadata. Add -uattach to unpack ZIP attachments automatically so their contents are saved alongside the rest. Add -images to embed inline images directly in the PDF body instead of saving them as files.-mp "owner-pwd" sets the owner password (controls permissions); -up "user-pwd" gates opening the file; -perm accepts any combination of Print, HighResPrint, Copy, Modify, Annotation, FormFill. For Bates stamping use -HeadText/-FootText with placeholders [page], [date], [time] and -HeadAlign/-FootAlign to position the text. Combined with -combine -sort date this produces a single Bates-stamped PDF for an entire mail thread.Updated Tue, 05 May 2026
(only $950.00)
Download free trial and convert your files in minutes.
No credit card or email required.
Contact us. We will gladly enhance our mail converter so that it fit your needs perfectly. Customization is often free to our customers.
Docker docker run -p 5000:5000 tdhster/mailconverter-api