fx Practical VBA Projects
ENहिन्दी

Outlook से अटैचमेंट के साथ ऑटोमेटेड ईमेल

⏱ 15 min

आप क्या सीखेंगे

  • ज़रूरतें — पहले पढ़ें
  • सबसे छोटा चलने वाला उदाहरण
  • अटैचमेंट के साथ मेल मर्ज

समझिए

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 (फ़ॉर्मेटिंग खो जाती है)। ईमेल मैक्रो में फ़ाइल का नाम एक्सपोर्ट मैक्रो से मेल न खाना।

अभ्यास

mediumलेसन 2 की अपनी PDF और 3 टेस्ट ग्राहकों (अपने ही ईमेल पते) के साथ EmailStatements को Display मोड में चलाएँ, सिग्नेचर और अटैचमेंट जाँचें, फिर एक भेजें। एक CC जोड़ें, और ऐसी जाँच जोड़ें जो उन रो को छोड़ दे जिनका D पहले से "Sent" से शुरू होता है।
.Display में हर draft जाँचें, signature से पहले body जोड़ें, सही PDF attach करें और .CC रखें। Sent से शुरू status तथा missing attachment वाली rows छोड़ें। example.invalid को अपने test inbox से बदलें। केवल reviewed test message भेजें और successful send call के बाद ही Sent लिखें।

प्रश्नोत्तरी

कौन-से Outlook वर्ज़न इस मैक्रो को सपोर्ट करते हैं?
Windows पर classic Outlook डेस्कटॉप
सिग्नेचर कैसे बचाएँ?
पहले .Display करें, फिर अपना टेक्स्ट .HTMLBody से पहले जोड़ें
Status कॉलम क्यों रखें?
लॉग के रूप में और दो बार भेजने से बचने के लिए
Outlook से अटैचमेंट के साथ ऑटोमेटेड ईमेल · हिंदी | ExcelWalaa