kiến thức [Outlook VBA] Tự động chuyển mail mới nhận vào thư mục mang tên người gửi

NguyenDang95

Senior Member
Chào mọi người. Khi sử dụng Outlook, một số người dùng thường có thói quen sắp xếp mail theo tên người gửi để tiện theo dõi và quản lý. Ngoài việc sắp xếp thủ công theo kiểu truyền thống, với kiến thức về VBA chúng ta có thể viết một macro nho nhỏ để Outlook tự động xử lý công việc này một cách nhanh chóng và hoàn toàn tự động.
Ví dụ dưới đây, macro này sẽ:
  • Mỗi khi nhận được mail mới, Outlook sẽ kiểm tra xem trong thư mục Senders đã có sẵn thư mục mang tên người gửi mail mà ta vừa nhận chưa, nếu chưa thì tạo, không thì sẽ chuyển mail mới đó vào thư mục mang tên người gửi mail đó (sự kiện ItemAdd, Application_Startup để macro tự động chạy mỗi lần mở Outlook).
  • Hiển thị mail mới nhận cho người dùng biết, chạy tác vụ đồng bộ thư mục Senders với máy chủ mail.
Lưu ý: Người dùng cần tạo thư mục "Senders" trước khi chạy macro này.

Đầu tiên, tạo Class Module với tên "cls_MoveNewMails" như hình dưới

1644325952947.png


Code:
Option Explicit
Private WithEvents objItems As Outlook.Items

Private Sub Class_Initialize()
    Dim objInboxFld As Outlook.Folder
    Set objInboxFld = Application.Session.DefaultStore.GetDefaultFolder(olFolderInbox)
    Set objItems = objInboxFld.Items
End Sub

Private Sub objItems_ItemAdd(ByVal Item As Object)
    Call MoveToSendersFolder(Item)
End Sub

Private Sub MoveToSendersFolder(objItem As Outlook.MailItem)
    Dim objNewFld As Outlook.Folder
    Dim objStore As Outlook.Store
    Dim objNS As Outlook.NameSpace
    Dim objSync As Outlook.SyncObject
    Dim objInboxFld As Outlook.Folder
    Dim objRootFld As Outlook.Folder
    Dim objInsp As Outlook.Inspector
    If TypeOf objItem Is Outlook.MailItem Then
        Set objNS = Application.Session
        Set objStore = objNS.DefaultStore
        Set objRootFld = objStore.GetRootFolder
        If FolderExistsInSenders(objItem.SenderEmailAddress) Then
            Set objNewFld = objRootFld.Folders("Senders").Folders(objItem.SenderEmailAddress)
            objItem.Move objNewFld
        Else
            Set objNewFld = objRootFld.Folders("Senders").Folders.Add(objItem.SenderEmailAddress)
            objItem.Move objNewFld
        End If
        If Err.Number = 0 Then
            Set objSync = objNS.SyncObjects.AppFolders
            objRootFld.InAppFolderSyncObject = True
            objSync.Start
            Set objInsp = objItem.GetInspector
            objItem.Display
            objInsp.WindowState = olNormalWindow
        End If
    End If
    Set objNS = Nothing
    Set objRootFld = Nothing
    Set objNewFld = Nothing
    Set objStore = Nothing
    Set objInboxFld = Nothing
    Set objSync = Nothing
    Set objInsp = Nothing
End Sub

Private Function FolderExistsInSenders(FolderName As String) As Boolean
    Dim FolderObject As Folder
    Dim SendersFldr As Folder
    On Error GoTo FolderNotFoundErr
    Set SendersFldr = Application.Session.DefaultStore.GetRootFolder.Folders("Senders")
    If SendersFldr.Folders.Count = 0 Then
        FolderExistsInSenders = False
        Exit Function
    End If
    For Each FolderObject In SendersFldr.Folders
        If FolderObject.Name = FolderName Then
            FolderExistsInSenders = True
            Exit For
        Else: FolderExistsInSenders = False
        End If
    Next
    If Err.Number = -2147221233 Then
FolderNotFoundErr: MsgBox "You need to create a folder named 'Senders' before running this macro. Please try again.", vbExclamation, "Senders Folder Not Found"
    End If
    Set FolderObject = Nothing
    Set SendersFldr = Nothing
End Function

ThisOutlookSession

1644325568356.png


Code:
Option Explicit
Private MoveToSendersFolder As cls_MoveNewMails
Private Sub Application_Startup()
    Set MoveToSendersFolder = New cls_MoveNewMails
End Sub

Khởi động lại Outlook để macro có hiệu lực.
Kết quả:

1644325660626.png
 
Last edited:
Cám ơn thím về trick. Cơ mà thế này cho ai nhận ít mail thôi chứ nhận nhiều mail từ nhiều người thì cái Hierarchy Tree nó dài ngoằng và rối mắt lắm.

Tự nghĩ ra cách sắp xếp Tree xong dùng Rules vẫn ngon.
Đúng rồi thím, em nghĩ trường hợp này dùng Rules sau đó nghĩ ra cách sắp xếp nào đó logic thì sẽ tốt hơn.
À mà tiêu đề em viết lộn chút xíu, đúng ra là " [Outlook VBA] Tự động chuyển mail mới nhận vào thư mục mang tên người gửi" thím ạ :D, không biết sửa lại tiêu đề thế nào.
 
Đúng rồi thím, em nghĩ trường hợp này dùng Rules sau đó nghĩ ra cách sắp xếp nào đó logic thì sẽ tốt hơn.
À mà tiêu đề em viết lộn chút xíu, đúng ra là " [Outlook VBA] Tự động chuyển mail mới nhận vào thư mục mang tên người gửi" thím ạ :D, không biết sửa lại tiêu đề thế nào.
done nhé thím :D
 
Đúng rồi thím, em nghĩ trường hợp này dùng Rules sau đó nghĩ ra cách sắp xếp nào đó logic thì sẽ tốt hơn.
À mà tiêu đề em viết lộn chút xíu, đúng ra là " [Outlook VBA] Tự động chuyển mail mới nhận vào thư mục mang tên người gửi" thím ạ :D, không biết sửa lại tiêu đề thế nào.
Như mình tên người gửi còn có cả tên công ty và bộ phận nữa nên nó dài khiếp lắm.

Thím làm cái series này khá hay đó. Khi nào có ý tưởng gì mình lại nhờ thím viết xong biên bài nhé :D
 
Cái này có lợi ích gì hơn Rule nhỉ? Ngoài ra đối với Exchange/IMap thì rules nó còn có thể chạy trên serverside, còn cái này thì nó ở clientside nên khi đổi máy lại phải kích hoạt VBA mới có hiệu lực, chưa kể tự động như vậy thì nó tạo quá nhiều subfolder không cần thiết khi có mail "lạ" là lại tạo ra 1 folder mới.
Mình hiểu như vậy k biết có đúng k?
 
Cái này có lợi ích gì hơn Rule nhỉ? Ngoài ra đối với Exchange/IMap thì rules nó còn có thể chạy trên serverside, còn cái này thì nó ở clientside nên khi đổi máy lại phải kích hoạt VBA mới có hiệu lực, chưa kể tự động như vậy thì nó tạo quá nhiều subfolder không cần thiết khi có mail "lạ" là lại tạo ra 1 folder mới.
Mình hiểu như vậy k biết có đúng k?
Đúng rồi thím.
 
Back
Top