Извлечение данных из сообщения электронной почты (или нескольких тысяч электронных писем) [на основе Exchange] - PullRequest
5 голосов
/ 30 декабря 2008

Мой отдел маркетинга, благослови их, решил устроить тотализатор, где люди заходят через веб-страницу. Это замечательно, но информация не сохраняется в какой-либо БД, а отправляется на почтовый ящик обмена в виде электронного письма. Отлично.

Моя задача состоит в том, чтобы извлечь запись (и маркетинговую информацию) из этих писем и сохранить их где-нибудь более полезным, например, в виде простого файла или CSV. Единственным преимуществом является то, что электронные письма имеют очень постоянный формат.

Я уверен, что смогу потратить время, сохраняя все электронные письма в файлы, а затем написать приложение, чтобы просмотреть их все, но надеялся на гораздо более элегантное решение. Могу ли я программно получить доступ к почтовому ящику обмена, прочитать все электронные письма и затем сохранить эти данные?

Ответы [ 2 ]

7 голосов
/ 31 декабря 2008

Вот код, который я использовал ....

Private Sub btnGo_Click()
  If ComboBox1.SelText <> "" Then
    Dim objOutlook As New Outlook.Application
    Dim objNameSpace As Outlook.NameSpace
    Dim objInbox As MAPIFolder
    Dim objMail As mailItem

    //Get the MAPI reference
    Set objNameSpace = objOutlook.GetNamespace("MAPI")

    //Pick up the Inbox
    Set objInbox = objNameSpace.GetDefaultFolder(olFolderInbox)
    For Each objFolder In objInbox.Folders
       If (objFolder.Name = ComboBox1.SelText) Then
          Set objInbox = objFolder
       End If
    Next objFolder

    //Loop through the items in the Inbox
    Dim count As Integer
    count = 1

    For Each objMail In objInbox.Items
       lblStatus.Caption = "Count: " + CStr(count)
       If (CheckBox1.Value = False Or objMail.UnRead = True) Then
          ProcessMailItem (objMail.Body)
          count = count + 1
          objMail.UnRead = False
       End If
    Next objMail
  End If
End Sub

Private Sub ProcessMailItem(strBody As String)
   Open "C:\file.txt" For Append As 1

   Dim strTmp As String
   strTmp = Replace(strBody, vbNewLine, " ")
   strTmp = Replace(strTmp, vbCrLf, " ")
   strTmp = Replace(strTmp, Chr(13) & Chr(10), " ")
   strTmp = Replace(strTmp, ",", "_")

   //Extra Processing went here (Deleted for brevity)
   Print #1, strTmp
   Close #1

End Sub

Private Function Strip(strStart As String, strEnd As String, strBody As String) As String
   Dim iStart As Integer
   Dim iEnd As Integer

   iStart = InStr(strBody, strStart) + Len(strStart)
   If (strEnd = "xxx") Then
      iEnd = Len(strBody)
   Else
      iEnd = InStr(strBody, strEnd) - 1
   End If

   Strip = LTrim(RTrim(Mid(strBody, iStart, iEnd - iStart)))
End Function


Private Sub UserForm_Initialize()
  Dim objOutlook As New Outlook.Application
  Dim objNameSpace As Outlook.NameSpace
  Dim objInbox As MAPIFolder
  Dim objFolder As MAPIFolder

  //Get the MAPI reference
  Set objNameSpace = objOutlook.GetNamespace("MAPI")

  //Pick up the Inbox
  Set objInbox = objNameSpace.GetDefaultFolder(olFolderInbox)

  //Loop through the folders under the Inbox
  For Each objFolder In objInbox.Folders
    ComboBox1.AddItem objFolder.Name
  Next objFolder
End Sub
2 голосов
/ 30 декабря 2008

Существует множество различных способов получения сообщений в почтовом ящике обмена, но, поскольку кажется, что вы захотите запустить его только один раз для извлечения данных, я бы предложил написать макрос VBA для запуска внутри Сам Outlook (открыв почтовый ящик обмена в Outlook). Довольно просто перебирать почтовые элементы в определенном почтовом ящике и читать основной текст из них. Затем вы можете написать текстовый файл, используя только то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...