Outlook 2010 VBA如何保存包含附件的邮件
Hello我使用以下代码将邮件保存到文件夹中,但是如果邮件有附件,它将无法工作 我知道如果我手动将邮件移动到硬盘,附件仍在*.msg文件中 我想这就是我在这一节中保存信息的方式Outlook 2010 VBA如何保存包含附件的邮件,vba,outlook,outlook-2010,Vba,Outlook,Outlook 2010,Hello我使用以下代码将邮件保存到文件夹中,但是如果邮件有附件,它将无法工作 我知道如果我手动将邮件移动到硬盘,附件仍在*.msg文件中 我想这就是我在这一节中保存信息的方式 oMail.SaveAs sPath & sName, olMSG 如何通过VBA修改以下代码以实现此目的 Sub SaveMessageAsMsg() Dim oMail As Outlook.MailItem Dim objItem As Object Dim sPath As String
oMail.SaveAs sPath & sName, olMSG
如何通过VBA修改以下代码以实现此目的
Sub SaveMessageAsMsg()
Dim oMail As Outlook.MailItem
Dim objItem As Object
Dim sPath As String
Dim dtDate As Date
Dim sName As String
Dim sndName As String
Dim enviro As String
enviro = "c:\emails"
For Each objItem In ActiveExplorer.Selection
If objItem.MessageClass = "IPM.Note" Then
Set oMail = objItem
sndName = oMail.Sender
ReplaceCharsForFileName sndName, "-"
sName = oMail.Subject
ReplaceCharsForFileName sName, "-"
dtDate = oMail.ReceivedTime
sName = Format(dtDate, "yyyymmdd", vbUseSystemDayOfWeek, _
vbUseSystem) & Format(dtDate, "-hhnnss", _
vbUseSystemDayOfWeek, vbUseSystem) & "-" & sndName & "-" & sName & ".msg"
sPath = enviro
Debug.Print sPath & sName
oMail.SaveAs sPath & sName, olMSG
End If
Next
End Sub
Private Sub ReplaceCharsForFileName(sName As String, _
sChr As String _
)
sName = Replace(sName, "'", sChr)
sName = Replace(sName, "*", sChr)
sName = Replace(sName, "/", sChr)
sName = Replace(sName, "\", sChr)
sName = Replace(sName, ":", sChr)
sName = Replace(sName, "?", sChr)
sName = Replace(sName, Chr(34), sChr)
sName = Replace(sName, "<", sChr)
sName = Replace(sName, ">", sChr)
sName = Replace(sName, "|", sChr)
End Sub
Sub SaveMessageAsMsg()
将oMail设置为Outlook.MailItem
作为对象的Dim objItem
像细绳一样暗淡
Dim dtDate作为日期
像绳子一样模糊
Dim sndName As String
Dim enviro As字符串
enviro=“c:\email”
对于ActiveExplorer.Selection中的每个对象项
如果objItem.MessageClass=“IPM.Note”,则
设置oMail=objItem
sndName=oMail.Sender
ReplaceCharsForFileName sndName,“-”
sName=oMail.Subject
ReplaceCharsForFileName sName,“-”
dtDate=oMail.ReceivedTime
sName=格式(dtDate,“yyyymmdd”,vbUseSystemDayOfWeek_
vbUseSystem)和格式(dtDate,“-hhnss”_
vbUseSystemDayOfWeek,vbUseSystem)&“-”和sndName&“-”和sName&“.msg”
sPath=环境
调试。打印sPath和sName
oMail.SaveAs sPath&sName,olMSG
如果结束
下一个
端接头
Private Sub-ReplaceCharsForFileName(sName作为字符串_
弦_
)
sName=替换(sName,“”,sChr)
sName=替换(sName,“*”,sChr)
sName=替换(sName,“/”,sChr)
sName=替换(sName,\,sChr)
sName=替换(sName,“:”,sChr)
sName=替换(sName,“?”,sChr)
sName=替换(sName,Chr(34),sChr)
sName=替换(sName,“,sChr)
sName=替换(sName,“|”,sChr)
端接头
提前谢谢
更新已解决的问题
我现在已经自己解决了问题,你需要小心,因为这取决于收到的电子邮件是如何创建的
如果电子邮件和主题是使用excel创建的,则其中将包含制表符分隔符,这可能会导致上述代码失效。要解决此问题,请使用以下代码:
Public Sub SaveMessageAsMsg()
Dim oMail As Outlook.MailItem
Dim objItem As Object
Dim sPath As String
Dim dtDate As Date
Dim sName As String
Dim SndName As String
Dim enviro As String
enviro = "c:\emails\" 'sets folder to save messgaes to
For Each objItem In ActiveExplorer.Selection
If objItem.MessageClass = "IPM.Note" Then
Set oMail = objItem
sName = oMail.Subject
SndName = oMail.SenderName
dtDate = oMail.ReceivedTime
ReplaceCharsForFileName sName, "-"
sName = Right(sName, 100)
'formats the file name as "Sender name - Date - Time - Subject"
sName = SndName & " - " & Format(dtDate, "dd-mm-yy", vbUseSystemDayOfWeek, _
vbUseSystem) & " - " & Format(dtDate, "hhnnss", _
vbUseSystemDayOfWeek, vbUseSystem) & " - " & sName & ".msg"
sPath = enviro
Debug.Print sPath & sName
oMail.SaveAs sPath & sName, olMSG
End If
Next
End Sub
Private Sub ReplaceCharsForFileName(sName As String, _
sChr As String _
)
'Replaces the invalid characters you could use RegX with vbscript instead
sName = Replace(sName, "´", "'")
sName = Replace(sName, "`", "'")
sName = Replace(sName, "{", "(")
sName = Replace(sName, "[", "(")
sName = Replace(sName, "]", ")")
sName = Replace(sName, "}", ")")
sName = Replace(sName, " ", " ") 'Replace two spaces with one space
sName = Replace(sName, " ", " ") 'Replace three spaces with one space
sName = Replace(sName, " ", " ") 'Replace four spaces with one space
sName = Replace(sName, " ", " ") 'Replace five spaces with one space
sName = Replace(sName, " ", " ") 'Replace six spaces with one space
'Cut out invalid signs.
sName = Replace(sName, ": ", "_") 'Colan followded by a space
sName = Replace(sName, ":", "_") 'Colan with no space
sName = Replace(sName, "/", "_")
sName = Replace(sName, "\", "_")
sName = Replace(sName, "*", "_")
sName = Replace(sName, "?", "_")
sName = Replace(sName, """", "'")
sName = Replace(sName, "<", "_")
sName = Replace(sName, ">", "_")
sName = Replace(sName, "|", "_")
sName = Replace(sName, "%", "pc")
sName = Replace(sName, vbTab, " ") 'Replaces vbTab as this is sometimes a delimiter if copied from excel
End Sub
Public子存储消息asmsg()
将oMail设置为Outlook.MailItem
作为对象的Dim objItem
像细绳一样暗淡
Dim dtDate作为日期
像绳子一样模糊
Dim SndName As String
Dim enviro As字符串
enviro=“c:\emails\”设置要将消息保存到的文件夹
对于ActiveExplorer.Selection中的每个对象项
如果objItem.MessageClass=“IPM.Note”,则
设置oMail=objItem
sName=oMail.Subject
SndName=oMail.SenderName
dtDate=oMail.ReceivedTime
ReplaceCharsForFileName sName,“-”
sName=右(sName,100)
'将文件名格式设置为“发件人名称-日期-时间-主题”
sName=SndName&“-”和格式(dtDate,“dd-mm-yy”,vbUseSystemDayOfWeek_
vbUseSystem)和“-”格式(dtDate,“hhnss”_
vbUseSystemDayOfWeek,vbUseSystem)和“-”以及sName和“.msg”
sPath=环境
调试。打印sPath和sName
oMail.SaveAs sPath&sName,olMSG
如果结束
下一个
端接头
Private Sub-ReplaceCharsForFileName(sName作为字符串_
弦_
)
'用vbscript替换可以使用RegX的无效字符
sName=替换(sName,'''','')
sName=替换(sName,“`,“'))
sName=替换(sName,{,“(”)
sName=替换(sName,“[”,“(”)
sName=替换(sName,“]”,“”)
sName=Replace(sName,“}”,”)
sName=Replace(sName,“,”)'将两个空格替换为一个空格
sName=Replace(sName,“,”)'将三个空格替换为一个空格
sName=Replace(sName,“,”)'用一个空格替换四个空格
sName=Replace(sName,“,”)'用一个空格替换五个空格
sName=Replace(sName,“,”)'用一个空格替换六个空格
“删除无效的标志。
sName=Replace(sName,“:”,“”)”Colan后跟空格
sName=Replace(sName,“:”,“”)”不带空格的Colan
sName=替换(sName,“/”,“389;”)
sName=替换(sName,“\”,“\”)
sName=替换(sName,“*”,“389;”)
sName=替换(sName,“?”,“”)
sName=替换(sName,“,”)
sName=替换(sName,“,”)
sName=替换(sName,“|”和“|”)
sName=替换(sName、%、“pc”)
sName=Replace(sName,vbTab,“”)替换vbTab,因为如果从excel复制,这有时是一个分隔符
端接头
您需要使用附件类的方法将附件保存到指定路径。例如:
Sub SaveAttachment()
Dim myInspector As Outlook.Inspector
Dim myItem As Outlook.MailItem
Dim myAttachments As Outlook.Attachments
Set myInspector = Application.ActiveInspector
If Not TypeName(myInspector) = "Nothing" Then
If TypeName(myInspector.CurrentItem) = "MailItem" Then
Set myItem = myInspector.CurrentItem
Set myAttachments = myItem.Attachments
'Prompt the user for confirmation
Dim strPrompt As String
strPrompt = "Are you sure you want to save the first attachment in the current item to the Documents folder? If a file with the same name already exists in the destination folder, it will be overwritten with this copy of the file."
If MsgBox(strPrompt, vbYesNo + vbQuestion) = vbYes Then
myAttachments.Item(1).SaveAsFile Environ("HOMEPATH") & "\My Documents\" & _
myAttachments.Item(1).DisplayName
End If
Else
MsgBox "The item is of the wrong type."
End If
End If
End Sub
他想保存邮件,而不是附件除了保存邮件外,他还必须使用Add方法保存附件。因此,基本上我必须分别保存电子邮件和附件。手动保存邮件和附件时,outlook可以保存邮件和附件,这很烦人,但在VBAYes中没有简单的方法,你走对了路。您需要使用Attachment类的SaveAsFile方法保存附件,使用SaveAs方法保存邮件。