云中的邮件合并:使用 Aspose.Words for Cloud
云中的邮件合并:使用 Aspose.Words for Cloud
邮件合并
邮件合并通常用于创建信函,这也是本示例的目的。FloRelief 是一个虚构的洪水救助慈善机构,它有一个在线页面,销售食品、滤水器、帐篷和急救包的捐赠,以帮助受洪水影响的人们。您可以为朋友购买捐赠。(为了便于理解此场景中的不同角色,“赠送者”是指购买捐赠的人,“受赠者”是指接收捐赠的人。)这是一个在线服务,但赠送者可以选择向受赠者发送一封信来告知他们捐赠事宜。他们提供纸质选项,因为有些人更喜欢信件而非电子邮件——他们觉得信件更正式,价值也更高。
赠送者在线输入信息
- 礼品详情:捐赠的金额,如何联系受赠者。
- 受赠者信息:受赠者的姓名和地址。
- 赠送者信息:赠送者自己的姓名。(在实际应用中,还会收集账单和发票地址以及信用卡详细信息。)
如果赠送者选择发送信件,应用程序将获取礼品详情、受赠者信息和赠送者姓名,将它们合并到一个 Microsoft Word 模板中,并将生成的信件保存到磁盘。到一天结束时,志愿者会打印新文件,将信件装入信封并发出去。
实现这一点有很多方法。传统的方法是构建一个应用程序,该应用程序驻留在服务器上,收集数据,将其放入数据库,然后每天一次对最近的捐赠执行邮件合并。
FloRelief 的方法并非如此。相反,他们使用云 API 在提交表单时执行邮件合并。(详细信息还会保存到数据库中以供管理,但这部分过程不包含在此示例中。)
应用程序概述
我编写了一个简单的 Web 应用程序,它会启动一个网页,让赠送者选择一个或多个礼品,是否发送信件,并输入一些基本的用户数据。为了保持简单,本示例不包括收集或验证付款信息、登录或真实应用程序将具备的任何后台管理。它完全专注于收集受赠者、赠送者和礼品信息以及进行邮件合并的过程。
从用户的角度来看,这发生在:
- 用户输入自己和受赠者的详细信息。
- 选择发送信件。
- 选择一个或多个礼品。
- 在页面底部的表格中检查礼品。
- 点击 **捐赠**。
在后台,开发人员已完成:
- 将 Microsoft Word 模板上传到 Aspose for Cloud。
- 创建收集赠送者、受赠者和礼品信息的网页
- 在 Aspose for Cloud 上创建新应用,并使用 ID 和密钥对 API 请求进行身份验证。
- 编写应用程序。
应用程序
- 在网页上生成选定产品的表格。
- 收集表单数据。
- 将表单数据转换为用于邮件合并的 XML。
- 设置文件名、输出路径和输出格式。
- 执行邮件合并。
- 保存生成的文档。
除第一部分外,所有内容对用户都是隐藏的。
本示例使用 C#、Microsoft Visual Studio、Aspose.Words for Cloud .NET SDK 和 JSON 编写。要访问完整示例,请 [下载项目]。
注意:要运行示例,您需要 Aspose.Words for Cloud 的 App ID 和密钥。这些是特定于应用程序的,因此创建 Aspose for Cloud 应用的第一步是创建一个新应用,并从您的 Aspose for Cloud 帐户获取其 ID 和密钥值。发送到 Aspose for Cloud 的每个请求都必须使用私钥进行签名,以确保只有授权应用程序才能访问 API。
运行邮件合并
邮件合并有多个方面:Microsoft Word 模板、HTML 页面以及执行合并的代码。
Microsoft Word 模板
使用 Aspose.Words for Cloud 执行邮件合并有多种方法。在此,我使用了区域。在模板中,我定义了两个区域,使用 <<TableStart:NAME>>
和 <<TableEnd:NAME >>
标签。这些区域是 Charity(信函正文)和 Gift(列出赠送者已选择的捐赠的表格)。
网页
网页列出了不同的礼品,并允许用户选择它们。在顶部,用户输入赠送者和受赠者的详细信息。
礼品列在中间。共有六种不同的选项,每种都带有描述、图片和价格。
在页面底部,动态生成一个列出选定礼品的表格。
Default.aspx.cs 文件
Default.aspx.cs 文件包含主要应用程序逻辑。它生成一个选定礼品的表格,创建用于邮件合并的 XML,并包含应用程序 ID 和密钥的原始值。(在下面的代码中,它们已被 NNNN 值替换。)
它执行邮件合并并保存文件。执行邮件合并的代码包含在此部分中:
try
{
Aspose.Cloud.Words.MailMerge mailMerge = new Aspose.Cloud.Words.MailMerge();
mailMerge.ExecuteMailMergewithRegions("CharityTemplate.docx",
xml, Aspose.Cloud.Words.SaveFormat.Docx, Server.MapPath("Letters") +
"\\" + txtDonorName.Text + ".docx", "", true);
}
catch (Exception ex)
{
Session["errorMessage"] = ex.Message;
}
}
在此,应用程序设置新的邮件合并,并定义模板文档、数据源、输出格式、输出路径和文件名。它调用 MailMerge
,如下所述。
输入——合并数据——是根据用户在表单中输入的数据构建的。
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
namespace FloRelief
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
CreateTable();
GridView2.DataSource = (Session["Data"] as DataTable);
GridView2.DataBind();
}
}
protected void btnDonate_Click(object sender, EventArgs e)
{
string xml =
@"<root>
<Charity>
<Date>" + DateTime.Today + @"</Date>
<Giver>" + txtGiverName.Text + @"</Giver>
<Donor>" + txtDonorName.Text + @"</Donor>
<DonorAddress>" + txtDonorAddress.Text + @"</DonorAddress>
";
foreach (DataRow row in (Session["Data"] as DataTable).Rows)
{
xml = xml +
@"
<Gift>
<GiftName>" + row["Gift"] + @"</GiftName>
<GiftValue>" + row["Value"] + @"</GiftValue>
</Gift>
";
}
xml = xml +
@"
</Charity>
</root>";
Aspose.Cloud.Common.AsposeCloudApp.AppSID = "NNNNN”
Aspose.Cloud.Common.AsposeCloudApp.AppKey = "NNNNN";
Aspose.Cloud.Common.Product.BaseProductUri = "http://api.aspose.com/v1.1";
try
{
Aspose.Cloud.Words.MailMerge mailMerge = new Aspose.Cloud.Words.MailMerge();
mailMerge.ExecuteMailMergewithRegions("CharityTemplate.docx", xml,
Aspose.Cloud.Words.SaveFormat.Docx, Server.MapPath("Letters") +
"\\" + txtDonorName.Text + ".docx", "", true);
}
catch (Exception ex)
{
Session["errorMessage"] = ex.Message;
}
}
protected void CartButton_Click(object sender, EventArgs e)
{
string giftName = (sender as Button).Attributes["GiftName"];
string giftValue = (sender as Button).Attributes["GiftValue"];
(Session["Data"] as DataTable).Rows.Add(giftName, giftValue);
GridView2.DataSource = (DataTable)Session["Data"];
GridView2.DataBind();
}
public void CreateTable()
{
DataTable table = new DataTable();
DataColumn column = new DataColumn("Gift", typeof(String));
table.Columns.Add(column);
column = new DataColumn("Value", typeof(String));
table.Columns.Add(column);
// table.Rows.Add("as", "50");
Session.Add("Data", table);
}
}
}
MailMerge.cs 文件
简而言之,MailMerge
代码:
- 引用必要的类,包括
Aspose.Cloud.Common
。 - 构建并签名 URI 以验证 API 调用。
- 获取响应流。
下面是完整的 MailMerge.cs 文件。您会注意到它在向 API 发送请求时构建并签名 URI。
using System;
using System.Collections.Generic;
using System.Text;
using Aspose.Cloud.Common;
using System.IO;
using System.Xml.Serialization;
using System.Xml;
using System.Xml.XPath;
namespace Aspose.Cloud.Words
{
public class MailMerge
{
/// <summary>
/// Execute mail merge with regions.
/// </summary>
/// <param name="FileName"></param>
/// <param name="strXML"></param>
/// <param name="saveformat"></param>
/// <param name="output"></param>
/// <param name="documentFolder"></param>
/// <param name="deleteFromStorage"></param>
public void ExecuteMailMergewithRegions(string FileName, string strXML, SaveFormat saveformat, string output,
string documentFolder , bool deleteFromStorage)
{
try
{
//build URI to get Image
string strURI = Product.BaseProductUri + "/words/" + FileName + "/executeMailMerge?withRegions=true" +
(documentFolder == "" ? "" : "&folder=" + documentFolder);
string signedURI = Utils.Sign(strURI);
string outputFileName = null;
using (Stream responseStream = Utils.ProcessCommand(signedURI, "POST", strXML, "xml"))
{
string strResponse = null;
using (StreamReader reader = new StreamReader(responseStream))
{
//further process JSON response
strResponse = reader.ReadToEnd();
}
using (MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(strResponse)))
{
XPathDocument xPathDoc = new XPathDocument(ms);
XPathNavigator navigator = xPathDoc.CreateNavigator();
//get File Name
XPathNodeIterator nodes = navigator.Select("/SaaSposeResponse/Document/FileName");
nodes.MoveNext();
outputFileName = nodes.Current.InnerXml;
//build URI
strURI = Product.BaseProductUri + "/words/" + outputFileName;
strURI += "?format=" + saveformat + (documentFolder == "" ? "" : "&folder=" + documentFolder);
}
}
//sign URI
signedURI = Utils.Sign(strURI);
//get response stream
using (Stream responseStream = Utils.ProcessCommand(signedURI, "GET"))
{
using (Stream fileStream = System.IO.File.OpenWrite(output))
{
Utils.CopyStream(responseStream, fileStream);
}
}
if (deleteFromStorage)
{
signedURI = Utils.Sign(Product.BaseProductUri + "/storage/file/" +
(documentFolder == "" ? outputFileName : documentFolder + "/" + outputFileName));
Utils.ProcessCommand(signedURI, "DELETE");
}
}
catch (Exception ex)
{
throw ex;
}
}
}
}
完成的邮件合并
输出文件的格式与模板相同,但包含在网页上输入的数据。
摘要
云 API 可用于多种任务。本示例展示了如何从 Web 应用程序执行邮件合并。该过程结构清晰且相对简单:创建数据源,将其发送到 API,然后将其合并到模板中以生成新文档。
Aspose.Words for Cloud 提供了简单而强大的工具,用于在云中进行文档管理和操作。例如,一个允许邮件合并的 API 可以轻松地集成 Web 应用程序和文档管理。
如果您想尝试一下,请创建一个帐户并开始免费试用。 尝试 Aspose.Words for Cloud。