Integration: 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ật, cơ chế 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ệnh | Vị trí ribbon | Việc nó làm |
|---|---|---|
| Gửi Email | DVD Addin › File và In | Soạn thư từ dữ liệu sheet, gửi một thư hoặc cả loạt qua Outlook |
| Lấy Email | DVD Addin › File và In › Menu Email | Quét một thư mục Outlook, đổ nội dung thư vào sheet Output + tải file đính kèm |
| Mẫu Email | DVD Addin › File và In › Menu Email | Mở SendEmail.xlsx — khung cột chuẩn cho gửi hàng loạt |
Ngoài ba lệnh này, add-in không đụng tới Calendar, Contacts, Categories hay Rules của Outlook.
Use cases
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" theo kiểu mail merge, mà là ô driver: 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ộ logic 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.
Kèm theo mỗi vòng có thể xuất các sheet đã chọn thành một file PDF và đính kèm tự động, tên file = 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 + 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:
| STT | Tiêu đề (Subject) | Nội dung (Body) | Người gửi (Sender Name) | Thời gian nhận | Số file đính kèm | Vị trí Folder |
|---|---|---|---|---|---|---|
| 1 | BBNT MC-01 phê duyệt | (thân thư, cắt ở 32.000 ký tự) | Nguyễn Văn A | 2026-05-15 09:12 | 2 | D:\...\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 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 dòng Subject nguyên văn
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 rơi vào cùng một chuỗi tiêu đề. Đó chính là điều làm bước đối chiếu bên dưới chạy đượ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 import theo từng tháng thành 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 chữ "Chưa phản hồi".
Quy trình đầy đủ:
- Gửi Email hàng loạt → 50 nhà thầu nhận phiếu yêu cầu nghiệm thu.
- Các bên phản hồi → thư về Inbox.
- Lấy Email từ thư mục Inbox (hoặc thư mục con đã lọc bằng Rule của Outlook) → sheet Output.
- Cột
Statuscủa bảng gốc dùngdvdXlookupdò tiêu đề gốc sang cột Thời gian nhận. - Ô 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 — 47 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ổ chat, 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 late-bind qua ProgID chứ không tham chiếu cứng thư viện Outlook:
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 ngầm. Máy không cài Outlook thì lệnh dừng có thông báo, không crash Excel.
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 mà cây thư mục trong hộp thoại trả về, ví dụ \\ten@congty.com\Inbox\Du an ABC\TVGS, rồi đi lần theo từng cấp. Bỏ trống thì Outlook tự bật hộp 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ụ đã gắn thêm vào profile — không bị giới hạn ở Inbox mặc định.
Duyệt thư
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ỉ mail item (Class 43) được lấy. Lịch hẹn, liên hệ, task nằm trong 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.Restrictcủa Outlook. Nghĩa là add-in vẫn phải chạm vào 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 Display() trước để Outlook chèn chữ ký mặc định của chính tài khoản đó, sau đó nội dung do add-in dựng đượ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ỏ bớt số dòng ghi ra sheet. Cách thật sự nhanh hơn:
- Trong Outlook, tạo Rule hoặc Search Folder đẩy thư của dự án vào một thư mục con riêng.
- 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 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 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 nhận focus có thể nuốt phím của bạn. Chạy loạt lớn vào lúc không dùng máy.
Troubleshooting
#1 — "Microsoft Outlook không được cài đặt."
ProgID Outlook.Application không đăng ký. Nguyên nhân thường gặp: máy chỉ có Excel (gói Office lẻ), hoặc dùng Outlook bản web/New Outlook — New Outlook (bản viết lại) không cung cấp COM Object Model, phải bật lại 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.
Phòng tránh: trước khi gửi loạt, kiểm tra bằng một cột phụ =IF(ISERROR(...),"","OK") hoặc chạy DS 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
Outlook 2007+ có Object Model Guard, hỏi khi ứng dụng 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:
- Bảo đảm Windows Security / phần mềm diệt virus đang bật và cập nhật — Outlook tự bỏ cảnh báo khi Security Center báo máy được bảo vệ.
- Nếu máy do IT quản lý: nhờ IT nới Trust Center → Programmatic Access qua Group Policy.
- Hạ chốt thủ công trong Trust Center là phương án cuối, vì nó hạ bảo vệ cho mọi ứng dụng chứ không riêng DVDAddin.
#4 — Thư vào Junk phía người nhận
- Kiểm tra Sent Items 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 spam. 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 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 iteration, 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ể chụp 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
Ô driver bị ghi số vòng lặp thật vào 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
- Gửi Email — chi tiết từng trường trong hộp thoại.
- Lấy Email — chi tiết bộ lọc và thư mục lưu đính kèm.
- Mẫu Email —
SendEmail.xlsxvới cấu trúc cột chuẩn. - In hàng loạt — cùng cơ chế ô driver nhưng để in / xuất PDF.
- Workflow: Nghiệm thu hàng loạt — kết hợp Excel + Word + Email.
- Integration: Word — sinh văn bản kèm theo thư.