如何从 Microsoft Office Word 的活动工作文档中发送电子邮件






4.83/5 (10投票s)
我们将讨论 Microsoft Office Word 7 的一个插件,它能够发送带有少量文本的电子邮件,并将当前文档作为 Zip/压缩文件或标准 Microsoft Office Word 文档文件格式附加,然后从 Microsoft Office Word 界面发送邮件。
目录
- 引言
- 主题背后的小故事
- 我们将讨论什么
- 创建你的第一个 Microsoft Office 插件项目
- 在 Microsoft Office 应用程序上下文菜单中添加菜单项
- 在当前活动文档中插入简单文本
- 从你的插件中调用 Win32 窗体
- 将活动文档存储到“我的文档”文件夹
- 将活动文档压缩到“我的文档”文件夹
- 从 Microsoft Office Word 访问 Microsoft Office Outlook MAPI
- 从 Microsoft Outlook 联系人文件夹中检索并显示联系人列表
- 编写电子邮件并自动附加文档
- 将带有附件的电子邮件发送到 Microsoft Office Outlook
- 关注点
- 参考
- 结论
- 历史
1. 引言
我想先分享一个小场景。是的,你可以跳过这一部分,但我还是请求你阅读一下,尽管这些场景与文章的实际内容没有直接关系,也不会给你带来一些技术知识,但我认为了解一下还是有点重要的,因为它会让你了解本文的实际想法/目的。让我们从一个小故事开始。
2. 主题背后的小故事
“TadpoleTechnologies Ltd.”是一家计算机软件开发公司,这个场景的主角是一名办公室文员。她有很多工作职责,其中一项主要任务是撰写各种类型的商业提案、问题报告、准备报告等,并将其发送给相关人员。她使用 Microsoft Office Word 7 进行写作、编辑、报告等工作,并使用 Microsoft Office Outlook 7 发送每一项内容。
她的工作流程大概是这样的:首先她打开 Microsoft Office Word 7 开始写作,当写作任务完成后,她将其保存在一个特定的位置,然后关闭 Microsoft Office Word 7 应用程序,并对文件进行压缩/打包。最后,她打开 Microsoft Office Outlook,附加文件,写一些文字,然后发送这封电子邮件。这很简单,但她每天必须重复这项任务一百多次。她非常苦恼,完成一个任务大约需要五分钟。有一天,她来到我的办公桌前,请求我给她安排一些其他的工作,她再也干不下去了。好吧,我请她给我一天时间来解决这个问题。
3. 我们将讨论什么
最后,我给了她一个非常有趣的解决方案,我想知道她是否对此感到满意。实际上,我开发了一个 Microsoft Office Word 7 插件,它能够发送带有少量文本的电子邮件,并将当前文档作为 Zip/压缩文件或标准 Microsoft Office Word 文档文件格式附加,然后从 Microsoft Office Word 界面发送邮件。
哦,故事没那么长,我不想再多说了;总之,伙计们,我希望你们已经明白了我们到底想讨论什么。是的,你说得对,在本文中,我们将讨论如何将在 Office Word 界面上处理同一文档时,根据请求将 Microsoft Office Word 文档以普通格式或 zip 格式直接发送到 Microsoft Office Outlook,以便发送给某人。
4. 创建你的第一个 Microsoft Office 插件项目
要为 Microsoft Office 系统(例如 Outlook 2007、Word 2007 等)开发插件,你需要学习一些基础知识,比如如何使用 Microsoft Visual Studio 2008/2010 模板进行 Office 开发以及其他一些东西。我建议你阅读我之前关于使用 Microsoft Visual Studio 创建插件的文章,地址如下:
- 使用 Microsoft Visual C#.NET 的 Outlook 2007 插件 - 第 1 部分
- 使用 Microsoft Visual C#.NET 的 Outlook 2007 插件 - 第 2 部分
- 如何在 Microsoft Office Word 7/10 应用程序上下文菜单中添加菜单项
4.1 在 Microsoft Office 应用程序上下文菜单中添加菜单项
好的,我已经在之前的文章中讨论了如何在 Microsoft Office 应用程序上下文菜单中创建/添加菜单项;无论如何,如果你想阅读,请访问下面的链接
4.2 在当前活动文档中插入简单文本
太棒了!现在我们来看看如何从 C# 代码中向你的活动文档添加一些文本内容。这非常简单,我们只需要知道如何使用“Selection.InsertAfter()
”方法。下面是一个示例代码片段
代码片段示例 - 1
Word.Application applicationObject =
Globals.ZipSenderAddIn.Application as Word.Application;
Globals.ZipSenderAddIn.Application.Selection.InsertAfter
("I love CodeProject" + Environment.NewLine);
Globals.ZipSenderAddIn.Application.Selection.InsertAfter
("Author : " + "Md. Marufuzzaman" + Environment.NewLine);
Globals.ZipSenderAddIn.Application.Selection.InsertAfter
("Thanks To : " + Environment.UserName + Environment.NewLine);
有关 Selection.InsertAfter()
的更多信息,请访问此链接。
4.3 从你的插件中调用 Win32 窗体
从 C#.NET Microsoft Office 插件中调用 WinForm 并不是什么新鲜事,就像我们在任何桌面应用程序开发中调用 WinForm 一样。在这个插件中,我使用了一个名为“ZipSender.cs”的 Win32 窗体。下面是一个示例代码片段
代码片段示例 - 2
ZipSenderWord7AddIn.Win32Forms.ZipSender zipSender = new Win32Forms.ZipSender();
zipSender.Show();
5. 将活动文档存储到“我的文档”文件夹
好的,在这一节中,我们将讨论如何保存/存储活动文档;这真的非常简单,Microsoft.Office.Interop.Word
命名空间提供了许多方法、属性和委托,使我们的开发过程更快。好吧,我们实际做的是,我们创建一个函数 SaveDocument()
,它将接受一个参数,即带有名称的文档完整路径。最后我们创建一个 Microsoft Office 应用程序的实例,然后调用 SaveAs()
方法,并附带一些必需的参数,例如文档名称、路径、类型等。下面是一个示例代码片段
代码片段示例 - 3
public bool SaveDocument(string fileName)
{
string filePath = this.GetMyDocuments();
bool retValue = false;
fullPath = filePath + "\\" + fileName;
Word.Application applicationObject =
Globals.ZipSenderAddIn.Application as Word.Application;
try
{
applicationObject.ActiveDocument.SaveAs(filePath + "\\" + fileName
, Type.Missing
, Type.Missing
, Type.Missing
, Type.Missing
, Type.Missing
, Type.Missing
, Type.Missing
, Type.Missing
, Type.Missing
, Type.Missing
, Type.Missing
, Type.Missing
, Type.Missing
, Type.Missing
, Type.Missing);
retValue = true;
}
catch (Exception exception)
{
retValue = false;
MessageBox.Show("Error: " + exception.Message);
}
return retValue;
}
有关 ActiveDocument.SaveAs()
的更多信息,请访问此链接。
5.1 将活动文档压缩到“我的文档”文件夹
我写了一个非常简单的函数来压缩文档,我使用了一个开源工具来压缩文档。下面是一个示例代码片段
代码片段示例 - 4
public bool ZipDocument(string accessPath, string fileExt)
{
bool retValue = false;
ZipFile zipFiles = new ZipFile();
fileName = Path.GetFileName(accessPath);
if (fileExt != ".docx")
{
try
{
zipFiles.AddFile(accessPath + ".docx", "Document");
zipFiles.Save(fileName + ".zip");
retValue = true;
}
catch (Exception exception)
{
retValue = false;
MessageBox.Show("Error: " + exception.Message);
}
}
else
{
retValue = true;
}
return retValue;
}
有关 Zip API 的更多信息,请访问此链接。
6. 从 Microsoft Office Word 访问 Microsoft Outlook MAPI
要从 Microsoft Office Word 访问 Microsoft Office Outlook,我们将使用 Microsoft 提供的 Microsoft.Office.Interop.Outlook
命名空间。好的,我写了以下函数来从 Microsoft Office Outlook 联系人文件夹中获取联系人
6.1 从 Microsoft Outlook 联系人文件夹中检索并显示联系人列表
代码片段示例 - 5
public List<string> GetContact()
{
List<string> contactList = new List<string>();
try
{
outlookObj = new Outlook.Application();
olNameSpace = outlookObj.GetNamespace("MAPI");
olNameSpace.Logon(null, null, true, true);
Outlook.MAPIFolder contactsFolder =
(Outlook.MAPIFolder)outlookObj.Session.GetDefaultFolder
(Outlook.OlDefaultFolders.olFolderContacts);
foreach (Outlook.ContactItem contactItem in contactsFolder.Items)
{
if (contactItem.Email1Address !=null)
{
contactList.Add(contactItem.Email1Address);
}
}
}
catch
{
}
return contactList;
}
下图 A 显示了联系人列表。

有关 Microsoft.Office.Interop.Outlook
的更多信息,请访问此链接。
6.2 编写电子邮件并自动附加文档
我创建了一个非常简单的界面来添加电子邮件地址、主题、邮件正文等。好的,下图 B 显示了发送电子邮件的基本界面。
如果你仔细看,你会发现一个复选框,它提供了功能,让附件文件是普通的 Microsoft Office Word 默认格式,还是作为 zip 文件附加。我写了几个函数,它们将附加文件、添加所有电子邮件内容并将其发送到 Microsoft Outlook 的发件箱文件夹。下面是一个示例代码片段。
6.3 将带有附件的电子邮件发送到 Microsoft Office Outlook
代码片段示例 - 6
private void buttonSend_Click(object sender, EventArgs e)
{
this.labelDeliveryStatus.Text = "Sending...";
this.progressBarZipSender.Value = 25;
ZipSenderTools zipSenderTools = new ZipSenderTools();
name = this.textBoxFileName.Text;
this.buttonSend.Enabled = false;
try
{
if (name != null)
{
if (zipSenderTools.SaveDocument(name))
{
if (zipSenderTools.ZipDocument(zipSenderTools.fullPath, fileExtType))
{
this.progressBarZipSender.Value = 50;
if (zipSenderTools.SubmitToOutlook(this.textBoxSendTo.Text
, this.textBoxCcTo.Text
, this.textBoxSubject.Text
, this.richTextBoxBody.Text
, zipSenderTools.fullPath +
fileExtType))
{
this.progressBarZipSender.Value = 100;
this.labelDeliveryStatus.Text = "Email successfully sent.";
MessageBox.Show("Delivery Success.","Status",
MessageBoxButtons.OK, MessageBoxIcon.Information);
zipSenderTools.DeleteZipDocument
(zipSenderTools.fullPath + fileExtType, fileExtType);
this.Close();
}
else
{
this.progressBarZipSender.Value = 0;
this.labelDeliveryStatus.Text = "Email sending fail.";
MessageBox.Show("Delivery Fail","Status",
MessageBoxButtons.OK, MessageBoxIcon.Error);
zipSenderTools.DeleteZipDocument
(zipSenderTools.fullPath + fileExtType, fileExtType);
}
}
}
}
else
{
MessageBox.Show("Enter a valid file name.");
}
}
catch (Exception exception)
{
MessageBox.Show("Error: " + exception.Message);
}
this.buttonSend.Enabled = true;
}
现在,怎么样?我们差不多完成了!成功发送后,它会显示一条消息。下图 C 显示了成功发送,图 D 显示了 Outlook 的状态。
7. 兴趣点
我仅为 Microsoft Office Outlook 实现了这个功能。我计划在下一个版本中添加 Gmail、Yahoo、AOL。
8. 参考资料
9. 结论
这纯粹是为了好玩,希望对某些人有所帮助。
10. 历史
- 2011年9月2日:初次发布