用于将另一封电子邮件中的 Outlook 电子邮件中的附件(excel 文件)保存为附件的 VBA 代码
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/7890612/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
VBA Code to save an attachment (excel file) from an Outlook email that was inside another email as an attachment
提问by JAM_864
I have code that saves attachments in message in a specific Outlook folder.
我有将邮件中的附件保存在特定 Outlook 文件夹中的代码。
My script will work if the email has an attachment, but will not work if the email was sent as an attachment with an attachment.
如果电子邮件有附件,我的脚本将起作用,但如果电子邮件作为带有附件的附件发送,则脚本将不起作用。
In this case my emails contains other emails as attachments (from an auto-forward rule). The embedded email attachments then contain excel files.
在这种情况下,我的电子邮件包含其他电子邮件作为附件(来自自动转发规则)。然后嵌入的电子邮件附件包含 excel 文件。
Please see my current vbabelow:
请在下面查看我当前的vba:
Public Sub SaveOlAttachments()
Dim isAttachment As Boolean
Dim olFolder As Outlook.MAPIFolder
Dim msg As Outlook.MailItem
Dim att As Outlook.Attachment
Dim fsSaveFolder, sSavePathFS, ssender As String
On Error GoTo crash
fsSaveFolder = "C:\Documents and Settings\user\Desktop\"
isAttachment = False
Set olFolder = Outlook.GetNamespace("MAPI").Folders("...email server...")
Set olFolder = olFolder.Folders("Inbox")
If olFolder Is Nothing Then Exit Sub
For Each msg In olFolder.Items
If UCase(msg.Subject) = "TEST EMAIL WITH ATTACHMENT" Then
If msg.Attachments.Count > 0 Then
While msg.Attachments.Count > 0
sSavePathFS = fsSaveFolder & msg.Attachments(1).Filename
msg.Attachments(1).SaveAsFile sSavePathFS
msg.Attachments(1).Delete
isAttachment = True
Wend
msg.Delete
End If
End If
Next
crash:
If isAttachment = True Then Call findFiles(fsSaveFolder)
End Sub
Any help would be much appreciated.
任何帮助将非常感激。
采纳答案by brettdj
The code below uses this approach to work on the email as an attachment
下面的代码使用这种方法将电子邮件作为附件处理
- Tests whether the attachment is an email message or not (if the filename ends in msg)
- If the attachment is a message, it is saved as
"C:\temp\KillMe.msg"
. CreateItemFromTemplate
is used to access the saved file as a new message (msg2)- The code then processes this temporary message to strip the attachmnets to
fsSaveFolder
- If the attachment is not a message then it is extracted as per your current code
- 测试附件是否是电子邮件消息(如果文件名以 msg 结尾)
- 如果附件是邮件,则将其另存为
"C:\temp\KillMe.msg"
. CreateItemFromTemplate
用于访问保存的文件作为新消息 (msg2)- 然后代码处理这个临时消息以将附件剥离到
fsSaveFolder
- 如果附件不是消息,则根据您当前的代码提取它
Note that as I didnt have your olFolder structure, Windoes version, Outlook
variable etc I have had to add in my own file paths and Outlook folders to test. You will need to change these
请注意,由于我没有您的 olFolder 结构、Windoes 版本、Outlook
变量等,因此我不得不添加自己的文件路径和 Outlook 文件夹进行测试。你需要改变这些
Sub SaveOlAttachments()
Dim olFolder As Outlook.MAPIFolder
Dim msg As Outlook.MailItem
Dim msg2 As Outlook.MailItem
Dim att As Outlook.Attachment
Dim strFilePath As String
Dim strTmpMsg As String
Dim fsSaveFolder As String
fsSaveFolder = "C:\test\"
'path for creating attachment msg file for stripping
strFilePath = "C:\temp\"
strTmpMsg = "KillMe.msg"
'My testing done in Outlok using a "temp" folder underneath Inbox
Set olFolder = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox)
Set olFolder = olFolder.Folders("Temp")
If olFolder Is Nothing Then Exit Sub
For Each msg In olFolder.Items
If msg.Attachments.Count > 0 Then
While msg.Attachments.Count > 0
bflag = False
If Right$(msg.Attachments(1).FileName, 3) = "msg" Then
bflag = True
msg.Attachments(1).SaveAsFile strFilePath & strTmpMsg
Set msg2 = Application.CreateItemFromTemplate(strFilePath & strTmpMsg)
End If
If bflag Then
sSavePathFS = fsSaveFolder & msg2.Attachments(1).FileName
msg2.Attachments(1).SaveAsFile sSavePathFS
msg2.Delete
Else
sSavePathFS = fsSaveFolder & msg.Attachments(1).FileName
msg.Attachments(1).SaveAsFile sSavePathFS
End If
msg.Attachments(1).Delete
Wend
msg.Delete
End If
Next
End Sub