Đến nội dung

Kết hợp với Outlook ​

DVDAddin không có máy chủ thư riêng. Mọi thao tác email đều đi qua Microsoft Outlook đã cài và đã đăng nhập tài khoản trên chính máy đó. Trang này gom lại các quy trình thực tế, cơ chế hoạt động bên dưới và cách xử lý sự cố khi dùng hai lệnh email của add-in.

Ba lệnh email thật ​

LệnhVị trí trên ribbonViệc lệnh làm
Gửi EmailDVD Addin › File và InSoạn thư từ dữ liệu sheet, gửi một thư hoặc cả loạt qua Outlook
Lấy EmailDVD Addin › File và In › Menu EmailQuét một thư mục Outlook, đổ nội dung thư vào sheet Output và tải file đính kèm
Mẫu EmailDVD Addin › File và In › Menu EmailMở SendEmail.xlsx — khung cột chuẩn để gửi hàng loạt

Ngoài ba lệnh này, add-in không đụng tới Lịch (Calendar), Danh bạ (Contacts), Thể loại (Categories) hay Quy tắc (Rules) của Outlook.

Các tình huống sử dụng ​

1. Gửi Email hàng loạt qua Outlook ​

→ Xem Gửi Email.

Cơ chế không phải "mỗi hàng = 1 email" như trộn thư thông thường, mà dựa vào ô driver (ô điều khiển): bạn chỉ định một ô (ví dụ B1), add-in ghi lần lượt 1, 2, 3… vào ô đó; sheet tự tính lại bằng INDEX/VLOOKUP để ra người nhận – tiêu đề – nội dung của vòng hiện tại, rồi thư được gửi. Nhờ vậy toàn bộ cách chọn dữ liệu nằm trong công thức Excel của bạn, muốn phức tạp bao nhiêu cũng được.

Mỗi vòng còn có thể xuất các sheet đã chọn thành một file PDF và tự đính kèm, tên file = tên gốc (base) + _ + số vòng lặp.

2. Kéo hộp thư về Excel ​

→ Xem Lấy Email.

Chọn một thư mục Outlook, khoảng ngày và các đuôi file cần lấy. Kết quả ghi vào sheet tên Output với đúng 7 cột:

STTTiêu đề (Subject)Nội dung (Body)Người gửi (Sender Name)Thời gian nhậnSố file đính kèmVị trí Folder
1BBNT MC-01 phê duyệt(thân thư, cắt ở 32.000 ký tự)Nguyễn Văn A2026-05-15 09:122D:\...\Attachments\15052026

File đính kèm không nằm cạnh workbook mà vào <thư mục bạn chọn>\Attachments\<ddMMyyyy>\ — thư mục con đặt theo ngày chạy lệnh, không phải ngày nhận thư. File trùng tên được thêm hậu tố _1, _2… chứ không ghi đè.

Cột "Tiêu đề" là chủ đề hội thoại, không phải nguyên văn dòng tiêu đề thư

Add-in lấy ConversationTopic của thư (chỉ khi trống mới lùi về Subject). Outlook đã cắt sẵn các tiền tố RE:, FW: khỏi giá trị này, nên thư trả lời và thư gốc có cùng một tiêu đề. Nhờ đó bước đối chiếu bên dưới mới làm được.

3. Đối chiếu phản hồi của các bên ​

Vì cột B đã bỏ tiền tố RE:, bạn dò thẳng bằng tiêu đề gốc của thư mình gửi đi — không cần ghép chuỗi "Re: ":

=dvdXlookup(A2; Output!$B$2:$B$5000; Output!$E$2:$E$5000; "Chưa phản hồi"; "Chưa phản hồi"; 0)

dvdXlookup trả về thời gian nhận của thư đầu tiên khớp tiêu đề, hoặc chuỗi "Chưa phản hồi" nếu không tìm thấy — xem dvdXlookup.

Nếu bạn lấy thư theo từng tháng ra nhiều sheet, dvdLookupAllSheets dò trên mọi sheet đang hiển thị của workbook (bỏ qua sheet ẩn và bỏ qua chính sheet chứa công thức), chỉ định cột bằng số thứ tự cột chứ không bằng vùng:

=dvdLookupAllSheets(A2; 2; 5)

(cột 2 = Tiêu đề, cột 5 = Thời gian nhận của sheet Output — đúng thứ tự cột ở bảng trên.) Hàm này khớp trọn ô, không khớp một phần, và trả #N/A khi không tìm thấy — bọc trong IFNA nếu muốn hiện chữ "Chưa phản hồi".

Quy trình đầy đủ:

  1. Gửi Email hàng loạt → 50 nhà thầu nhận phiếu yêu cầu nghiệm thu.
  2. Các bên phản hồi → thư về Inbox.
  3. Lấy Email từ thư mục Inbox (hoặc thư mục con mà quy tắc Rules của Outlook đã lọc thư vào) → sheet Output.
  4. Cột Status của bảng gốc dùng dvdXlookup dò tiêu đề gốc sang cột Thời gian nhận.
  5. Ô nào ra "Chưa phản hồi" thì đó là danh sách cần nhắc lại.

Điều kiện để bước 4 khớp: tiêu đề bạn đặt lúc gửi phải cố định và duy nhất cho từng bên (ví dụ YCNT-MC-01 — Nha thau A). Bên nhận sửa tiêu đề khi trả lời thì không cách nào dò được nữa.

4. Phân loại thư bằng AI ​

Không có hàm bảng tính nào gọi AI với câu hỏi tự do — 50 hàm UDF của add-in không có hàm nào như vậy (hàm AI duy nhất là dvdAIExplain, chỉ giải thích công thức Excel). Muốn để AI đọc và phân loại nội dung thư, dùng Trợ lý AI: mở cửa sổ trò chuyện, dán cột Tiêu đề + Nội dung từ sheet Output và yêu cầu phân nhóm, rồi dán kết quả trở lại một cột phụ.

Cơ chế bên dưới ​

Kết nối Outlook ​

Add-in gọi Outlook qua ProgID lúc chạy (late binding) chứ không tham chiếu cứng thư viện Outlook:

csharp
Type olType = Type.GetTypeFromProgID("Outlook.Application");
if (olType == null) { /* báo "Microsoft Outlook không được cài đặt." rồi dừng */ }
dynamic outlook = Activator.CreateInstance(olType);
dynamic ns = outlook.GetNamespace("MAPI");
try { ns.Logon(); } catch { }

Nếu Outlook đang chạy thì dùng lại phiên đó; nếu chưa, COM tự khởi động Outlook chạy ngầm. Máy không cài Outlook thì lệnh dừng kèm thông báo, không làm Excel bị sập.

Chọn thư mục ​

Không dùng hằng số GetDefaultFolder(6) như đa số script mẫu trên mạng. Lệnh Lấy Email nhận đường dẫn thư mục dạng chuỗi do cây thư mục trong hộp thoại trả về, ví dụ \\ten@congty.com\Inbox\Du an ABC\TVGS, rồi lần theo từng cấp. Để trống thì Outlook tự bật hộp chọn thư mục (PickFolder) của nó.

Hệ quả thực tế: bạn quét được bất kỳ thư mục con nào, kể cả hộp thư phụ đã thêm vào hồ sơ (profile) Outlook — không bị giới hạn ở Inbox mặc định.

Duyệt thư ​

csharp
foreach (dynamic item in folder.Items)
{
    if ((int)item.Class != 43) continue;   // 43 = olMailItem
    DateTime received = item.ReceivedTime;
    if (start.HasValue && received.Date < start.Value.Date) continue;
    if (end.HasValue   && received.Date > end.Value.Date)   continue;
    // ghi ra sheet…
}

Hai điểm đáng nhớ:

  • Chỉ lấy thư (mục có Class 43). Lịch hẹn, danh bạ, công việc (task) nằm cùng thư mục đều bị bỏ qua.
  • Bộ lọc ngày chạy trong vòng lặp, không phải bằng Items.Restrict của Outlook. Nghĩa là add-in vẫn phải đọc qua từng thư trong thư mục dù bạn đã thu hẹp khoảng ngày.

Chữ ký thư ​

Add-in không lưu chữ ký riêng — không có tùy chọn chữ ký trong Tùy chọn. Khi gửi, mỗi thư được mở ra trước (Display()) để Outlook chèn chữ ký mặc định của chính tài khoản đó, sau đó nội dung do add-in soạn được ghép vào phía trên chữ ký rồi mới gửi đi.

Muốn đổi chữ ký: sửa trong Outlook (File → Options → Mail → Signatures). Muốn chữ ký khác nhau theo từng nhóm người nhận: chọn tài khoản gửi khác nhau ở trường Từ (Sender) — chữ ký đi theo tài khoản.

Hiệu năng khi xử lý nhiều thư ​

Thư mục lớn thì chậm — thu hẹp thư mục, không chỉ thu hẹp ngày ​

Vì bộ lọc ngày chạy phía add-in (xem trên), đặt "Từ ngày / Đến ngày" không làm Outlook trả về ít thư hơn — nó chỉ bớt số dòng ghi ra sheet. Cách thật sự nhanh hơn:

  1. Trong Outlook, tạo quy tắc (Rule) hoặc thư mục tìm kiếm (Search Folder) để gom thư của dự án vào một thư mục con riêng.
  2. Chạy Lấy Email trên đúng thư mục con đó.

Quét Inbox gốc vài chục nghìn thư có thể mất nhiều phút và trông như Excel bị treo — thực ra vẫn đang chạy (add-in đã tắt cập nhật màn hình ScreenUpdating nên màn hình đứng yên).

Mỗi thư gửi đi đều bật cửa sổ soạn thư ​

Do phải mở thư (Display()) để lấy chữ ký, gửi 50 thư nghĩa là 50 lần cửa sổ soạn thư Outlook nhấp nháy. Đừng gõ phím hay bấm chuột trong lúc đó — cửa sổ đang được chọn có thể nuốt mất phím bạn gõ. Hãy chạy loạt lớn vào lúc không dùng máy.

Xử lý sự cố ​

#1 — "Microsoft Outlook không được cài đặt." ​

ProgID Outlook.Application chưa được đăng ký. Nguyên nhân thường gặp: máy chỉ có Excel (gói Office lẻ), hoặc dùng Outlook trên web / New Outlook — New Outlook (bản viết lại) không hỗ trợ điều khiển qua COM (COM Object Model), phải chuyển lại Outlook bản cổ điển (Outlook classic).

#2 — Thư đã gửi nhưng thiếu file đính kèm ​

Add-in thêm đính kèm bằng if (File.Exists(path)) mail.Attachments.Add(path); bọc trong try/catch — đường dẫn sai hoặc file bị khóa thì bị bỏ qua âm thầm, thư vẫn được gửi. Không có thông báo lỗi.

Cách phòng: trước khi gửi loạt, kiểm tra bằng một cột phụ =IF(ISERROR(...),"","OK") hoặc chạy Danh sách tên file trên thư mục đính kèm để đối chiếu tên; và luôn bấm Preview cho vòng đầu tiên.

#3 — Outlook hiện cảnh báo bảo mật ​

Từ Outlook 2007 trở đi có cơ chế bảo vệ Object Model Guard, hiện hộp hỏi khi một ứng dụng bên ngoài đọc địa chỉ hoặc gửi thư thay bạn:

"A program is trying to access email addresses you have stored in Outlook…"

Cách xử lý theo thứ tự ưu tiên:

  1. Bảo đảm Windows Security / phần mềm diệt virus đang bật và được cập nhật — Outlook tự bỏ cảnh báo khi Security Center báo máy đang được bảo vệ.
  2. Nếu máy do bộ phận IT quản lý: nhờ IT nới thiết lập Trust Center → Programmatic Access bằng Group Policy.
  3. Tự hạ mức chặn trong Trust Center là phương án cuối cùng, vì nó hạ bảo vệ cho mọi ứng dụng chứ không riêng DVDAddin.

#4 — Thư rơi vào hộp thư rác (Junk) của người nhận ​

  • Kiểm tra thư mục Sent Items (Mục đã gửi) trước: có thư ở đó nghĩa là Outlook đã nhận và gửi đi, phần còn lại nằm ngoài tầm add-in.
  • Loạt vài chục thư giống hệt nhau dễ bị lọc là thư rác. Cho nội dung khác nhau theo từng người nhận (đằng nào cũng đã có ô driver), và chia nhỏ đợt gửi.
  • Nhờ bên nhận thêm địa chỉ của bạn vào danh sách người gửi an toàn (Safe Senders).

#5 — PDF đính kèm bị trống hoặc thiếu vòng cuối ​

Khi bật xuất PDF theo từng vòng lặp, add-in xuất sheet ngay trước lúc gửi. Nếu workbook đang ở chế độ tính tay hoặc còn ô đang sửa dở, PDF có thể ghi lại trạng thái cũ. Trước khi chạy loạt: thoát chế độ sửa ô (Esc), bấm F9 tính lại, lưu workbook.

#6 — Ô driver bị ghi đè mất giá trị gốc ​

Số vòng lặp được ghi thật vào ô driver trên bảng tính, không phải giá trị tạm. Chạy xong thì giá trị cũ trong ô đó đã mất. Luôn lưu workbook trước khi bấm Gửi.

Liên quan ​

Phát hành theo giấy phép DVDAddin.