Вы должны убедиться, что каждый найденный элемент в вашей папке является электронным письмом, проверив его Class
.
В отношении ошибки: возможно, вам не разрешено писать туда или - что более вероятно - некоторыесимволы в теме письма запрещены в вашей файловой системе.Я добавил код для замены запрещенных символов.
Если вы перебираете каждое электронное письмо, то нет необходимости создавать дополнительное новое электронное письмо с помощью CreateItem
раньше.
Option Explicit
Sub outlooksavefile()
Dim o As Outlook.Application
Set o = New Outlook.Application
Dim ons As Outlook.NameSpace
Set ons = o.GetNamespace("mapi")
Dim fol As Outlook.Folder
Set fol = ons.GetDefaultFolder(olFolderInbox).Folders("Test")
Dim omail As Object
For Each omail In fol.Items
If omail.Class = olMail Then ' olMail = 43
Debug.Print omail.Sender
Debug.Print omail.Subject
Debug.Print omail.Sender
Debug.Print Left(omail.Body, 20)
omail.SaveAs Environ("USERPROFILE") & "\Documents\" & _
AllowedChars(omail.Subject) & ".msg", olMSG ' olMSG = 3
End If
Next omail
End Sub
Private Function AllowedChars(ByRef s As String) As String
Dim i As Long
Dim myChar As String
AllowedChars = s
For i = 1 To Len(AllowedChars)
myChar = Mid$(AllowedChars, i, 1)
If myChar Like "[<>:""/\|?*]" Or Asc(myChar) < 32 Then
Mid$(AllowedChars, i, 1) = "_"
End If
Next i
End Function
По вашему вопросу2: Пожалуйста, поднимите еще один вопрос после того, как вы его запустили.
Относительно вопроса 3: я добавил некоторую отладочную информацию, чтобы посмотреть, как хранятся отправители и другие элементы электронной почты.На основании этого вы можете генерировать некоторые If-условия.