Excel 通过 Outlook 全自动发送和回复

Fully automated sending and replying from Excel, through Outlook

您好。这是我第一次post来这里,所以请多多包涵。

我计划暂时在MS Access 中设计一个数据库软件。我为这个软件计划的功能之一是提交文件以供批准。 ideia 是从数据库(报告或表格)中单击以发送预先编写的电子邮件,附件中有文档,但是,该预先编写的电子邮件将有一个 link 发送返回一封预先写好的电子邮件,用于快速自动 response/reply,但不使用 Outlook 的回复。 objective是人从DB发送,其他人接收,阅读文档,如果批准,点击"auto respond",Outlook就只是一个"reading"软件,所有的发送都在背景.

虽然我计划使用 Access 应用程序,但我在 Excel 中起草了一个示例,以便进行更快速的测试(target prop 用于在它可以容纳字符串的地方传递字符串)。这是到目前为止的代码。

Private Function SendEmailWithOutlook(MessageTo As String, Subject As String, MessageBody As String, myAttachment As String)

' Define app variable and get Outlook using the "New" keyword
Dim olApp As New Outlook.Application
Dim olMailItem As Outlook.MailItem  ' An Outlook Mail item

' Create a new email object
Set olMailItem = olApp.CreateItem(0)

' Add the To/Subject/Body to the message and display the message
With olMailItem
    .to = MessageTo
    .Subject = Subject
    .BodyFormat = olFormatHTML
    .HTMLBody = MessageBody
    .Attachments.Add (myAttachment)
    .Send       ' Send the message immediately
End With

' Release all object variables
Set olMailItem = Nothing
Set olApp = Nothing

End Function

(来自微软网站)

准备和发送代码的函数。

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)

Dim myMsg As String

If Target.TextToDisplay = "ASK APROVAL" Then

Set c = ActiveWorkbook.Sheets(1).Range("E:E").Find(Target.ScreenTip, LookIn:=xlValues)

If c Is Nothing Then
    MsgBox "File Not Found"
    Exit Sub
End If

'Retrieves the file name, stored in a cell to the right of the path
myFile = c.Offset(0, 1).Value

'Prepares the file for HTML reading
myFile = Replace(myFile, " ", "%20")

myMsg = "<HTML><BODY><SCRIPT type=""VBScript"">" & Chr(13)
myMsg = myMsg & "FUNCTION SendEmail()" & Chr(13)
myMsg = myMsg & "Dim olApp As New Outlook.Application" & Chr(13)
myMsg = myMsg & "Dim olMailItem As Outlook.MailItem" & Chr(13)
myMsg = myMsg & "Set olMailItem = olApp.CreateItem(0)" & Chr(13)
myMsg = myMsg & "With olMailItem" & Chr(13)
myMsg = myMsg & ".to = ""firstsender@company.com""" & Chr(13)
myMsg = myMsg & ".Subject = ""Approval""" & Chr(13)
myMsg = myMsg & ".BodyFormat = olFormatHTML" & Chr(13)
myMsg = myMsg & ".HTMLBody = ""<HTML><BODY>The document metioned bellow is approved!<P>"
myMsg = myMsg & myFile
myMsg = myMsg & "<P>(Auto Response)</BODY></HTML>""" & Chr(13)
myMsg = myMsg & ".Send" & Chr(13)
myMsg = myMsg & "End With" & Chr(13)
myMsg = myMsg & "Set olMailItem = Nothing" & Chr(13)
myMsg = myMsg & "Set olApp = Nothing" & Chr(13)
myMsg = myMsg & "End Function" & Chr(13)
myMsg = myMsg & "</SCRIPT>Dear Boss<P>Attached to this e-mail is a document for your approval. Thanks.<P><BR><a href=""#"" onclick=""SendMail()"">Click for auto response.</a>"
myMsg = myMsg & "</BODY></HTML>"

SendEmailWithOutlook "approver@company.com", "Approval of Document in Attachment", myMsg, Target.ScreenTip

Set c = Nothing
End If

End Sub

电子邮件已成功发送,但是 return 电子邮件的 link 虽然存在,但点击后没有任何反应。就是这个问题。

根据测试,通过立即调试 window,发送的完整 HTML 代码看起来是正确的,每个引用都已到位。

作为代码的其他选项,我之前尝试过使用简单的 javascript 函数和 "windows.location.href:'mailto:...",但没有效果。我尝试的第一件事是通过 HTMLbody 发送一个表单,但是提交按钮显示为括号中的文本。

我不知道这是否可行,或者我的思路是否偏离了。所以,感谢一些帮助。非常感谢。

出于安全原因,脚本在电子邮件正文中不起作用。此外,电子邮件正文中的 link 也不是一个好主意,它不会按您想要的方式工作。相反,您可以考虑开发一个可以安装在远程机器上的插件。当您收到这样的电子邮件(您需要在其中获得任何反馈)时,您可以在 Outlook UI 中添加一个功能区按钮,例如,另外添加一个 同意并回复 按钮到标准按钮。在按钮的事件处理程序中,您可以添加一个用户 属性,您可以在收件箱中获取该用户。有道理吗?