Document Studio .NET
Next-generation .NET compliant multi-format document viewing & processing suite for .NET developers
Visual Studio 2013/2015/2017/2019

How to e-mail mail-merged DOCX, DOC, PDF and images using Document Studio .NET

Learn to use the new "EMailAction" action class.

When the mail-merge functionality was introduced in Document Studio .NET, it could create the document and save them to files or streams. In February, we added the ability to e-mail the document to a set of recipients. For this, a new class EMailAction has been introduced. In this article, you can see how to use it.

The Merge() method accepts a PostMergeAction instance. This could be an instance of one of the three derived classes.

public MailMergeResult Merge(
    PostMergeAction postMergeAction

To e-mail mail-merged documents, you need to call the Merge() method with a new instance of the EMailAction instance. For this, you will need to set the Message, UseMergedDocumentAs and SMTPServerSettings properties. You use the Message property to set the from, to, subject and body parts of the e-mail. You use the SMTPServerSettings to set the outgoing mail server settings. UseMergedDocumentAs accepts an enum value that lets you compose the merged document content as the body of the e-mail or as a simple attachment.

A mail-merge example

For this article, I used the same code snippet from the previous article and made some changes. A Gmail account was used to send email. The CUSTOMERS table did not have an e-mail column and so I added an "Email" column. It was populated with bogus e-mail addresses made up from the ID column. I had also updated the SQL statement in the data source configuration so that I would only hit a few mysterious customers in Italy.

public partial class Form1 : Form {

  public Form1() {

  private void button1_Click(object sender, EventArgs e) {
    try {
       * Set up data source
      DataSet ds = new DataSet();
      OleDbConnection conn =
          new OleDbConnection(
                  "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=FPNWIND.MDB");
      OleDbDataAdapter da =
          new OleDbDataAdapter(
              "SELECT ContactName, Address, City, PostalCode, Country, Email " +
              " FROM Customers " +
              " WHERE Country='Italy' " +
              " ORDER BY ContactName",
      DataTable dt = ds.Tables[0];

       * Set up a mail action for the mail-merge operation
      EMailAction oMailAction = new EMailAction();
      oMailAction.SMTPServerSettings =
          new SMTPServerSettings("", 587) {
            EnableSsl = true,
            UseDefaultCredentals = false,
            CustomNetworkCredential =
            new System.Net.NetworkCredential(
      oMailAction.UseMergedDocumentAs = MergedDocumentOptions.Attachment;
      oMailAction.Message = new Gnostice.Documents.Message();
      oMailAction.Message.From = "";
      // Set recipient name and email address in the To field using placeholders
      oMailAction.Message.To.Add("{{ContactName}} <{{Email}}>");
      oMailAction.Message.Subject = "Payment reminder";
      oMailAction.Message.Body =
        "Hi {{ContactName}},\n\nPFA important reminder regarding your loan."+
        "\n\nV. Subhash\nBank of Internet";
      oMailAction.BeforeSend += oMailAction_BeforeSend;
      oMailAction.AfterSend += oMailAction_AfterSend;

       * Do mail-merge
      // Initialize mail-merge
      MailMerge mm = new MailMerge();

      // Specify mail-merge template document
      mm.TemplateFileName = "letter_envelope_template.docx";

      // Specify mail-merge input data
      mm.DataSource = dt;
      Console.WriteLine("Found " + dt.Rows.Count + " records");

      // Remove unfilled fields
      mm.MailMergeCleanupOptions = MailMergeCleanupOptions.RemoveUnmappedFields;

      // Set handler for EndJob event to show the final result
      mm.EndJob += mm_EndJob;

      // Mail-merge 

      // Clean up
    } catch (Exception err) {

  void oMailAction_BeforeSend(object sender, MailMergeSendBeginEventArgs e) {
    Console.Write("Mail to be sent to " + e.Message.To[0]);

  void oMailAction_AfterSend(object sender, MailMergeSendCompleteEventArgs e) {
    Console.WriteLine("... Done.");


Sure enough, the mail got sent.

Gmail or Google Docs seems to have an issue with documents that has pages with different sizes. When you download it and open it in Microsoft Word, you can see that the documents have been merged all right.

The mail-merge operation is a blocking action. If you have a long list, you will have to call it asynchronously to prevent Windows from assuming that your software has become unresponsive. Of course, you don't have do it asynchronously in a service.


Our .NET Developer Tools
Gnostice Document Studio .NET

Multi-format document-processing component suite for .NET developers.


A .NET PDF component suite to create, edit, view, print, reorganize, encrypt, annotate, and bookmark PDF documents in .NET applications.

Our Delphi/C++Builder developer tools
Gnostice Document Studio Delphi

Multi-format document-processing component suite for Delphi/C++Builder developers, covering both VCL and FireMonkey platforms.

eDocEngine VCL

A Delphi/C++Builder component suite for creating documents in over 20 formats and also export reports from popular Delphi reporting tools.

PDFtoolkit VCL

A Delphi/C++Builder component suite to edit, enhance, view, print, merge, split, encrypt, annotate, and bookmark PDF documents.

Our Java developer tools
Gnostice Document Studio Java

Multi-format document-processing component suite for Java developers.

PDFOne (for Java)

A Java PDF component suite to create, edit, view, print, reorganize, encrypt, annotate, bookmark PDF documents in Java applications.

Our Platform-Agnostic Cloud and On-Premises APIs

Cloud-hosted and On-Premises REST-based document-processing and document-viewing APIs

Privacy | Legal | Feedback | Newsletter | Blog | Resellers © 2002-2023 Gnostice Information Technologies Private Limited. All rights reserved.