2016-11-29 65 views
0

我有一个非常特殊的问题,我相信一个可能是this question的副本,但它从来没有回答过。我接收特定电子邮件时会运行一个宏。它会以电子邮件的方式回复“已批准”或“已拒绝”的投票选项。当投票选项的收件人选择回复时,收到的“选择”电子邮件没有正文。有没有办法保留身体?VotingOptions对自定义身体的回复回复

我已经试过这至今:

With objMsg 
    .To = strEmail 
    .HTMLBody = Item.HTMLBody 
    .Subject = "Is This Approved?" 
    .VotingOptions = "Approved;Rejected" 
    .VotingResponse = "Yes" 
    .Attachments.Add Item 
    .Display 
    .Send 
End With 

不过,我认为,这只是影响了初始的电子邮件,而不是反应。我也看过MailItem Object,但在.VotingOptions.VotingResponse之外没有看到投票的任何选项。有什么我可能会错过,这将帮助我完成这个目标?只要它可以在响应中包含主体,我就可以接受投票按钮之外的想法(例如Task或类似的东西)。

任何想法将不胜感激。

+0

回复的主体依赖于收件人以及他们在发送之前是否编辑回复。因此你有两个选择,我可以看到。每个收件人都需要一个VBA后端来更改邮件以返回给您(不太可能实现),或者您可以向该主题添加一个排序(或日期 - 时间)的散列码,以便您可以知道哪些电子邮件它是指投票时收到 – Tragamor

+0

http://stackoverflow.com/questions/7710191/getting-messageid-from-email-in-outlook-vba-2003 – Tragamor

回答

1

正如我在上面的评论中提到的,我认为向主题添加一个小散列是唯一可以跟踪邮件线索回复的方法。下面是用于基于日期和时间的散列以作为前缀添加给受试者

Sub TestHash() 
    Dim lDate As Date: lDate = Now 
    MsgBox DateTimeHash(lDate) 
End Sub 

Function DateTimeHash(lDate As Date) As String 
    DateTimeHash = "#" & fBase36Encode(DateValue(lDate)) & _ 
    fBase36Encode(60 * (60 * Hour(lDate) + Minute(lDate)) + Second(lDate)) & "#" 
End Function 

Function fBase36Encode(ByRef lngNumToConvert As Long) As String 
    'Will Convert any Positive Integer to a Base36 String 
    fBase36Encode = "0" 
    If lngNumToConvert = 0 Then Exit Function 

    Dim strAlphabet As String: strAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
    fBase36Encode = vbNullString 
    Do While lngNumToConvert <> 0 
     fBase36Encode = Mid(strAlphabet, lngNumToConvert Mod 36 + 1, 1) & fBase36Encode 
     lngNumToConvert = lngNumToConvert \ 36 
    Loop 
End Function 

*编辑*

使用可逆基部64哈希代替一些代码:

Sub TestHash() 
    Dim lDate As Date: lDate = Now 
    Debug.Print DateTimeHash(lDate) 
    Debug.Print DateTimeUnhash(DateTimeHash(lDate)) 
End Sub 

Function DateTimeHash(ByRef lDate As Date) As String 
    Dim Secs As String: Secs = Encode64(60 * (60 * Hour(lDate) + Minute(lDate)) + Second(lDate)) 
    DateTimeHash = "#" & Encode64(DateValue(lDate)) & String(3 - Len(Secs), "0") & Secs & "#" 
End Function 

Function DateTimeUnhash(ByRef Hash As String) As Date 
    Hash = Replace(Hash, "#", "") 
    Dim Days As Long: Days = Decode64(Left(Hash, Len(Hash) - 3)) 
    Dim Secs As Long: Secs = Decode64(Right(Hash, 3)) 
    DateTimeUnhash = DateAdd("d", Days, "0") + DateAdd("s", Secs, "0") 
End Function 

Function Encode64(ByRef Value As Long) As String 
    'Will Convert any Positive Integer to a Base64 String 
    Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/" 

    Encode64 = IIf(Value > 0, vbNullString, "0") 
    If Encode64 = "0" Then Exit Function 
    Do While Value <> 0 
     Encode64 = Mid(Base64, Value Mod 64 + 1, 1) & Encode64 
     Value = Value \ 64 
    Loop 
End Function 

Function Decode64(ByRef Value As String) As Long 
    'Will Convert any Base64 String to a Positive Integer 
    Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/" 

    Decode64 = IIf(Value = "", -1, 0) 
    Dim i As Long: For i = 1 To Len(Value) 
     If Decode64 = -1 Then Exit Function ' Error detected with Value string 
     Decode64 = Decode64 * 64 
     Decode64 = IIf(InStr(Base64, Mid(Value, i, 1)) > 0, _ 
      Decode64 + InStr(Base64, Mid(Value, i, 1)) - 1, -1) 
    Next i 
End Function 
+0

非常有创意。事实上,如此具有创造性,我最终解决了这个问题。我想保持这个问题的开放性,看看别人是否有其他选择或想法。不过,好主意,因为那正是我用来解决这个问题的! – SalvadorVayshun

+0

对此的扩展是,如果散列是可逆的,您可以设置一个newmail事件来检查散列,搜索已发送的邮件(基于散列时间戳),然后复制已发送的电子邮件身体进入回复体。因此实际上完成了原始问题的职责范围。 – Tragamor

+0

我同意。这完全满足了这个问题的要求,它可以用来解决手头的问题。我希望这个问题一直持续到本周结束,希望有人能够在方法中真正传递信息。这似乎是一个要解决的简单问题,但没有直接的解决方法。典型的微软。 – SalvadorVayshun