समझिए
1. ज़रूरतें — पहले पढ़ें
- Windows + classic Outlook डेस्कटॉप ऐप, आपके ईमेल अकाउंट के साथ सेट।
- नया Outlook for Windows और Outlook on the web, VBA/COM ऑटोमेशन सपोर्ट नहीं करते। अगर आपके PC पर नया Outlook है, तो classic Outlook पर वापस जाएँ, या इसकी जगह Power Automate (मॉड्यूल 6) या Python (मॉड्यूल 5) इस्तेमाल करें।
- Mac Outlook भी इसे सपोर्ट नहीं करता।
- आपकी कंपनी सुरक्षा प्रॉम्प्ट दिखा सकती है या प्रोग्राम से भेजना ब्लॉक कर सकती है। पहले एक ईमेल से जाँचें।
2. सबसे छोटा चलने वाला उदाहरण
Sub SendTestMail()
Dim olApp As Object, mail As Object
Set olApp = CreateObject("Outlook.Application")
Set mail = olApp.CreateItem(0) ' 0 = mail item
With mail
.To = "rahul@example.com"
.Subject = "Test from Excel"
.Body = "Hello! This email was created by a macro."
.Display ' opens it for review
End With
End Sub
.Display ईमेल खोल देता है ताकि आप जाँच सकें। सीधे भेजने के लिए .Send से बदलें।
CreateObject (late binding) बिना कोई रेफ़रेंस जोड़े चलता है, इसलिए फ़ाइल अलग Outlook वर्ज़न वाले दूसरे PC पर भी चलती है।
3. अटैचमेंट के साथ मेल मर्ज
लेसन 2 की Customers लिस्ट और उससे बनी PDF इस्तेमाल करें।
शीट "Customers": A = CustomerID, B = Name, C = Email, D = Status (मैक्रो भरता है)।
Option Explicit
Sub EmailStatements()
Const SEND_NOW As Boolean = False ' False = Display for review, True = Send
Dim ws As Worksheet, olApp As Object, mail As Object
Dim lastRow As Long, i As Long, sent As Long
Dim folder As String, pdfPath As String
Dim custID As String, custName As String, email As String
On Error GoTo ErrHandler
Set ws = ThisWorkbook.Worksheets("Customers")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
folder = ThisWorkbook.Path & Application.PathSeparator & "PDF_" & Format(Date, "yyyy-mm")
Set olApp = CreateObject("Outlook.Application")
For i = 2 To lastRow
custID = Trim(CStr(ws.Cells(i, "A").Value))
custName = Trim(CStr(ws.Cells(i, "B").Value))
email = Trim(CStr(ws.Cells(i, "C").Value))
pdfPath = folder & Application.PathSeparator & custID & "_" & custName & ".pdf"
If email = "" Or InStr(email, "@") = 0 Then
ws.Cells(i, "D").Value = "Skipped: no valid email"
ElseIf Dir(pdfPath) = "" Then
ws.Cells(i, "D").Value = "Skipped: PDF not found"
Else
Set mail = olApp.CreateItem(0)
With mail
.To = email
.Subject = "Account statement - " & Format(Date, "mmmm yyyy")
.Display ' loads your default signature
.HTMLBody = "<p>Dear " & custName & ",</p>" & _
"<p>Please find attached your statement for " & Format(Date, "mmmm yyyy") & ".</p>" & _
"<p>Regards,</p>" & .HTMLBody ' text first, then signature
.Attachments.Add pdfPath
If SEND_NOW Then .Send
End With
ws.Cells(i, "D").Value = IIf(SEND_NOW, "Sent ", "Drafted ") & Format(Now, "dd-mmm hh:mm")
sent = sent + 1
End If
Next i
MsgBox sent & " emails " & IIf(SEND_NOW, "sent.", "opened for review."), vbInformation
Exit Sub
ErrHandler:
MsgBox "Stopped at row " & i & ": " & Err.Description, vbExclamation
End Sub
4. ज़रूरी बातें
- पहले SEND_NOW = False। चलाएँ, 2–3 ईमेल देखें, बिना भेजे बंद करें। सब सही हो तो True करें।
- सिग्नेचर की तरकीब:
.Displayआपका डिफ़ॉल्ट सिग्नेचर.HTMLBodyमें लोड करता है; हम अपना टेक्स्ट उससे पहले रखते हैं। - Status कॉलम D आपका लॉग है: किसे गया, कौन छूटा और क्यों। पहले से "Sent" वाली रो फ़िल्टर करके सुरक्षित रूप से दोबारा चलाएँ।
- CC / BCC:
.CC = "accounts@yourshop.com"जोड़ें। - कई अटैचमेंट: हर फ़ाइल के लिए एक बार
.Attachments.Add।
5. एक अच्छे भेजने वाले बनें
Outlook और आपके मेल प्रोवाइडर की भेजने की सीमा होती है। ~50 से ज़्यादा ईमेल के लिए हर भेजने के बीच छोटा ठहराव जोड़ें:
Application.Wait Now + TimeValue("00:00:02")
और सिर्फ़ उन्हीं लोगों को ईमेल करें जो आपसे सुनने की उम्मीद रखते हैं।
आम गलतियाँ
पूरी लिस्ट पर .Send से टेस्ट करना। नया Outlook इस्तेमाल करना (COM सपोर्ट नहीं)। सिग्नेचर के साथ सादा .Body (फ़ॉर्मेटिंग खो जाती है)। ईमेल मैक्रो में फ़ाइल का नाम एक्सपोर्ट मैक्रो से मेल न खाना।