Outlook规则移动邮件后,保存PDF附件但无法删除原邮件附件
问题:Outlook VBA保存PDF附件后无法从邮件中移除附件
我正尝试将特定发件人邮件中的PDF附件保存到本地,然后删除原邮件中的对应附件。目前保存功能正常,但附件并未从已存储的邮件中移除。
使用的VBA代码如下:
Sub SaveAttachmentsFromSelectedItemsPDF(Item As Outlook.MailItem) Set attachs = Item.Attachments Dim currentAttachment As Outlook.Attachment Dim i As Long For i = attachs.Count To 1 Step -1 Set currentAttachment = attachs.Item(i) If UCase(Right(currentAttachment.DisplayName, 4)) = ".PDF" Then file = currentAttachment.FileName currentAttachment.SaveAsFile "C:\test\" & file Item.Attachments.Remove i End If Next Item.Save End Sub
我尝试过多种格式(包括将i放在括号中),也尝试过在每次循环中删除currentAttachment,但问题依旧。
设置的Outlook规则如下:
- 收到来自指定测试地址的邮件时
- 将其移动至ATTACHMENT文件夹,然后执行SaveAttachmentScript脚本并标记为已读
问题原因及解决办法
当通过Outlook规则先移动邮件再执行脚本时,你操作的是移动前的原始邮件副本,而非已经转移到ATTACHMENT文件夹的那封邮件。所以你在目标文件夹看到的是未修改的移动副本,自然看不到附件被移除的效果。
具体调整步骤:
修改规则执行顺序
把规则动作的顺序调换:先执行脚本(保存并删除附件),再移动邮件到ATTACHMENT文件夹。这样脚本直接操作原始邮件,修改完成后再移动到目标文件夹,就能看到附件已被移除。优化代码细节
对原代码做几点优化,提升稳定性:Sub SaveAttachmentsFromSelectedItemsPDF(Item As Outlook.MailItem) Dim attachs As Outlook.Attachments Dim currentAttachment As Outlook.Attachment Dim i As Long Dim savePath As String Dim fileName As String savePath = "C:\test\" ' 检查保存路径是否存在,不存在则自动创建 If Dir(savePath, vbDirectory) = "" Then MkDir savePath End If Set attachs = Item.Attachments For i = attachs.Count To 1 Step -1 Set currentAttachment = attachs.Item(i) ' 更稳妥的PDF后缀判断(兼容大小写) If LCase(Right(currentAttachment.FileName, 4)) = ".pdf" Then fileName = currentAttachment.FileName currentAttachment.SaveAsFile savePath & fileName attachs.Remove i ' 直接使用已声明的attachs变量移除附件 End If Next i Item.Save ' 确保修改被保存 End Sub重新配置规则
规则配置调整为:- 触发条件:收到来自指定测试地址的邮件
- 执行动作顺序:
- 运行脚本
SaveAttachmentsFromSelectedItemsPDF - 标记邮件为已读
- 移动邮件到ATTACHMENT文件夹
- 运行脚本
内容的提问来源于stack exchange,提问作者Croque-Monsieur
相关产品推荐
相关产品推荐

