Есть ли способ найти/прочитать адрес электронной почты отправителя с помощью R, RDCOMClient

library("tm")
library("NLP")
library("dplyr")
library("readtext")
library("readxl")
library("foreach")
library("devtools")
library("RDCOMClient")
library("rlist")

WDF = vector()
OutApp <- COMCreate("Outlook.Application")
outlookNameSpace = OutApp$GetNameSpace("MAPI")

folderName = "Folder Name"
fld <- outlookNameSpace$GetDefaultFolder(6)
fld = fld$folders(folderName)
Cnt = fld$Items()$Count()
emails <- fld$items
df = data.frame(sno = 1:Cnt,Text = "",stringsAsFactors=FALSE)

for(i in 1:10){
  d = as.data.frame(emails(i)$Body(), stringsAsFactors=FALSE)
  df$Text[i] = d[1]
  df$Sender[i] = emails(i)[['SenderName']]
  df$To[i] = emails(i)[['To']]
  df$sub[i] = emails(i)[['subject']]
}
emails(2)[['SenderName']] 

Я пытаюсь получить адрес электронной почты отправителя, используя следующий код:

emails(2)[['SenderEmailAddress']]

Но в итоге получается вот так:

[1] "/O=EXCHANGELABS/OU=EXCHANGE ADMINISTRATIVE GROUP (FYDIBOHF23SPDLT)/CN=RECIPIENTS/CN=E4CD239AB9F44AC4AC0A4015B6F4805A-RATINGSDIRE"

person Parth Kalra    schedule 12.02.2020    source источник


Ответы (1)


Проблема в том, что exchange хранит адрес отправителя как обычную smtp-версию адреса для внешних пользователей, а для пользователей Exchange использует адрес MS Exchange. Чтобы получить обычный smtp-адрес, вам нужно найти пользователя биржи и получить его обычный smtp-адрес электронной почты.

Вы можете посмотреть пакет extrospectr на github. Я не использовал его, но похоже, что он даст вам чистый почтовый ящик, как вы ищете.

Если вы посмотрите на функцию .lookup_exchange_sender в файле read_inbox.R, вы увидите, как они справились с поиском адреса. Сначала вам нужно посмотреть, к какому типу пользователя относится Sender (что можно сделать, получив свойство Sender объекта MailItem, а затем AddressEntryUserType, которое имеет это перечисление). Это заканчивается как emails(2)$Sender()$AddressEntryUserType().

Затем, если это пользователь Exchange, вам нужно будет получить свойство Sender MailItem (которое представляет собой файл AddressEntry), а затем используйте метод GetExchangeUser для AddressEntry, чтобы вернуть ExchangeUser объект. После этого вам просто нужно получить доступ к свойству PrimarrySMTPAddress ExchangeUser. Если сложить все вместе, получится вот так: emails(2)$Sender()$GetExchangeUser()$PrimarySMTPAddress().

Ссылка на extrospectr на github: https://github.com/aecoleman/extrospectr

Это объясняет методологию Outlook для того, что хранится в свойстве электронной почты отправителя: -intern">Свойство SenderEmailAddress не содержит стандартный адрес электронной почты для внутренних контактов

person Roger-123    schedule 19.02.2020
comment
Спасибо @AColeman за правки для улучшения моего ответа и за создание пакета extrospectr - person Roger-123; 19.02.2020
comment
Я рад, что это пригодилось! @Parth Kalra, пожалуйста, примите этот ответ, если он решит вашу проблему, или предоставьте подробную информацию об ошибках или проблемах, которые вы получаете при попытке реализовать его на своем компьютере. - person AColeman; 21.02.2020
comment
@ Roger-123 Спасибо, это было действительно полезно. - person Parth Kalra; 24.02.2020
comment
@AColeman Используя то же упомянутое решение, оно работает, но это занимает много времени, когда у нас есть большой список, который нужно найти. В настоящее время у меня есть 50 тысяч идентификаторов электронной почты для сканирования. Есть ли способ сделать его более прочным? - person Parth Kalra; 06.03.2020
comment
@ Роджер-123, не могли бы вы помочь сделать его более надежным? это занимает много времени, скажем, 1-2 секунды для 1 ID. - person Parth Kalra; 06.03.2020
comment
Не могли бы вы создать новый вопрос и опубликовать обновленный код с просьбой о том, как его ускорить? Вероятно, это более ясный путь к пониманию проблемы и ее решению. Просто опубликуйте новую ссылку в комментариях здесь. - person Roger-123; 19.03.2020