Cách Gửi Email Từ Excel: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao

Mở Đầu

Trong môi trường làm việc hiện đại, việc tự động hoá các quy trình là một yếu tố quan trọng giúp tăng năng suất và giảm thiểu sai sót. Một trong những nhu cầu phổ biến nhất của các nhân viên văn phòng, quản lý dự án hay nhà phân tích dữ liệu là gửi email từ Excel. Thay vì phải mở Outlook, Gmail hay các công cụ email khác để soạn và gửi từng email một cách thủ công, bạn có thể sử dụng Excel để tạo danh sách, nhập nội dung và thực hiện việc gửi email một cách tự động, nhanh chóng và chính xác.

Bài viết này sẽ cung cấp cho bạn một hướng dẫn chi tiết, từ những kiến thức cơ bản nhất cho người mới bắt đầu đến các kỹ thuật nâng cao cho người đã có kinh nghiệm. Chúng ta sẽ khám phá:

  1. Các phương pháp gửi email từ Excel (Sử dụng VBA, Power Query, Power Automate, Add‑in của bên thứ ba…).
  2. Cài đặt môi trường và chuẩn bị dữ liệu.
  3. Viết và chạy macro VBA để gửi email qua Outlook.
  4. Gửi email qua Gmail bằng VBA và SMTP.
  5. Sử dụng Power Automate (Microsoft Flow) để tự động hoá quy trình.
  6. Các lưu ý bảo mật, quản lý lỗi và tối ưu hiệu suất.
  7. Các trường hợp thực tiễn: gửi email marketing, báo cáo tự động, thông báo nhắc nhở, và hơn thế nữa.

Hãy cùng bắt đầu khám phá từng bước một cách chi tiết và thực tiễn nhất.

1. Tổng Quan Các Phương Pháp Gửi Email Từ Excel

Phương phápƯu điểmNhược điểmKhi nào nên dùng
VBA + Outlook– Tích hợp sẵn trong Windows
– Độ tin cậy cao
– Có thể tùy chỉnh mạnh mẽ
– Cần cài Outlook
– Phụ thuộc vào cấu hình Outlook của người dùng
Gửi email nội bộ, báo cáo công ty, khi môi trường đã có Outlook
VBA + Gmail (SMTP)– Không cần Outlook
– Hỗ trợ tài khoản Gmail, Yahoo, Outlook.com
– Cần cấu hình SMTP, có thể gặp vấn đề bảo mật (2FA)
– Hạn chế số lượng gửi
Gửi email tới khách hàng bên ngoài, khi không có Outlook
Power Automate (Microsoft Flow)– Giao diện kéo‑thả, không cần lập trình
– Tích hợp đa nền tảng (Outlook, Gmail, Teams)
– Lưu lịch sử, log
– Cần tài khoản Microsoft 365
– Giới hạn số lần chạy (plan)
Tự động hoá quy trình doanh nghiệp, tích hợp nhiều dịch vụ
Add‑in bên thứ ba (e.g., Mail Merge, Easy Mail Merge)– Giao diện thân thiện
– Hỗ trợ template, theo dõi mở mail
– Phải trả phí (đôi khi)
– Phụ thuộc vào nhà cung cấp
Khi cần giải pháp nhanh, không muốn lập trình
Power Query + Power BI + Dataflow– Kết hợp với báo cáo BI, gửi email tự động khi dữ liệu thay đổi– Phức tạp, yêu cầu kiến thức Power BIGửi báo cáo thống kê tự động tới các bên liên quan

Trong phần tiếp theo, chúng ta sẽ tập trung vào hai phương pháp phổ biến nhất: VBA + Outlook và VBA + Gmail (SMTP), đồng thời giới thiệu nhanh về Power Automate để bạn có thể lựa chọn phù hợp.

2. Chuẩn Bị Dữ Liệu Trong Excel

Trước khi thực hiện bất kỳ đoạn mã nào, bạn cần chuẩn bị một bảng dữ liệu đầy đủ các trường thông tin cần thiết cho email. Một mẫu bảng thường bao gồm:

ABCDEF
Họ và TênEmailTiêu đềNội dungFile đính kèmTrạng thái
  • Cột A (Họ và Tên): Thông tin cá nhân, có thể dùng trong lời chào (Dear Tên).
  • Cột B (Email): Địa chỉ email nhận.
  • Cột C (Tiêu đề): Chủ đề email, có thể tùy biến từng người.
  • Cột D (Nội dung): Nội dung email, có thể chứa các placeholder như {Tên} để thay thế.
  • Cột E (File đính kèm): Đường dẫn đầy đủ tới file (nếu có).
  • Cột F (Trạng thái): Đánh dấu “Đã gửi”, “Lỗi”, “Chưa gửi” để quản lý.

2.1. Định Dạng Dữ Liệu

  • Email: Đảm bảo không có khoảng trắng thừa, không có ký tự đặc biệt. Có thể dùng công thức =TRIM(B2) để loại bỏ khoảng trắng.
  • Tiêu đề & Nội dung: Sử dụng công thức =SUBSTITUTE(D2,"{Tên}",A2) để thay thế placeholder.
  • Đường dẫn file: Nếu file nằm trong cùng thư mục với workbook, bạn có thể dùng công thức =CELL("filename",A1) để lấy đường dẫn thư mục và nối với tên file.

2.2. Kiểm Tra Dữ Liệu

Trước khi chạy macro, hãy thực hiện kiểm tra nhanh:

Sub CheckData() Dim i As Long, lastRow As Long lastRow = Cells(Rows.Count, "B").End(xlUp).Row For i = 2 To lastRow If Cells(i, "B").Value = "" Then MsgBox "Dòng " & i & " chưa có email!", vbExclamation Exit Sub End If Next i MsgBox "Kiểm tra dữ liệu hoàn tất. Sẵn sàng gửi.", vbInformation
End Sub

Sau khi dữ liệu đã sạch sẽ, chúng ta chuyển sang viết macro.

3. Gửi Email Từ Excel Bằng VBA + Outlook

3.1. Khởi Tạo Môi Trường VBA

  1. Mở Excel → Nhấn Alt + F11 để mở Visual Basic for Applications (VBA) Editor.
  2. Trong Project Explorer, chuột phải vào VBAProject (YourWorkbook.xlsx) → Insert → Module. Đặt tên module là modMailOutlook.
  3. Đảm bảo thư viện Microsoft Outlook xx.x Object Library đã được tham chiếu: Vào Tools → References → tích vào Microsoft Outlook xx.x Object Library.

3.2. Code Gửi Email Cơ Bản

Option Explicit Sub SendMailViaOutlook() Dim OutlookApp As Outlook.Application Dim OutlookMail As Outlook.MailItem Dim ws As Worksheet Dim lastRow As Long, i As Long Dim recipient As String, subject As String, body As String Dim attachPath As String Set ws = ThisWorkbook.Sheets("Sheet1") ' Thay "Sheet1" bằng tên sheet của bạn lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row On Error Resume Next Set OutlookApp = GetObject(class:="Outlook.Application") If OutlookApp Is Nothing Then Set OutlookApp = CreateObject(class:="Outlook.Application") End If On Error GoTo 0 For i = 2 To lastRow recipient = Trim(ws.Cells(i, "B").Value) If recipient = "" Then GoTo NextIteration subject = ws.Cells(i, "C").Value body = ws.Cells(i, "D").Value attachPath = ws.Cells(i, "E").Value Set OutlookMail = OutlookApp.CreateItem(olMailItem) With OutlookMail .To = recipient .Subject = subject .HTMLBody = Replace(body, vbCrLf, "<br>") ' Chuyển xuống dòng If Len(attachPath) > 0 Then If Dir(attachPath) <> "" Then .Attachments.Add attachPath End If .Send ' Hoặc .Display để xem trước End With ws.Cells(i, "F").Value = "Đã gửi" ws.Cells(i, "F").Interior.Color = RGB(198, 239, 206) ' màu xanh nhạt
NextIteration: Next i MsgBox "Hoàn thành gửi email.", vbInformation
End Sub

Giải Thích Các Thành Phần

  • GetObject / CreateObject: Kiểm tra Outlook đã mở chưa, nếu chưa sẽ khởi tạo.
  • For loop: Duyệt từng dòng dữ liệu.
  • .HTMLBody: Cho phép định dạng HTML, giúp email hiển thị đẹp hơn.
  • .Attachments.Add: Thêm file đính kèm nếu đường dẫn hợp lệ.
  • .Send: Gửi ngay; thay bằng .Display nếu muốn người dùng kiểm tra trước khi gửi.
  • Ghi trạng thái: Cột F được cập nhật “Đã gửi” và tô màu xanh để dễ theo dõi.

3.3. Tùy Chỉnh Nội Dung Động (Placeholder)

Nếu muốn chèn tên người nhận vào nội dung, sử dụng placeholder {Tên} trong cột D và thay thế bằng VBA:

body = Replace(ws.Cells(i, "D").Value, "{Tên}", ws.Cells(i, "A").Value)

Bạn có thể mở rộng với nhiều placeholder: {Ngày}, {Số Đơn}, … chỉ cần lặp Replace.

3.4. Xử Lý Lỗi và Ghi Log

Dim errMsg As String
On Error GoTo ErrHandler ' ... trong vòng lặp Set OutlookMail = OutlookApp.CreateItem(olMailItem) With OutlookMail .To = recipient .Subject = subject .HTMLBody = body If Len(attachPath) > 0 Then If Dir(attachPath) <> "" Then .Attachments.Add attachPath Else errMsg = "File đính kèm không tồn tại: " & attachPath GoTo LogError End If End If .Send End With ws.Cells(i, "F").Value = "Đã gửi" ws.Cells(i, "F").Interior.Color = RGB(198, 239, 206) GoTo ContinueLoop LogError: ws.Cells(i, "F").Value = "Lỗi: " & errMsg ws.Cells(i, "F").Interior.Color = RGB(255, 199, 206)
ContinueLoop: errMsg = ""
Next i

Nhờ đó, mỗi dòng lỗi sẽ được ghi lại trong cột F, giúp bạn nhanh chóng xác định vấn đề.

3.5. Gửi Email Với Định Dạng Rich Text (HTML Template)

Bạn có thể lưu một file HTML mẫu (ví dụ template.html) và đọc nội dung vào VBA:

Function GetHTMLTemplate(filePath As String) As String Dim fso As Object, ts As Object Set fso = CreateObject("Scripting.FileSystemObject") Set ts = fso.OpenTextFile(filePath, 1, False, -1) ' -1 = Unicode GetHTMLTemplate = ts.ReadAll ts.Close
End Function

Sau đó trong vòng lặp:

Dim htmlTemplate As String
htmlTemplate = GetHTMLTemplate(ThisWorkbook.Path & "\template.html")
body = Replace(htmlTemplate, "{Tên}", ws.Cells(i, "A").Value)

Bạn có thể chèn hình ảnh, bảng dữ liệu, hoặc link tùy ý.

4. Gửi Email Từ Excel Bằng VBA + Gmail (SMTP)

4.1. Giới Thiệu Về SMTP

SMTP (Simple Mail Transfer Protocol) là giao thức tiêu chuẩn để gửi email. Đối với Gmail, máy chủ SMTP là smtp.gmail.com, cổng 587 (TLS) hoặc 465 (SSL). Để sử dụng, bạn cần:

  • Kích hoạt “Less secure apps” (đối với tài khoản không bật 2FA) hoặc tạo App Password nếu tài khoản có xác thực hai yếu tố.
  • Kiểm tra quota gửi: Gmail giới hạn 500 email/ngày cho tài khoản cá nhân.

4.2. Thêm Thư Viện CDO (Collaboration Data Objects)

VBA có sẵn thư viện Microsoft CDO for Windows 2000 (đôi khi cần thêm reference). Thực hiện:

  1. Trong VBA Editor → Tools → References.
  2. Tìm và tích vào Microsoft CDO for Windows 2000 Library.

4.3. Mã VBA Gửi Email Qua Gmail

Option Explicit Sub SendMailViaGmail() Dim i As Long, lastRow As Long Dim ws As Worksheet Dim cdoMsg As Object, cdoConfig As Object Dim strFrom As String, strTo As String, strSubject As String, strBody As String Dim strAttachment As String Set ws = ThisWorkbook.Sheets("Sheet1") lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row ' Thông tin tài khoản Gmail strFrom = "yourgmailaddress@gmail.com" Dim strPassword As String strPassword = "your_app_password" ' Nếu bật 2FA, dùng App Password For i = 2 To lastRow strTo = Trim(ws.Cells(i, "B").Value) If strTo = "" Then GoTo NextRow strSubject = ws.Cells(i, "C").Value strBody = ws.Cells(i, "D").Value strAttachment = ws.Cells(i, "E").Value Set cdoMsg = CreateObject("CDO.Message") Set cdoConfig = CreateObject("CDO.Configuration") With cdoConfig .Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 ' cdoSendUsingPort .Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com" .Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 587 .Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 ' basic .Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = strFrom .Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = strPassword .Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True .Fields.Update End With With cdoMsg Set .Configuration = cdoConfig .From = strFrom .To = strTo .Subject = strSubject .HTMLBody = Replace(strBody, vbCrLf, "<br>") If Len(strAttachment) > 0 Then If Dir(strAttachment) <> "" Then .AddAttachment strAttachment End If .Send End With ws.Cells(i, "F").Value = "Đã gửi" ws.Cells(i, "F").Interior.Color = RGB(198, 239, 206)
NextRow: Next i MsgBox "Hoàn thành gửi email qua Gmail.", vbInformation
End Sub

Lưu Ý Quan Trọng

  • App Password: Đối với tài khoản bật 2FA, vào Google Account → Security → App passwords → tạo mật khẩu cho “Mail”.
  • Chặn Spam: Nếu gửi số lượng lớn, Gmail có thể tạm thời chặn tài khoản. Hãy chia nhỏ danh sách hoặc sử dụng tài khoản G Suite (Google Workspace) có hạn mức cao hơn.
  • Thêm Địa Chỉ “Reply‑To”: Nếu muốn người nhận trả lời tới một email khác, thêm .ReplyTo = "support@yourdomain.com".

4.4. Gửi Email Đính Kèm Nhiều File

Nếu một hàng có nhiều file đính kèm (cách nhau bằng dấu ;), ta có thể tách và thêm lần lượt:

Cách Gửi Email Từ Excel
Cách Gửi Email Từ Excel
Dim arrAttach() As String, j As Long
If Len(strAttachment) > 0 Then arrAttach = Split(strAttachment, ";") For j = LBound(arrAttach) To UBound(arrAttach) If Dir(Trim(arrAttach(j))) <> "" Then .AddAttachment Trim(arrAttach(j)) End If Next j
End If

5. Sử Dụng Power Automate (Microsoft Flow) Để Gửi Email Tự Động

Power Automate là công cụ “no‑code/low‑code” của Microsoft, cho phép kết nối Excel Online (OneDrive hoặc SharePoint) với Outlook, Gmail, Teams, và hơn 300 dịch vụ khác.

5.1. Thiết Lập File Excel Trên OneDrive/SharePoint

  1. Lưu workbook lên OneDrive for Business hoặc SharePoint.
  2. Đảm bảo bảng dữ liệu được đánh dấu là Table (Insert → Table). Đặt tên Table, ví dụ tblMailList.

5.2. Tạo Flow Mới

  1. Truy cập https://flow.microsoft.com.
  2. Chọn Create → Automated cloud flow.
  3. Đặt tên “Gửi Email Từ Excel” và chọn trigger When a row is added, modified or deleted (Excel Online (Business)).
  4. Chọn Location, Document Library, File, và Table (tblMailList).

5.3. Thêm Hành Động Gửi Email

  • Outlook: Thêm action Send an email (V2).
  • Gmail: Nếu dùng Gmail, chọn Gmail → Send email (cần kết nối tài khoản Gmail).

Trong trường To, Subject, Body, sử dụng dynamic content từ trigger (các cột trong bảng). Ví dụ:

  • To: Email
  • Subject: Tiêu đề
  • Body: Nội dung (có thể dùng HTML)

5.4. Đính Kèm File

Nếu cột “File đính kèm” chứa đường dẫn trên OneDrive, thêm action Get file content rồi truyền File Content vào trường Attachments của email.

5.5. Kiểm Tra Và Kích Hoạt

  • Lưu flow, bật Run thử bằng cách thêm một dòng mới vào bảng Excel.
  • Kiểm tra hộp thư nhận để xác nhận email đã tới.
  • Nếu có lỗi, vào Run History để xem chi tiết.

5.6. Lợi Ích So Với VBA

  • Không phụ thuộc vào Outlook được cài trên máy.
  • Có thể chạy trên server (không cần máy tính cá nhân mở Excel).
  • Ghi log tự động, dễ quản lý và audit.
  • Có thể tích hợp thêm các bước: lưu log vào SharePoint, gửi thông báo Teams, cập nhật trạng thái trong Excel.

6. Bảo Mật, Quản Lý Lỗi và Tối Ưu Hiệu Suất

6.1. Bảo Mật Thông Tin Đăng Nhập

  • Không nên lưu mật khẩu trực tiếp trong mã VBA. Thay vào đó:
  • Sử dụng Windows Credential Manager: Lưu username/password và đọc bằng VBA qua CredentialManager (cần thư viện bên thứ ba).
  • Mã hoá: Mã hoá password bằng Base64 hoặc thuật toán AES, lưu chuỗi đã mã hoá và giải mã khi cần.
  • Prompt người dùng: Sử dụng InputBox hoặc UserForm để nhập mật khẩu mỗi khi chạy macro.

6.2. Giới Hạn Số Lượng Gửi

  • Outlook: Tùy thuộc vào cấu hình server Exchange, thường có giới hạn 30‑100 email/phút.
  • Gmail: 500 email/ngày cho tài khoản cá nhân; 2,000 email/ngày cho G Suite.
  • Power Automate: Tùy plan, có giới hạn “run per month”. Đối với plan miễn phí, khoảng 750 runs/tháng.

Nếu danh sách quá lớn, nên chia thành các batch (ví dụ 100 email/mỗi lần) và chờ vài phút giữa các batch để tránh bị chặn.

6.3. Ghi Log Chi Tiết

  • Excel: Ghi thời gian gửi, ID message (nếu có), lỗi vào cột phụ.
  • Power Automate: Sử dụng Compose để tạo log và lưu vào một file CSV/SharePoint List.
  • VBA: Ghi log vào file text:
Sub WriteLog(txt As String) Dim fso As Object, ts As Object Set fso = CreateObject("Scripting.FileSystemObject") Set ts = fso.OpenTextFile(ThisWorkbook.Path & "\MailLog.txt", 8, True) ts.WriteLine Format(Now, "yyyy-mm-dd hh:nn:ss") & " - " & txt ts.Close
End Sub

Gọi WriteLog "Gửi tới " & recipient & " thành công" trong vòng lặp.

6.4. Tối Ưu Hiệu Suất

  • Turn off screen updating khi chạy macro:
Application.ScreenUpdating = False
Application.EnableEvents = False
  • Sử dụng With…End With để giảm số lần gọi đối tượng.
  • Tạo Outlook MailItem một lần và chỉ thay đổi thuộc tính nếu không cần tạo mới (đối với email giống nhau).

7. Các Trường Hợp Thực Tiễn

7.1. Gửi Báo Cáo Kết Quả Hàng Ngày

  • Dữ liệu: Kết quả bán hàng, KPI, số lượng đơn hàng.
  • Quy trình: Sử dụng macro VBA để tạo file Excel tóm tắt, lưu dưới dạng PDF (ExportAsFixedFormat), đính kèm và gửi tới quản lý.
  • Mẫu code:
Sub SendDailyReport() Dim reportPath As String reportPath = ThisWorkbook.Path & "\Report_" & Format(Date, "yyyymmdd") & ".pdf" ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=reportPath, Quality:=xlQualityStandard ' Sau đó gọi hàm SendMailViaOutlook với attachPath = reportPath
End Sub

7.2. Email Marketing Nhỏ (Newsletter)

  • Quy mô: 200‑500 khách hàng.
  • Nội dung: HTML newsletter, có hình ảnh và link.
  • Công cụ: Power Automate + Outlook hoặc Gmail để tránh giới hạn VBA.
  • Lưu ý: Thêm unsubscribe link để tuân thủ luật spam (CAN‑SPAM, GDPR).

7.3. Nhắc Nhở Hẹn Hò, Thanh Toán, Hợp Đồng

  • Trigger: Khi ngày hiện tại gần ngày đáo hạn (so sánh ngày trong Excel).
  • Flow: Sử dụng Power Automate với trigger “Recurrence” (hàng ngày) + “List rows present in a table”, lọc các bản ghi sắp hết hạn, gửi email nhắc nhở.
  • Lợi ích: Tự động giảm công việc thủ công, giảm rủi ro quên.

7.4. Thông Báo Lỗi Hệ Thống

  • Khi một macro trong Excel gặp lỗi, bạn có thể gửi email tự động cho bộ phận IT:
If Err.Number <> 0 Then Call SendErrorMail(Err.Description, Err.Number)
End If

Trong SendErrorMail, bao gồm thông tin chi tiết, thời gian, và file log đính kèm.

8. Tổng Kết

Việc gửi email từ Excel không còn là một công việc khó khăn hay tốn thời gian. Bằng cách:

  1. Chuẩn bị dữ liệu hợp lý (bảng có đầy đủ cột, không lỗi).
  2. Lựa chọn công cụ phù hợp: VBA + Outlook cho môi trường Windows truyền thống, VBA + Gmail cho trường hợp không có Outlook, hoặc Power Automate cho quy trình đám mây, không cần lập trình.
  3. Áp dụng các kỹ thuật bảo mật (không lưu mật khẩu thô, sử dụng App Password, mã hoá).
  4. Quản lý lỗi và log để dễ dàng khắc phục và audit.
  5. Tối ưu hiệu suất (batch, tắt screen updating, giới hạn gửi).

Bạn sẽ có thể tự động hoá mọi quy trình gửi email: từ báo cáo nội bộ, thông báo nhắc nhở, tới chiến dịch email marketing. Hãy bắt đầu triển khai ngay trong dự án của mình, tùy chỉnh mã nguồn theo nhu cầu thực tế và luôn kiểm tra kỹ lưỡng trước khi chạy trên toàn bộ danh sách. Khi đã thành thạo, bạn sẽ thấy thời gian làm việc giảm đáng kể, đồng thời tăng tính chuyên nghiệp và độ tin cậy của tổ chức.

Chúc bạn thành công trong việc tự động hoá email từ Excel!

⚠️
LƯU Ý QUAN TRỌNG: Miễn trừ trách nhiệm: Mặc dù chúng tôi luôn nỗ lực để đảm bảo tính chính xác và cập nhật của thông tin, nhưng các quy định về giáo dục và tuyển sinh có thể thay đổi theo thời gian. BigSchool không chịu trách nhiệm về bất kỳ sai sót nào hoặc kết quả phát sinh từ việc sử dụng thông tin trên trang này. Độc giả nên liên hệ trực tiếp với nhà trường hoặc cơ quan chức năng để có thông tin mới nhất. Ngoài ra, BigSchool tuyệt đối không bán sản phẩm, khóa học hay cung cấp dịch vụ được nhắc đến trong bài.

Viết một bình luận