Прошло десять лет с тех пор, как я исследовал встроенные изображения.Я не помню деталей сейчас, но это было связано с попыткой различить прикрепленные изображения и внедренные изображения.В то время я получил много писем, которые содержали оба.Сегодня я не могу найти ни одного электронного письма в папке «Входящие» со встроенными изображениями, которые являются вложениями;встроенные изображения, подпись и т. д. являются ссылками на внешние сайты.
Макрос, представленный ниже, является одним из двух, которые я использую для изучения электронных писем, которые я хочу обработать.Когда мне нужна только ограниченная диагностика, я использую версию с Debug.Print
.Приведенный ниже макрос выводится в файл рабочего стола с именем «InvestigateEmails.txt».Он выводит как текст, так и HTML-тела, но с возвратом каретки, переводом строки и вкладками, замененными на «{cr}», «{lf}» и «{tb}».Это позволяет мне полностью изучить сообщения электронной почты, если они есть, а не как они отображаются.
Чтобы использовать этот макрос, выберите одно или несколько из этих сообщений электронной почты и запустите макрос InvestigateEmails1
.Вам нужно изучить вывод и определить разницу между вложениями, которые вы хотите сохранить, и теми, которые вы не делаете.Как только вы узнаете, как определить разницу, вы сможете задать конкретный вопрос.
Макрос InvestigateEmails1
нуждается в ссылке на "Microsoft Scripting Runtime".Для макроса PutTextFileUtf8NoBom
требуется ссылка на «Объекты данных Microsoft ActiveX nn Library».В моей системе «nn» - это «6.1», но макрос должен работать с более ранними версиями.
Public Sub InvestigateEmails1()
' Outputs properties of selected emails to a file.
' ??????? No record of when originally coded
' 22Oct16 Output to desktop file rather than Immediate Window.
' Technique for locating desktop from answer by Kyle:
' http://stackoverflow.com/a/17551579/973283
' Needs reference to "Microsoft Scripting Runtime"
Dim Exp As Explorer
Dim FileBody As String
Dim fso As FileSystemObject
Dim InxA As Long
Dim ItemCrnt As MailItem
Dim Path As String
Path = CreateObject("WScript.Shell").SpecialFolders("Desktop")
Set Exp = Outlook.Application.ActiveExplorer
If Exp.Selection.Count = 0 Then
Call MsgBox("Please select one or more emails then try again", vbOKOnly)
Exit Sub
Else
FileBody = ""
For Each ItemCrnt In Exp.Selection
With ItemCrnt
FileBody = FileBody & "From (Sender): " & .Sender & vbLf
FileBody = FileBody & "From (Sender name): " & .SenderName & vbLf
FileBody = FileBody & "From (Sender email address): " & _
.SenderEmailAddress & vbLf
FileBody = FileBody & "Subject: " & CStr(.Subject) & vbLf
If .Attachments.Count = 0 Then
FileBody = FileBody & "No attachments" & vbLf
Else
FileBody = FileBody & "Attachments:" & vbLf
FileBody = FileBody & "No.|Type|Path|Filename|DisplayName|" & vbLf
For InxA = 1 To .Attachments.Count
With .Attachments(InxA)
FileBody = FileBody & InxA & "|"
Select Case .Type
Case olByValue
FileBody = FileBody & "Val"
Case olEmbeddeditem
FileBody = FileBody & "Ebd"
Case olByReference
FileBody = FileBody & "Ref"
Case olOLE
FileBody = FileBody & "OLE"
Case Else
FileBody = FileBody & "Unk"
End Select
' Not all types have all properties. This code handles
' those missing properties of which I am aware. However,
' I have never found an attachment of type Reference or OLE.
' Additional code may be required for them.
Select Case .Type
Case olEmbeddeditem
FileBody = FileBody & "|"
Case Else
FileBody = FileBody & "|" & .Pathname
End Select
FileBody = FileBody & "|" & .Filename
FileBody = FileBody & "|" & .DisplayName & "|" & vbLf
End With
Next
End If
Call OutLongText(FileBody, "Text: ", Replace(Replace(Replace(.Body, vbLf, _
"{lf}" & vbLf), vbCr, "{cr}"), vbTab, "{tb}"))
Call OutLongText(FileBody, "Html: ", Replace(Replace(Replace(.HtmlBody, vbLf, _
"{lf}" & vbLf), vbCr, "{cr}"), vbTab, "{tb}"))
FileBody = FileBody & "--------------------------" & vbLf
End With
Next
End If
Call PutTextFileUtf8NoBom(Path & "\InvestigateEmails.txt", FileBody)
End Sub
Public Sub OutLongText(ByRef TextOut As String, ByVal Head As String, _
ByVal TextIn As String)
' Break TextIn into lines of not more than 100 characters
' and append to TextOut
Dim PosEnd As Long
Dim LenOut As Long
Dim PosStart As Long
If TextIn <> "" Then
PosStart = 1
Do While PosStart <= Len(TextIn)
PosEnd = InStr(PosStart, TextIn, vbLf)
If PosEnd = 0 Or PosEnd > PosStart + 100 Then
' No LF in remainder of TextIn or next 100 characters
PosEnd = PosStart + 99
LenOut = 100
Else
' Output upto LF. Restart output after LF
LenOut = PosEnd - PosStart
PosEnd = PosEnd
End If
If PosStart = 1 Then
TextOut = TextOut & Head
Else
TextOut = TextOut & Space(Len(Head))
End If
TextOut = TextOut & Mid$(TextIn, PosStart, LenOut) & vbLf
PosStart = PosEnd + 1
Loop
End If
End Sub
Public Sub PutTextFileUtf8NoBom(ByVal PathFileName As String, ByVal FileBody As String)
' Outputs FileBody as a text file named PathFileName using
' UTF-8 encoding without leading BOM
' Needs reference to "Microsoft ActiveX Data Objects n.n Library"
' Addition to original code says version 2.5. Tested with version 6.1.
' 1Nov16 Copied from http://stackoverflow.com/a/4461250/973283
' but replaced literals with parameters.
' 15Aug17 Discovered routine was adding an LF to the end of the file.
' Added code to discard that LF.
' 11Oct17 Posted to StackOverflow
' 9Aug18 Comment from rellampec suggested removal of adWriteLine from
' WriteTest statement would avoid adding LF.
' 30Sep18 Amended routine to remove adWriteLine from WriteTest statement
' and code to remove LF from file. Successfully tested new version.
' References: http://stackoverflow.com/a/4461250/973283
' https://www.w3schools.com/asp/ado_ref_stream.asp
Dim BinaryStream As Object
Dim UTFStream As Object
Set UTFStream = CreateObject("adodb.stream")
UTFStream.Type = adTypeText
UTFStream.Mode = adModeReadWrite
UTFStream.Charset = "UTF-8"
UTFStream.Open
UTFStream.WriteText FileBody
UTFStream.Position = 3 'skip BOM
Set BinaryStream = CreateObject("adodb.stream")
BinaryStream.Type = adTypeBinary
BinaryStream.Mode = adModeReadWrite
BinaryStream.Open
UTFStream.CopyTo BinaryStream
UTFStream.Flush
UTFStream.Close
Set UTFStream = Nothing
BinaryStream.SaveToFile PathFileName, adSaveCreateOverWrite
BinaryStream.Flush
BinaryStream.Close
Set BinaryStream = Nothing
End Sub