Добрый день, есть Outlook с папками входящие, отправленные и их подпапками. Необходимо пройти по всем письмам и составить список уникальных E-mail адресов, для дальнейшей рассылки. Приветсвуется созданиие в Excel списка. Можно просто через точку с запятой. Также хотелось бы условие по наличию определенного домена в адресате, чтобы отобрать письма только от одного домена.
Добрый день, есть Outlook с папками входящие, отправленные и их подпапками. Необходимо пройти по всем письмам и составить список уникальных E-mail адресов, для дальнейшей рассылки. Приветсвуется созданиие в Excel списка. Можно просто через точку с запятой. Также хотелось бы условие по наличию определенного домена в адресате, чтобы отобрать письма только от одного домена.Денис
Приведенное ниже решает поставленную задачу. Код надо поместить в модуль VBA в Excel и запустить на выполнение процедуру main. Результатом будет создание новой книги со списком уникальных адресов. Предполагается, что дальнейшую необходимую обработку списка (сортировку, выделение домена после "собаки" и т.п.) можно будет сделать вручную на рабочем листе. [vba]
Код
Option Explicit
Dim colAddress As Collection
Sub main() 'запускаем эту процедуру
Dim olApp As Object 'Outlook.Application Dim fldr As Object 'Outlook.Folder Dim arr(), i
Set colAddress = New Collection
Set olApp = CreateObject("Outlook.Application")
'обрабатываем папку Входящие и вложенные в нее Set fldr = olApp.Session.GetDefaultFolder(6) '6 = olFolderInbox Call processFolder(fldr)
'обрабатываем папку Исходящие и вложенные в нее Set fldr = olApp.Session.GetDefaultFolder(5) '5 = olFolderSentMail Call processFolder(fldr)
'вывод уникальных адресов в новую книгу Excel ReDim arr(1 To colAddress.Count, 1 To 1) For i = 1 To colAddress.Count arr(i, 1) = colAddress(i) Next i Application.Workbooks.Add.Worksheets(1).Range("A1").Resize(colAddress.Count) = arr
End Sub
Sub processFolder(ByVal pFolder As Object) 'Outlook.Folder) Dim fldr As Object 'Outlook.Folder Dim item As Object Dim mail As Object 'Outlook.mailItem Dim rcpnt As Object 'Outlook.Recipient Dim i
'перебор элементов в папке For Each item In pFolder.Items If item.Class = 43 Then 'обрабатываем только письма, 43 = olMail Set mail = item i = i + 1 'If i > 10 Then Exit For Debug.Print "Письмо " & i & " в папке " & pFolder.Name Call addAddress(mail.Sender, mail.Sender.Address) 'запоминаем отправителя For Each rcpnt In mail.Recipients 'цикл по получателям Call addAddress(rcpnt.AddressEntry, rcpnt.Address) 'запоминаем получателя Next rcpnt Set mail = Nothing End If Next item
'перебор папок (первого уровня вложенности) For Each fldr In pFolder.Folders Call processFolder(fldr) 'рекурсия Next fldr End Sub
Sub addAddress(ByVal pAddressEntry As Object, _ ByVal altaddr As String) 'Outlook.AddressEntry Dim pa As Object 'PropertyAccessor Dim addr As String Set pa = pAddressEntry.PropertyAccessor On Error Resume Next addr = pa.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x39FE001E") If addr = "" Then addr = altaddr colAddress.Add addr, addr 'добавляем уникальный адрес On Error GoTo 0 End Sub
[/vba]
Приведенное ниже решает поставленную задачу. Код надо поместить в модуль VBA в Excel и запустить на выполнение процедуру main. Результатом будет создание новой книги со списком уникальных адресов. Предполагается, что дальнейшую необходимую обработку списка (сортировку, выделение домена после "собаки" и т.п.) можно будет сделать вручную на рабочем листе. [vba]
Код
Option Explicit
Dim colAddress As Collection
Sub main() 'запускаем эту процедуру
Dim olApp As Object 'Outlook.Application Dim fldr As Object 'Outlook.Folder Dim arr(), i
Set colAddress = New Collection
Set olApp = CreateObject("Outlook.Application")
'обрабатываем папку Входящие и вложенные в нее Set fldr = olApp.Session.GetDefaultFolder(6) '6 = olFolderInbox Call processFolder(fldr)
'обрабатываем папку Исходящие и вложенные в нее Set fldr = olApp.Session.GetDefaultFolder(5) '5 = olFolderSentMail Call processFolder(fldr)
'вывод уникальных адресов в новую книгу Excel ReDim arr(1 To colAddress.Count, 1 To 1) For i = 1 To colAddress.Count arr(i, 1) = colAddress(i) Next i Application.Workbooks.Add.Worksheets(1).Range("A1").Resize(colAddress.Count) = arr
End Sub
Sub processFolder(ByVal pFolder As Object) 'Outlook.Folder) Dim fldr As Object 'Outlook.Folder Dim item As Object Dim mail As Object 'Outlook.mailItem Dim rcpnt As Object 'Outlook.Recipient Dim i
'перебор элементов в папке For Each item In pFolder.Items If item.Class = 43 Then 'обрабатываем только письма, 43 = olMail Set mail = item i = i + 1 'If i > 10 Then Exit For Debug.Print "Письмо " & i & " в папке " & pFolder.Name Call addAddress(mail.Sender, mail.Sender.Address) 'запоминаем отправителя For Each rcpnt In mail.Recipients 'цикл по получателям Call addAddress(rcpnt.AddressEntry, rcpnt.Address) 'запоминаем получателя Next rcpnt Set mail = Nothing End If Next item
'перебор папок (первого уровня вложенности) For Each fldr In pFolder.Folders Call processFolder(fldr) 'рекурсия Next fldr End Sub
Sub addAddress(ByVal pAddressEntry As Object, _ ByVal altaddr As String) 'Outlook.AddressEntry Dim pa As Object 'PropertyAccessor Dim addr As String Set pa = pAddressEntry.PropertyAccessor On Error Resume Next addr = pa.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x39FE001E") If addr = "" Then addr = altaddr colAddress.Add addr, addr 'добавляем уникальный адрес On Error GoTo 0 End Sub
Уважаемый Gustav, совершенно случайно обнаружил ваш пост, и оказалось это именно то что надо. У меня очень большая корреспонденция за день, и я естественно распределяю принятую почту по темам, то есть по папкам раскидываю.
Вопрос: Что надо изменить для поиска адресов только во вложенной папке с уникальным именем?
Уважаемый Gustav, совершенно случайно обнаружил ваш пост, и оказалось это именно то что надо. У меня очень большая корреспонденция за день, и я естественно распределяю принятую почту по темам, то есть по папкам раскидываю.
Вопрос: Что надо изменить для поиска адресов только во вложенной папке с уникальным именем?kkol
Трудно сказать, не имея возможности запустить отладку... Попробуйте сами в отладчике посмотреть элементы этой строки. Вы именно в моём виде код используете или что-то от себя добавили? Версия Outlook какая? Попробуйте погуглить по "словам" из ошибочной строки: mailitem sender address 438
Трудно сказать, не имея возможности запустить отладку... Попробуйте сами в отладчике посмотреть элементы этой строки. Вы именно в моём виде код используете или что-то от себя добавили? Версия Outlook какая? Попробуйте погуглить по "словам" из ошибочной строки: mailitem sender address 438Gustav
Вопрос: Что надо изменить для поиска адресов только во вложенной папке с уникальным именем?
Извиняюсь, своевременно не увидел этого вопроса. Наверстываю.
Допустим, мы регулярно отправляем письма-поздравления с ДР своим деловым партнерам. И после отправки "для порядка" сохраняем эти письма в подпапке "Дни рождения" стандартной папки "Исходящие". Внутри папки "Дни рождения" дополнительно организуем подпапки по месяцам: "01 Январь", "02 Февраль" и т.д.
Так вот, чтобы организовать обработку единственной вложенной папки, например, по маршруту "Исходящие\Дни рождения\08 Август", можно внести следующие несложные изменения в середину процедуры main(): [vba]
Код
'обрабатываем папку Входящие и вложенные в нее 'КОММЕНТИРУЕМ ПАПКУ ВХОДЯЩИЕ - сейчас она нам не нужна 'Set fldr = olApp.Session.GetDefaultFolder(6) '6 = olFolderInbox 'Call processFolder(fldr)
'обрабатываем папку Исходящие и вложенные в нее Set fldr = olApp.Session.GetDefaultFolder(5) '5 = olFolderSentMail 'ДОБАВЛЯЕМ УТОЧНЕНИЕ ПАПКИ - расписываем маршрут через вложенные Folders Set fldr = fldr.Folders("Дни рождения").Folders("08 Август") Call processFolder(fldr)
Вопрос: Что надо изменить для поиска адресов только во вложенной папке с уникальным именем?
Извиняюсь, своевременно не увидел этого вопроса. Наверстываю.
Допустим, мы регулярно отправляем письма-поздравления с ДР своим деловым партнерам. И после отправки "для порядка" сохраняем эти письма в подпапке "Дни рождения" стандартной папки "Исходящие". Внутри папки "Дни рождения" дополнительно организуем подпапки по месяцам: "01 Январь", "02 Февраль" и т.д.
Так вот, чтобы организовать обработку единственной вложенной папки, например, по маршруту "Исходящие\Дни рождения\08 Август", можно внести следующие несложные изменения в середину процедуры main(): [vba]
Код
'обрабатываем папку Входящие и вложенные в нее 'КОММЕНТИРУЕМ ПАПКУ ВХОДЯЩИЕ - сейчас она нам не нужна 'Set fldr = olApp.Session.GetDefaultFolder(6) '6 = olFolderInbox 'Call processFolder(fldr)
'обрабатываем папку Исходящие и вложенные в нее Set fldr = olApp.Session.GetDefaultFolder(5) '5 = olFolderSentMail 'ДОБАВЛЯЕМ УТОЧНЕНИЕ ПАПКИ - расписываем маршрут через вложенные Folders Set fldr = fldr.Folders("Дни рождения").Folders("08 Август") Call processFolder(fldr)
Мне нужно выгрузить адреса получателей из папки Отправленные Outlook в файл Excel. Написал следующий макрос:
[vba]
Код
Sub main2() 'запускаем эту процедуру из Excel
Dim olApp As Object 'Outlook.Application Dim fldr As Object 'Outlook.Folder
Set olApp = CreateObject("Outlook.Application")
'обрабатываем папку Отправленные PrintInCell ("Адресаты из папки Отправленные") Set fldr = olApp.Session.GetDefaultFolder(5) '5 = olFolderSentMail
For Each Item1 In fldr.Items 'Выписываем адресатов If Item1.Class = 43 Then 'сообщения - Class = 43 str1 = Item1.To PrintInCell (str1) str1 = Item1.CC PrintInCell (str1) str1 = Item1.BCC PrintInCell (str1) End If Next
End Sub
Sub PrintInCell(val1 As String) 'Пользовательская функция записи ActiveCell.Value = val1 ActiveCell.Offset(1, 0).Range("A1").Select End Sub
[/vba]
Все работает хорошо, но вместо электронного адреса часто выдаются ФИО получателя. У атрибутов To, CC и BCC дочерних атрибутов нет. Подскажите, пожалуйста, как выгрузить именно электронный адрес? Ведь в системе электронный адрес имеется (см. скриншот в приложении). И выгрузка Файл - Импорт и экспорт также показывает и ФИО, и электронный адрес. Как можно получить этот электронный адрес, зная ФИО?
Уважаемые коллеги!
Мне нужно выгрузить адреса получателей из папки Отправленные Outlook в файл Excel. Написал следующий макрос:
[vba]
Код
Sub main2() 'запускаем эту процедуру из Excel
Dim olApp As Object 'Outlook.Application Dim fldr As Object 'Outlook.Folder
Set olApp = CreateObject("Outlook.Application")
'обрабатываем папку Отправленные PrintInCell ("Адресаты из папки Отправленные") Set fldr = olApp.Session.GetDefaultFolder(5) '5 = olFolderSentMail
For Each Item1 In fldr.Items 'Выписываем адресатов If Item1.Class = 43 Then 'сообщения - Class = 43 str1 = Item1.To PrintInCell (str1) str1 = Item1.CC PrintInCell (str1) str1 = Item1.BCC PrintInCell (str1) End If Next
End Sub
Sub PrintInCell(val1 As String) 'Пользовательская функция записи ActiveCell.Value = val1 ActiveCell.Offset(1, 0).Range("A1").Select End Sub
[/vba]
Все работает хорошо, но вместо электронного адреса часто выдаются ФИО получателя. У атрибутов To, CC и BCC дочерних атрибутов нет. Подскажите, пожалуйста, как выгрузить именно электронный адрес? Ведь в системе электронный адрес имеется (см. скриншот в приложении). И выгрузка Файл - Импорт и экспорт также показывает и ФИО, и электронный адрес. Как можно получить этот электронный адрес, зная ФИО?Alex_Gur
Добрый день. Попробуйте эту часть кода заменить [vba]
Код
For Each Item1 In fldr.Items 'Выписываем адресатов If Item1.Class = 43 Then 'сообщения - Class = 43 For Each rec In Item1.Recepients Str1 = rec.Address PrintInCell (Str1) Next 'str1 = Item1.To 'PrintInCell (str1) ' str1 = Item1.CC 'PrintInCell (str1) 'str1 = Item1.BCC 'PrintInCell (str1) End If Next
[/vba]
Добрый день. Попробуйте эту часть кода заменить [vba]
Код
For Each Item1 In fldr.Items 'Выписываем адресатов If Item1.Class = 43 Then 'сообщения - Class = 43 For Each rec In Item1.Recepients Str1 = rec.Address PrintInCell (Str1) Next 'str1 = Item1.To 'PrintInCell (str1) ' str1 = Item1.CC 'PrintInCell (str1) 'str1 = Item1.BCC 'PrintInCell (str1) End If Next
sboy, Добрый день! Не поможете докрутить макрос, который будет выгружать не только адреса получателей из папки Отправленные Outlook в файл Excel, но и дату отправки и тему письма? Опубликованный ранее пользователем Alex_Gur макрос по выгрузке адресов получателей из папки Отправленные Outlook в файл Excel:
Sub main2() 'запускаем эту процедуру из Excel
Dim olApp As Object 'Outlook.Application Dim fldr As Object 'Outlook.Folder
Set olApp = CreateObject("Outlook.Application")
'обрабатываем папку Отправленные PrintInCell ("Адресаты из папки Отправленные") Set fldr = olApp.Session.GetDefaultFolder(5) '5 = olFolderSentMail
For Each Item1 In fldr.Items 'Выписываем адресатов If Item1.Class = 43 Then 'сообщения - Class = 43 str1 = Item1.To PrintInCell (str1) str1 = Item1.CC PrintInCell (str1) str1 = Item1.BCC PrintInCell (str1) End If Next
End Sub
Sub PrintInCell(val1 As String) 'Пользовательская функция записи ActiveCell.Value = val1 ActiveCell.Offset(1, 0).Range("A1").Select End Sub
sboy, Добрый день! Не поможете докрутить макрос, который будет выгружать не только адреса получателей из папки Отправленные Outlook в файл Excel, но и дату отправки и тему письма? Опубликованный ранее пользователем Alex_Gur макрос по выгрузке адресов получателей из папки Отправленные Outlook в файл Excel:
Sub main2() 'запускаем эту процедуру из Excel
Dim olApp As Object 'Outlook.Application Dim fldr As Object 'Outlook.Folder
Set olApp = CreateObject("Outlook.Application")
'обрабатываем папку Отправленные PrintInCell ("Адресаты из папки Отправленные") Set fldr = olApp.Session.GetDefaultFolder(5) '5 = olFolderSentMail
For Each Item1 In fldr.Items 'Выписываем адресатов If Item1.Class = 43 Then 'сообщения - Class = 43 str1 = Item1.To PrintInCell (str1) str1 = Item1.CC PrintInCell (str1) str1 = Item1.BCC PrintInCell (str1) End If Next
End Sub
Sub PrintInCell(val1 As String) 'Пользовательская функция записи ActiveCell.Value = val1 ActiveCell.Offset(1, 0).Range("A1").Select End Subkiko
Dim olApp As Object 'Outlook.Application Dim fldr As Object 'Outlook.Folder
Set olApp = CreateObject("Outlook.Application")
'обрабатываем папку Отправленные PrintInCell ("Адресаты из папки Отправленные") Set fldr = olApp.Session.GetDefaultFolder(5) '5 = olFolderSentMail
For Each Item1 In fldr.Items 'Выписываем адресатов If Item1.Class = 43 Then 'сообщения - Class = 43 str1 = Item1.To PrintInCell (str1) str1 = Item1.CC PrintInCell (str1) str1 = Item1.BCC PrintInCell (str1) End If Next
End Sub
Sub PrintInCell(val1 As String) 'Пользовательская функция записи ActiveCell.Value = val1 ActiveCell.Offset(1, 0).Range("A1").Select End Sub
[/vba]
sboy, Прошу прощения [vba]
Код
Sub main2() 'запускаем эту процедуру из Excel
Dim olApp As Object 'Outlook.Application Dim fldr As Object 'Outlook.Folder
Set olApp = CreateObject("Outlook.Application")
'обрабатываем папку Отправленные PrintInCell ("Адресаты из папки Отправленные") Set fldr = olApp.Session.GetDefaultFolder(5) '5 = olFolderSentMail
For Each Item1 In fldr.Items 'Выписываем адресатов If Item1.Class = 43 Then 'сообщения - Class = 43 str1 = Item1.To PrintInCell (str1) str1 = Item1.CC PrintInCell (str1) str1 = Item1.BCC PrintInCell (str1) End If Next
End Sub
Sub PrintInCell(val1 As String) 'Пользовательская функция записи ActiveCell.Value = val1 ActiveCell.Offset(1, 0).Range("A1").Select End Sub