Outlook:需要根据自定义表单中的选择将文本和文本变量插入电子邮件回复正文中

时间:2015-10-17 17:15:43

标签: forms vba outlook outlook-vba

我的客户服务系统在收到新查询时会发送电子邮件通知。我可以回复该通知,系统将使用我的电子邮件回复中的信息更新查询。

Reply example:

To: "client inquiry system"
Subject: Re: I am having password trouble Inquiry:5601 
Body of email below:

Your password has been reset.

以上内容将附加"您的密码已被重置。"查询说明。

如果我在电子邮件正文的顶部放置特殊语法,我也可以触发状态更改(即已关闭,已解决,已解除)。

To: "client inquiry system"
Subject: Re: Inquiry:5601 -- I am having password trouble
Body of email below:

Status=Closed
Your password has been reset.

以上将在我的系统中将查询设置为已关闭。

我想使用表单或宏按钮,为用户提供下拉选项或自由表单文本,这些文本将在设置后添加到电子邮件正文的顶部。

我对VBA有一些熟悉,但很新。请帮忙!

1 个答案:

答案 0 :(得分:-1)

我对你对我的评论的回复并不相信,但这个答案是试图提供帮助。它包括四个宏,用于演示您需要的功能。我希望这足以让你开始。

当您打开Outlook的Visual Basic编辑器时,您将在屏幕左侧看到类似下面的内容。如果您没有看到,请单击 Ctrl + R

- Project 1 (VbaProject.OTM)
  - Microsoft Office Outlook Objects
    ThisOutlookSession
  - Modules
      Module1

连字符将在小盒子里。如果任何连字符是加号,请单击加号以展开标题下的列表。

点击ThisOutlookSession。您将在右侧获得一个空代码区域。这类似于模块代码区域,但用于事件例程。将此代码复制到该区域:

Option Explicit
Public WithEvents MyNewItems As Outlook.Items
Private Sub Application_Startup()

  ' This event routine is called when Outlook is started

  Dim NS As NameSpace
  Dim UserName As String

  Set NS = CreateObject("Outlook.Application").GetNamespace("MAPI")

  With NS
    UserName = .CurrentUser
   Set MyNewItems = .GetDefaultFolder(olFolderInbox).Items
  End With

  MsgBox "Welcome " & UserName

End Sub
Private Sub myNewItems_ItemAdd(ByVal Item As Object)

  ' This event routine is called each time an item is added to Inbox
  ' because of:
  '   Public WithEvents MyNewItems As Outlook.Items
  '   Set MyNewItems = .GetDefaultFolder(olFolderInbox).Items

  With Item
    Debug.Print "#####" & Format(Now(), "dMmmyy hh:mm:ss") & _
                ": Item added to Inbox with Subject: [" & .Subject & _
                "] from [" & .SenderEmailAddress & "] with Text body"
    Debug.Print .Body
  End With

End Sub

关闭Outlook并单击表示“是否要保存VBA项目'VbaProject.OTM?'”

重新开启Outlook。您将被告知程序正在尝试访问电子邮件地址。点击Allow access for,选择10 minutes,然后点击。你会看到一个窗口,上面写着“欢迎John Doe”。

如果没有发生这种情况,请选择Tools,然后选择Macros,然后选择Security。必须选择安全级别Medium才能安全地使用宏。

Application_Startup()已访问Outlook的电子邮件数据库。由于Outlook具有非常强大的安全系统,因此要避免要求用户允许访问并不容易。有一个四步自我认证过程,应该允许您为自己的宏抑制此问题。我已成功完成前三个步骤,但从未掌握第四步。我已经仔细遵循了我在网上找到的指示,但没有任何对我有用。也许你会更成功,或者如果你想要压制这个问题,你可以找到可以指导你的专家

Application_Startup()做了两件事:发出欢迎消息并初始化MyNewItems。欢迎消息只是一个演示,您可以访问用户的名称,如果您有共享的收件箱,这可能很有用。初始化MyNewItems会激活事件例程myNewItems_ItemAdd()。这会将每个新项目的详细信息输出到立即窗口。

这是我认为对您有用的事件例程的快速演示。但是,我发现如果myNewItems_ItemAdd()在第二个到达时忙于一个项目,则不会为第二个项目调用它。我使用的是旧版本的Outlook,这可能是在以后的版本中已经清除的错误。如果您决定使用事件例程,则需要进行检查。

获取电子邮件权限的另一种方式是Explorer。插入一个新模块并将以下代码复制到其中:

Option Explicit
Public Sub DemoExplorer()

  Dim Exp As Outlook.Explorer
  Dim ItemCrnt As MailItem
  Dim NumSelected As Long

  Set Exp = Outlook.Application.ActiveExplorer

  NumSelected = Exp.Selection.Count

  If NumSelected = 0 Then
    Debug.Print "No emails selected"
  Else
    For Each ItemCrnt In Exp.Selection
      With ItemCrnt
        Debug.Print "From " & .SenderName & " Subject " & .Subject
      End With
    Next
  End If

End Sub

DemoExplorer()显示了另一种授予邮件项宏访问权限的方法。用户选择一个或多个电子邮件,然后激活宏DemoExplorer()。同样,这只是将邮件项的一些属性输出到立即窗口。

单击 F2 ,代码窗口将替换为库列表。向下滚动类列表,然后选择MailItem。右侧窗口显示MailItem的所有成员。有些内容,例如ReceivedTime,很明显,但您可能最需要查看。我建议你记下所有看起来很有用的东西。单击一个模块,在完成后返回到代码窗口。

下面的

DemoReply()DemoExplorer()的更新版本,可回复所选的电子邮件。将此代码添加到您的模块:

Public Sub DemoReply()

  Dim Exp As Outlook.Explorer
  Dim ItemCrnt As MailItem
  Dim Reply As MailItem
  Dim Subject As String
  Dim SenderAddr As String
  Dim Received As Date

  Set Exp = Outlook.Application.ActiveExplorer

  If Exp.Selection.Count = 0 Then
    Debug.Print "No emails selected"
  Else
    For Each ItemCrnt In Exp.Selection

      ' Get properties of message received
      With ItemCrnt
        Subject = .Subject
        SenderAddr = .SenderEmailAddress
        Received = .ReceivedTime
      End With

      ' Create reply
      Set Reply = CreateItem(olMailItem)
      With Reply
        .BodyFormat = olFormatPlain
        .Body = "Thank you for your enquiry" & vbLf & _
                "  Subject: " & Subject & vbLf & _
                "  Received at: " & Format(Received, "d Mmm yyyy h:mm:ss") & vbLf & _
                "which will be handled as soon as an analyst is available."
        .Subject = "Thank you for your enquiry"
        .Recipients.Add SenderAddr
        ' Display allows the user to review the reply before it is written to Outbox
        ' but control is not returned to this macro. Only the first select mail item
        ' will be processed
        ' Send gives the user no opportunity to review the replies but the macro does not
        ' use control so all replies are sent.
        '.Display
        .Send
      End With

    Next
  End If

End Sub

我的私人电子邮件使用Outlook地址,公共电子邮件使用Gmail地址。我从Gmail地址向自己发送了一些短信。在Outlook中,我选择了这些电子邮件并激活了DemoReply()。预期的回复已到达我的Gmail收件箱。尝试给自己发一些电子邮件,然后尝试回复。

为了演示在Outlook中使用useform,我插入了一个新表单并将名称保留为默认UserForm1。我将两个文本框拖到我离开的表单中,其默认名称为TextBox1TextBox2。我还拖了一个命令按钮,我将其重命名为cmdSend

Outlook宏只能通过全局变量与用户表单进行通信。在模块顶部添加以下内容;它们必须放在任何宏之前:

Public Box1 As String
Public Box2 As String

将此宏添加到模块:

Sub DemoForm()

  ' Initialise global variables to be used by form before it is loaded
  Box1 = "Initial value for text box1"
  Box2 = "Initial value for text box2"

  Load UserForm1
  UserForm1.Show vbModal
  ' Control does not return to this module until user releases control of form

  Debug.Print Box1
  Debug.Print Box2

End Sub

将此代码添加到表单中:

Private Sub cmdSend_Click()

  Box1 = TextBox1
  Box2 = TextBox2

  Unload Me

End Sub
Private Sub UserForm_Initialize()

  TextBox1 = Box1
  TextBox2 = Box2

End Sub

激活DemoForm()。将出现表单,文本框设置为“文本框1的初始值”和“文本框2的初始值”。更改这些值,然后单击发送。控制将返回到DemoForm(),它将新值输出到立即窗口。