Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Outlook 2010 VBA如何保存包含附件的邮件_Vba_Outlook_Outlook 2010 - Fatal编程技术网

Outlook 2010 VBA如何保存包含附件的邮件

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

Hello我使用以下代码将邮件保存到文件夹中,但是如果邮件有附件,它将无法工作

我知道如果我手动将邮件移动到硬盘,附件仍在*.msg文件中

我想这就是我在这一节中保存信息的方式

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方法保存邮件。