我的客户服务系统在收到新查询时会发送电子邮件通知。我可以回复该通知,系统将使用我的电子邮件回复中的信息更新查询。
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有一些熟悉,但很新。请帮忙!
答案 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
。我将两个文本框拖到我离开的表单中,其默认名称为TextBox1
和TextBox2
。我还拖了一个命令按钮,我将其重命名为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()
,它将新值输出到立即窗口。