Перемещать письма в папки с именем отправителя - PullRequest
0 голосов
/ 28 мая 2020

Можно создать правило, которое для отправителя перемещает все письма в папку по вашему выбору (например, создает папку с именем отправителя).

Если я хочу, чтобы для всех экспедиторов мне нужно было повторить создание правила для каждого отправителя.

То, что я бы sh, было бы макросом «мета-правило» для каждого отправителя, чтобы иметь папку с имя с соответствующими отсортированными письмами.

Я попытался начать с топи c Правило шаблона Outlook для сортировки писем по каталогам .

Я написал это:

Sub RulesForFolders(m As MailItem)
Dim fldr As Outlook.Folder
For Each fldr In GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Folders
    if fldr.Name Like m.SenderName Then m.MoveTo(SenderName)
    else folders.add(m.SenderName)
Next
Set fldr = Nothing
End Sub

Ответы [ 2 ]

0 голосов
/ 30 мая 2020
Option Explicit ' Consider this mandatory
' Tools | Options | Editor tab
' Require Variable Declaration
'
' If desperate declare as variant


Private Sub RulesForFolders(m As mailItem)

Dim targetFldr As folder
Dim myRoot As folder

Dim i As Long

Set myRoot = Session.GetDefaultFolder(olFolderInbox)
Debug.Print m.senderName

' This is often misused.
On Error Resume Next

' If folder exists the error is bypassed
' This is a rare beneficial use of On Error Resume Next
myRoot.folders.Add m.senderName

' Consider it mandatory to return to normal error handling
On Error GoTo 0

Set targetFldr = myRoot.folders(m.senderName)
m.Move targetFldr

End Sub


Private Sub RulesForFolders_test()

' Code requiring a parameter cannot run independently

Dim selItem As Object

' first select a mailitem
Set selItem = ActiveExplorer.Selection(1)

If selItem.Class = olMail Then
    RulesForFolders ActiveExplorer.Selection(1)
End If

End Sub
0 голосов
/ 29 мая 2020

Прежде всего, я бы предложил начать с события NewMailEx класса Application, которое запускается при получении нового элемента в папке «Входящие». Это событие запускается один раз для каждого полученного элемента, обрабатываемого Microsoft Outlook. Элемент может относиться к одному из нескольких типов элементов, например, MailItem, MeetingItem или SharingItem. Строка EntryIDsCollection содержит идентификатор записи, соответствующий этому элементу. Событие NewMailEx запускается, когда новое сообщение поступает в папку «Входящие» и до того, как выполняется обработка правила клиента. Вы можете использовать идентификатор записи, возвращенный в массиве EntryIDCollection, для вызова метода NameSpace.GetItemFromID и обработки элемента.

Чтобы найти папку с именем отправителя, вы можете перебрать все вложенных папок рекурсивно:

Private Sub processFolder(ByVal oParent As Outlook.MAPIFolder)

        Dim oFolder As Outlook.MAPIFolder
        Dim oMail As Outlook.MailItem

        For Each oMail In oParent.Items

        'Get your data here ...

        Next

        If (oParent.Folders.Count > 0) Then
            For Each oFolder In oParent.Folders
                processFolder oFolder
            Next
        End If
End Sub

Наконец, я бы порекомендовал углубиться в VBA, начав с статьи Начало работы с VBA в Office .


Вы также можно использовать следующий код, если вам не нужно перебирать все папки:

Sub RulesForFolders(m As MailItem)
Dim fldr As Outlook.Folder
Dim new_fldr As Outlook.Folder
Dim ns as Outlook.Namespace
Dim inbox as Outlook.Folder 

Set ns = Application.GetNamespace("MAPI")
Set inbox = ns.GetDefaultFolder(olFolderInbox)

For Each fldr In inbox.Folders
    if InStr(fldr.Name,m.SenderName) > 0 Then 
       m.MoveTo(fldr)
       Return       
    End If
Next

Set new_fldr = folders.add(m.SenderName)
m.MoveTo(new_fldr)

Set fldr = Nothing
Set new_fldr = Nothing
Set inbox = Nothing
Set ns = Nothing

End Sub
...