【问题标题】:Forwarding email based on attachment name根据附件名称转发电子邮件
【发布时间】:2021-03-19 16:43:15
【问题描述】:

我正在使用 Outlook 2010,并尝试根据附件名称将电子邮件转发给特定用户。下面的代码有效,除了我必须在 Outlook 中为每个不同的附件名称创建一个规则(即使在交换控制台中将规则大小增加到 256kb 后,我的规则最终也会耗尽存储空间)。

我希望这个脚本在一个规则下运行。它需要类似于....如果附件名称是“xxxxx.pdf”然后发送到“name@domain.com”如果不是然后跳过,如果附件名称是“xx.xls”然后发送到“ name1@domain.com" 如果没有则跳过....等等...

以下是我目前所拥有的,我希望将它们结合起来。

在 Outlook 会话中粘贴的代码:

Sub SendOnMessage23(olItem As MailItem)
Dim olAtt As Attachment, yest As Boolean, ol_newmail As MailItem
For Each olAtt In olItem.Attachments
    If InStr(1, olAtt.FileName, "Print_Ack_Rpt.rpt_1100023-1") > 0 Then yest = True: Exit For
NextIf yest = True Then
    Set ol_newmail = olItem.Forward
        ol_newmail.To = "user@domain.com"
        ol_newmail.Send
End If
End Sub

Sub SendOnMessage23(olItem As MailItem)
Dim olAtt As Attachment, yest As Boolean, ol_newmail As MailItem
For Each olAtt In olItem.Attachments
    If InStr(1, olAtt.FileName, "Print_Ack_Rpt.rpt_1100024-1") > 0 Then yest = True: Exit For
NextIf yest = True Then
    Set ol_newmail = olItem.Forward
        ol_newmail.To = "user1@domain.com"
        ol_newmail.Send
End If
End Sub

Sub SendOnMessage23(olItem As MailItem)
Dim olAtt As Attachment, yest As Boolean, ol_newmail As MailItem
For Each olAtt In olItem.Attachments
    If InStr(1, olAtt.FileName, "Print_Ack_Rpt.rpt_1100024-1") > 0 Then yest = True: Exit For
NextIf yest = True Then
    Set ol_newmail = olItem.Forward
        ol_newmail.To = "user2@domain.com"
        ol_newmail.Send
End If
End Sub

Sub SendOnMessage23(olItem As MailItem)
Dim olAtt As Attachment, yest As Boolean, ol_newmail As MailItem
For Each olAtt In olItem.Attachments
    If InStr(1, olAtt.FileName, "Print_Ack_Rpt.rpt_1100024-1") > 0 Then yest = True: Exit For
NextIf yest = True Then
    Set ol_newmail = olItem.Forward
        ol_newmail.To = "user3@domain.com"
        ol_newmail.Send
End If
End Sub

【问题讨论】:

    标签: vba outlook


    【解决方案1】:

    我相信您正在寻找利用ElseIf 条件。您似乎也没有按预期正确使用 If 条件。

    对您当前订阅者的建议

    If 语句中,当参数满足时,它下面的代码和EndIf 条件将运行之前。因此,无需将yest 变量设置为True 并退出循环,您只需在If 语句下方插入当参数为真时要运行的代码。当条件为真时,电子邮件将转发,如果不是,代码将移至下一个附件,查看它是否满足您的If 声明。

    对于您的第一个子代码,代码如下所示:

    Sub SendOnMessage23(olItem As MailItem)
    Dim olAtt As Attachment, ol_newmail As MailItem
    
    For Each olAtt In olItem.Attachments
        If InStr(1, olAtt.FileName, "Print_Ack_Rpt.rpt_1100023-1") > 0 Then
            Set ol_newmail = olItem.Forward
            ol_newmail.To = "user@domain.com"
            ol_newmail.Send
            Exit Sub
        End If
    Next
    
    End Sub
    

    我还在它找到满意的附件后添加了一个Exit 子句,这样如果由于某种原因您有两个符合条件的附件,它就不会发送多封电子邮件。

    将所有内容合并为一个子

    现在If 语句工作了,我们可以开始使用ElseIf 将您的潜艇合并为一个。基本上ElseIf 的工作原理是,当条件在它为假之前被测试时,它就会开始测试它的条件。因此,在这种情况下,当您的 If 语句不满足时,下面的 ElseIf 会检查其条件是否满足。当它执行它的代码时,当它不是时,代码继续到下一行。您可以根据需要添加任意数量的ElseIfs,他们将按顺序检查其条件。我们将利用这一点将您的所有潜艇组合成一个,如下所示:

    Sub SendOnMessage23(olItem As MailItem)
    Dim olAtt As Attachment, ol_newmail As MailItem
    
    For Each olAtt In olItem.Attachments
        If InStr(1, olAtt.FileName, "Print_Ack_Rpt.rpt_1100023-1") > 0 Then
            Set ol_newmail = olItem.Forward
            ol_newmail.To = "user@domain.com"
            ol_newmail.Send
            Exit Sub
        ElseIf InStr(1, olAtt.FileName, "Print_Ack_Rpt.rpt_1100024-1") > 0 Then
            Set ol_newmail = olItem.Forward
            ol_newmail.To = "user1@domain.com"
            ol_newmail.Send
            Exit Sub
        '... keep adding your other subs following the ElseIf format above
        End If
    Next
    
    End Sub
    

    我没有在 Outlook 中测试过上述任何代码,但如果您的代码正常工作,这应该也可以。如果没有,请告诉我,我们可以解决任何问题。

    【讨论】:

    • 这很完美。感谢您花时间清理并详细解释代码!!!
    猜你喜欢
    • 1970-01-01
    • 2018-04-29
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2015-06-26
    • 1970-01-01
    • 2013-03-18
    相关资源
    最近更新 更多