将文件附加到 Outlook Email邮件

本主题介绍如何以编程方式将一个或多个文件附加到 Microsoft Outlook 中的传出电子邮件。

提供者: Ken Getz, MCW Technologies, LLC

附件的对象模型支持

在 Outlook 中,MailItem 对象的 Attachments 属性支持将一个或多个文件附加到电子邮件。 若要在发送邮件项目之前将一个或多个文件附加到邮件项目,请为每个附件文件调用 Attachments 对象的 Add (Object、 Object、 Object) 方法。 Add 方法允许使用 OlAttachmentType 枚举) 指定 (Source 参数的文件名, (Type 参数) 附件类型。 对于文件系统中的文件,请将Type 参数指定为 Outlook.olAttachmentType.olByValue 枚举值。

注意 自 Microsoft Office Outlook 2007 以来,始终使用此值在文件系统中附加文件的副本;不再支持 Outlook.olAttachmentType.olByReference

此外,当以 RTF) 格式 (格式发送电子邮件时,还可以在调用 Add 方法时指定另外两个可选参数(Position 和DisplayName)。 使用Position 参数可以指定电子邮件中附件应出现的位置。 对Position 参数使用以下值之一:

  • 值 0 隐藏电子邮件正文中的附件。

  • 值 1 将附件置于第一个字符之前。

  • 大于电子邮件项目正文中的字符数的数字会将附件置于正文文本的末尾。

对于 RTF 电子邮件,还可以指定 DisplayName 参数,该参数提供附件邮件正文中显示的名称。 对于纯文本或 HTML 电子邮件,附件仅显示文件的名称。

发送包含文件作为附件的邮件

SendEmailWithAttachments本主题后面的代码示例中的示例过程接受以下内容:

  • 对 Outlook Application 对象的引用。

  • 包含邮件的主题和正文的字符串。

  • 包含邮件收件人 SMTP 地址列表的字符串的泛型列表。

  • 一个包含发件人 SMTP 地址的字符串。

  • 包含要附加的文件的路径的字符串的泛型列表。

创建新的电子邮件项目后,代码会将每个收件人添加到邮件项目的 Recipients 集合属性。 代码调用 ResolveAll () 方法后,它会设置邮件项目的 SubjectBody 属性,然后循环访问提供的附件路径列表中的每一项,并将每个属性添加到邮件项目的 Attachments 属性。

在实际发送电子邮件之前,必须指定要从中发送电子邮件的帐户。 查找此信息的一种方法是使用发件人的 SMTP 地址。 函数 GetAccountForEmailAddress 接受包含发件人 SMTP 电子邮件地址的字符串,并返回相应 Account 对象的引用。 此方法将发件人的 SMTP 地址与为会话的配置文件定义的每个已配置电子邮件帐户的 SmtpAddress 属性进行比较。 application.Session.Accounts 返回当前配置文件的 帐户 集合,以及所有帐户(包括 Exchange、IMAP 和 POP3 帐户)的跟踪信息,其中每个帐户都可以与不同的传递存储相关联。 具有与发件人 SMTP 地址匹配的关联的 SmtpAddress 属性值的 Account 对象是用于发送电子邮件的帐户。

标识适当的帐户后,代码完成方法是将邮件项目的 SendUsingAccount 属性设置为该 Account 对象,然后调用 Send () 方法。

下面的托管代码示例是使用 C# 和 Visual Basic 编写的。 若要运行需调入组件对象模型 (COM) 的 .NET Framework 托管代码示例,您必须使用可定义托管接口并将其映射到对象模型类型库中的 COM 对象的互操作程序集。 对于 Outlook,您可以使用 Visual Studio 和 Outlook 主互操作程序集 (PIA)。 在您运行适用于 Outlook 2013 的托管代码示例之前,请确保您已安装了 Outlook 2013 PIA 并且已添加了对 Visual Studio 中的 Microsoft Outlook 15.0 对象库组件的引用。 应使用适用于 Visual Studio) 的 Office 开发人员工具在 Outlook 外接程序 (类中使用以下代码示例 ThisAddIn 。 代码中的 应用程序对象必须是由 提供的受信任 Outlook ThisAddIn.Globals对象。 有关使用 Outlook PIA 开发托管 Outlook 解决方案的详细信息,请参阅欢迎使用 MSDN 上的 Outlook 主互操作程序集参考

以下代码演示如何以编程方式将文件附加到 Outlook 中的传出电子邮件。 若要演示此功能,请在 Visual Studio 中创建名为 AttachFileAddIn的新托管 Outlook 外接程序,并将 ThisAddIn.vb 或 ThisAddIn.cs 文件的内容替换为此处所示的示例代码。 ThisAddIn_Startup修改过程以在文件系统中包含对文件的引用,并相应地更新电子邮件地址。 调用 SendMailWithAttachments 过程中包含的 SMTP 地址必须与以前在 Outlook 中配置的某个传出电子邮件帐户的 SMTP 地址相对应。

using System.Collections.Generic;
using Outlook = Microsoft.Office.Interop.Outlook;
 
namespace AttachFileAddIn
{
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            List<string> attachments = new List<string>();
            attachments.Add("c:\\somefile.txt");
 
            List<string> recipients = new List<string>();
            recipients.Add("john@contoso.com");
            recipients.Add("john@example.com");
            SendEmailWithAttachments(Application, "Test", "Body", recipients, "john@example.com", 
              attachments);
        }
 
        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }
 
        private void SendEmailWithAttachments(Outlook.Application application, 
            string subject, string body, List<string> recipients, 
            string smtpAddress, List<string> attachments)
        {
 
            // Create a new MailItem and set the To, Subject, and Body properties.
            var newMail = application.CreateItem(Outlook.OlItemType.olMailItem) as Outlook.MailItem;
 
            // Set up all the recipients.
            foreach (var recipient in recipients)
            {
                newMail.Recipients.Add(recipient);
            }
            if (newMail.Recipients.ResolveAll())
            {
                newMail.Subject = subject;
                newMail.Body = body;
                foreach (string attachment in attachments)
                {
                    newMail.Attachments.Add(attachment, Outlook.OlAttachmentType.olByValue);
                }
            }
 
            // Retrieve the account that has the specific SMTP address.
            Outlook.Account account = GetAccountForEmailAddress(application, smtpAddress);
            // Use this account to send the email.
            newMail.SendUsingAccount = account;
            newMail.Send();
        }
 
        private Outlook.Account GetAccountForEmailAddress(Outlook.Application application, 
            string smtpAddress)
        {
 
            // Loop over the Accounts collection of the current Outlook session.
            Outlook.Accounts accounts = application.Session.Accounts;
            foreach (Outlook.Account account in accounts)
            {
                // When the email address matches, return the account.
                if (account.SmtpAddress == smtpAddress)
                {
                    return account;
                }
            }
            // If you get here, no matching account was found.
            throw new System.Exception(string.Format("No Account with SmtpAddress: {0} exists!", 
                smtpAddress));
        }
 
        #region VSTO generated code
 
        /// <summary>
        /// Required method for Designer support - don't modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }
        
        #endregion
    }
}
Public Class ThisAddIn
 
    Private Sub ThisAddIn_Startup() Handles Me.Startup
        Dim attachments As New List(Of String)
        attachments.Add("c:\somefile.txt")
 
        Dim recipients As New List(Of String)
        recipients.Add("john@contoso.com")
        recipients.Add("john@example.com")
        SendEmailWithAttachments(Application, "Test", "Body", recipients, "john@contoso.com", attachments)
    End Sub
 
    Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
 
    End Sub
 
    Private Sub SendEmailWithAttachments(ByVal application As Outlook.Application, _
        ByVal subject As String, ByVal body As String,
        ByVal recipients As List(Of String),
        ByVal smtpAddress As String,
        ByVal attachments As List(Of String))
 
        ' Create a new MailItem and set the To, Subject, and Body properties.
        Dim newMail As Outlook.MailItem =
            DirectCast(application.CreateItem(Outlook.OlItemType.olMailItem), 
            Outlook.MailItem)
 
        ' Set up all the recipients.
        For Each recipient In recipients
            newMail.Recipients.Add(recipient)
        Next
        If newMail.Recipients.ResolveAll() Then
            newMail.Subject = subject
            newMail.Body = body
            For Each attachment As String In attachments
                newMail.Attachments.Add(attachment, Outlook.OlAttachmentType.olByValue)
            Next
        End If
 
        ' Retrieve the account that has the specific SMTP address.
        Dim account As Outlook.Account = GetAccountForEmailAddress(application, smtpAddress)
        ' Use this account to send the email.
        newMail.SendUsingAccount = account
        newMail.Send()
    End Sub
 
   
    Private Function GetAccountForEmailAddress(
        ByVal application As Outlook.Application,
        ByVal smtpAddress As String) As Outlook.Account
 
        ' Loop over the Accounts collection of the current Outlook session.
        Dim accounts As Outlook.Accounts = application.Session.Accounts
        For Each account In accounts
            ' When the email address matches, return the account.
            If account.SmtpAddress = smtpAddress Then
                Return account
            End If
        Next
        ' If you get here, no matching account was found.
        Throw New System.Exception(
            String.Format("No Account with SmtpAddress: {0} exists!", smtpAddress))
    End Function
End Class

另请参阅

将 Outlook 联系人项目附加到Email邮件限制 Outlook Email邮件的附件修改 Outlook Email邮件附件

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。