2012-04-20 2 views
0

Мне нужно создать инструмент, который позволит пользователю выбрать электронное письмо из своего Outlook, чтобы затем сохранить это письмо в виде файла .msg или поочередно сохранить только вложение как файл.Найти и выбрать электронную почту Outlook из MS Access

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

Имеет ли в объектной модели Outlook какой-то диалог Explorer/Picker/Selection, который я могу вызов, который будет возвращать storeid и entryid после того, как пользователь выберет электронное письмо? Или мне нужно катиться самостоятельно?

Я должен упомянуть, что я уже знаю, как сохранить электронную почту или приложение, поэтому мой вопрос касается только обработки отбор и фильтрация писем.

FYI, я программирую это в MS Access 2007 с Outlook 2007. На целевых компьютерах есть версии Access и Outlook 2007 или 2010 года.

+0

Вы можете связать Outlook в MS Access. – Fionnuala

+0

Я всегда предполагал, что связанные с Outlook таблицы являются более проблематичными, когда речь идет о совместимости на разных рабочих станциях, версиях Outlook/Access и т. Д. Я не думаю, правильно? – HK1

+0

Я не уверен, я не использовал их много, поэтому я не опубликовал ответ. Вы можете многое сделать с Outlook и VBA, но с тех пор я сделал это. Обычно я использовал автоматизацию. Каждое письмо имеет уникальный идентификатор. – Fionnuala

ответ

0

Ссылка на таблицу Outlook в порядке. Проблема заключается в том, что Outlook не предоставляет уникальный идентификатор для каждого сообщения, и если сообщение перемещается из одной папки в другую, его идентификатор изменяется. Очевидно, не разработан кем-то, кто понимает базы данных.

Лучшим подходом может быть создание надстройки Outlook, которая запускается в Outlook, а затем выполняет задачи, необходимые для отправки информации в Access.

0

Я редко программирую с доступом, но я переместил какой-то код из Outlook, немного взломал его и, похоже, сработал. Это не решение, но оно должно показать вам, как получить доступ ко всей необходимой вам информации.

У меня была одна проблема. Ни Set OutApp = CreateObject("Outlook.Application"), ни Set OutApp = New Outlook.Application создать новый экземпляр Outlook, если он уже открыт. Таким образом, Quit закрывает Outlook независимо от того, был ли он открыт до запуска макроса. Предлагаю вам задать новый вопрос по этому вопросу; Я уверен, кто-то знает, как сказать, что Outlook уже открыт и, следовательно, не прекращать его.

Структура папок в Outlook несколько неудобна, потому что папки верхнего уровня имеют тип Folders, а все подпапки имеют тип MAPIFolder. Как только вы закончите, это довольно просто.

Код ниже включает функцию GetListSortedChildren(ByRef Parent As MAPIFolder) As String. Эта функция находит все дочерние элементы родителя и возвращает строку, такую ​​как «5,2,7,1,3,6,4», в которой перечислены индексы для детей в восходящей последовательности по имени. Я бы использовал что-то подобное, чтобы заполнить ListView, расширив узлы, как требуется пользователю.

Я предоставил подпрограмму CtrlDsplChld(), которая контролирует вывод в непосредственные окна всех папок в последовательности. Я считаю, что это должно дать вам достаточное руководство для начала доступа к иерархии папок.

Подкатегория DsplChld(ByRef Parent As MAPIFolder, ByVal Level As Long) содержит код, чтобы найти первое сообщение с прикрепленными файлами. Это вы расскажете, как просматривать папку для определенного сообщения.

Наконец, CtrlDsplChld() отображает выбранные свойства сообщения: Subject, To, HTMLBody и отображаемые имена вложений.

Надеюсь, это поможет.

Option Compare Database 
Option Explicit 
Dim ItemWithMultipleAttachments As Outlook.MailItem 
Sub CtrlDsplChld() 

    Dim ArrChld() As String 
    Dim ListChld As String 
    Dim InxAttach As Long 
    Dim InxChld As Long 
    Dim InxTopLLCrnt As Long 
    Dim OutApp As Outlook.Application 
    Dim TopLvlList As Folders 

    Set ItemWithMultipleAttachments = Nothing 

    Set OutApp = CreateObject("Outlook.Application") 
    'Set OutApp = New Outlook.Application 

    With OutApp 

    Set TopLvlList = .GetNamespace("MAPI").Folders 

    For InxTopLLCrnt = 1 To TopLvlList.Count 
     ' Display top level children and their children 
     Call DsplChld(TopLvlList.Item(InxTopLLCrnt), 0) 
    Next 

    If Not ItemWithMultipleAttachments Is Nothing Then 
     With ItemWithMultipleAttachments 
     Debug.Print .Subject 
     Debug.Print .HTMLBody 
     Debug.Print .To 
     For InxAttach = 1 To .Attachments.Count 
      Debug.Print .Attachments(InxAttach).DisplayName 
     Next 
     End With 
    End If 
    .Quit 
    End With 
    Set OutApp = Nothing 

End Sub 
Sub DsplChld(ByRef Parent As MAPIFolder, ByVal Level As Long) 

    Dim ArrChld() As String 
    Dim InxChld As Long 
    Dim InxItemCrnt As Long 
    Dim ListChld As String 

    Debug.Print Space(Level * 2) & Parent.Name 

    If ItemWithMultipleAttachments Is Nothing Then 
    ' Look down this folder for a mail item with an attachment 
    For InxItemCrnt = 1 To Parent.Items.Count 
     With Parent.Items(InxItemCrnt) 
     If .Class = olMail Then 
      If .Attachments.Count > 1 Then 
      Set ItemWithMultipleAttachments = Parent.Items(InxItemCrnt) 
      Exit For 
      End If 
     End If 
     End With 
    Next 
    End If 

    ListChld = GetListSortedChildren(Parent) 
    If ListChld <> "" Then 
    ' Parent has children 
    ArrChld = Split(ListChld, ",") 
    For InxChld = LBound(ArrChld) To UBound(ArrChld) 
     Call DsplChld(Parent.Folders(ArrChld(InxChld)), Level + 1) 
    Next 
    End If 

End Sub 
Function GetListSortedChildren(ByRef Parent As MAPIFolder) As String 

    ' The function returns "" if Parent has no children. 
    ' If the folder has children, the functions returns "P,Q,R, ..." where 
    ' P, Q, R and so on indices of the children of Parent in ascending 
    ' order by name. 

    Dim ArrInxFolder() As Long 
    'Dim ArrFolder() As MAPIFolder 
    Dim InxChldCrnt As Long 
    Dim InxName As Long 
    Dim ListChld As String 

If Parent.Folders.Count = 0 Then 
    ' No children 
    GetListSortedChildren = "" 
Else 
'ReDim ArrName(1 To Parent.Folders.Count) 
'For InxChldCrnt = 1 To Parent.Folders.Count 
' ArrFolder(InxChldCrnt) = Parent.Folders(InxChldCrnt) 
'Next 
Call SimpleSortMAPIFolders(Parent, ArrInxFolder) 
    ListChld = CStr(ArrInxFolder(1)) 
    For InxChldCrnt = 2 To Parent.Folders.Count 
    ListChld = ListChld & "," & CStr(ArrInxFolder(InxChldCrnt)) 
    Next 
    GetListSortedChildren = ListChld 
End If 
End Function 
Sub SimpleSortMAPIFolders(ArrFolder As MAPIFolder, _ 
             ByRef InxArray() As Long) 

    ' On exit InxArray contains the indices into ArrFolder sequenced by 
    ' ascending name. The sort is performed by repeated passes of the list 
    ' of indices that swap adjacent entries if the higher come first. 
    ' Not an efficient sort but adequate for short lists. 

    Dim InxIACrnt As Long 
    Dim InxIALast As Long 
    Dim NoSwap As Boolean 
    Dim TempInt As Long 

    ReDim InxArray(1 To ArrFolder.Folders.Count) ' One entry per sub folder 
    ' Fill array with indices 
    For InxIACrnt = 1 To UBound(InxArray) 
    InxArray(InxIACrnt) = InxIACrnt 
    Next 

    If ArrFolder.Folders.Count = 1 Then 
    ' One entry list already sorted 
    Exit Sub 
    End If 

    ' Each repeat of the loop moves the folder with the highest name 
    ' to the end of the list. Each repeat checks one less entry. 
    ' Each repeats partially sorts the leading entries and may result 
    ' in the list being sorted before all loops have been performed. 
    For InxIALast = UBound(InxArray) To 1 Step -1 
    NoSwap = True 
    For InxIACrnt = 1 To InxIALast - 1 
     If ArrFolder.Folders(InxArray(InxIACrnt)).Name > _ 
     ArrFolder.Folders(InxArray(InxIACrnt + 1)).Name Then 
     NoSwap = False 
     ' Move higher entry one slot towards the end 
     TempInt = InxArray(InxIACrnt) 
     InxArray(InxIACrnt) = InxArray(InxIACrnt + 1) 
     InxArray(InxIACrnt + 1) = TempInt 
     End If 
    Next 
    If NoSwap Then 
     Exit For 
    End If 
    Next 

End Sub 
Смежные вопросы