65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (10投票s)

2011 年 9 月 2 日

CPOL

7分钟阅读

viewsIcon

44156

downloadIcon

673

我们将讨论 Microsoft Office Word 7 的一个插件,它能够发送带有少量文本的电子邮件,并将当前文档作为 Zip/压缩文件或标准 Microsoft Office Word 文档文件格式附加,然后从 Microsoft Office Word 界面发送邮件。

目录

  1. 引言
  2. 主题背后的小故事
  3. 我们将讨论什么
  4. 创建你的第一个 Microsoft Office 插件项目
    1. 在 Microsoft Office 应用程序上下文菜单中添加菜单项
    2. 在当前活动文档中插入简单文本
    3. 从你的插件中调用 Win32 窗体
  5. 将活动文档存储到“我的文档”文件夹
    1. 将活动文档压缩到“我的文档”文件夹
  6. 从 Microsoft Office Word 访问 Microsoft Office Outlook MAPI
    1. 从 Microsoft Outlook 联系人文件夹中检索并显示联系人列表
    2. 编写电子邮件并自动附加文档
    3. 将带有附件的电子邮件发送到 Microsoft Office Outlook
  7. 关注点
  8. 参考
  9. 结论
  10. 历史

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 创建插件的文章,地址如下:

我希望你现在对这个领域有了很好的理解。让我们继续前进。

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 显示了联系人列表。

operation-1.png

有关 Microsoft.Office.Interop.Outlook 的更多信息,请访问此链接

6.2 编写电子邮件并自动附加文档

我创建了一个非常简单的界面来添加电子邮件地址、主题、邮件正文等。好的,下图 B 显示了发送电子邮件的基本界面。

图 - B

operation-2.png

如果你仔细看,你会发现一个复选框,它提供了功能,让附件文件是普通的 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 的状态。

图 - C

delivery-success.png

图 - D

outlook-delivery.png

7. 兴趣点

我仅为 Microsoft Office Outlook 实现了这个功能。我计划在下一个版本中添加 Gmail、Yahoo、AOL。

8. 参考资料

9. 结论

这纯粹是为了好玩,希望对某些人有所帮助。

10. 历史

  • 2011年9月2日:初次发布
© . All rights reserved.