Как отправить персональные письма из Excel через Outlook

Безопасный VBA-макрос создаёт персональные письма Outlook из Excel. Сначала показывает черновики и не отправляет письма автоматически.

В таблице укажите имя в A, адрес в B, тему в C и текст в D. Безопасный вариант макроса открывает каждое письмо для проверки и ничего не отправляет автоматически.

Рабочий макрос

Option Explicit

Sub CreatePersonalEmails()
    Const olMailItem As Long = 0
    Dim ws As Worksheet, lastRow As Long, r As Long
    Dim outlookApp As Object, mail As Object
    Dim recipient As String

    Set ws = ThisWorkbook.Worksheets("Рассылка")
    lastRow = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row
    Set outlookApp = CreateObject("Outlook.Application")

    For r = 2 To lastRow
        recipient = Trim$(CStr(ws.Cells(r, "B").Value))
        If recipient <> "" And InStr(1, recipient, "@") > 1 Then
            Set mail = outlookApp.CreateItem(olMailItem)
            With mail
                .To = recipient
                .Subject = CStr(ws.Cells(r, "C").Value)
                .Body = "Здравствуйте, " & CStr(ws.Cells(r, "A").Value) & "!" & vbCrLf & vbCrLf & _
                        CStr(ws.Cells(r, "D").Value)
                .Display
            End With
            ws.Cells(r, "E").Value = "Создан черновик"
        Else
            ws.Cells(r, "E").Value = "Проверьте адрес"
        End If
    Next r
End Sub

Подготовить таблицу

Создайте лист Рассылка и заголовки: Имя, Email, Тема, Текст, Статус. Не смешивайте несколько адресов в одной ячейке. Сохраните файл как XLSM.

Почему используется Display

Метод .Display показывает письмо пользователю. Метод .Send отправляет его сразу и опасен при первой проверке. Сначала протестируйте одну строку на собственном адресе, проверьте подпись, переносы и вложения.

HTML-письмо

Для форматирования используют .HTMLBody, но любые значения из таблицы нужно экранировать, иначе символы <, > и & повредят разметку. Для простого уведомления обычный .Body надёжнее.

Вложения

Полный путь можно хранить в столбце F и перед добавлением проверять Dir$(path). Не отправляйте письмо, если обязательный файл отсутствует.

Ограничения и безопасность

Outlook может показывать предупреждения, а корпоративная политика — запрещать программную отправку. Соблюдайте согласия получателей и правила обработки персональных данных. Этот способ подходит для адресной рабочей переписки, а не для нежелательной массовой рассылки.

Когда нужен отдельный процесс

Если писем сотни, нужны очередь, ограничение скорости, журнал, повтор после ошибок и контроль дублей. Такой процесс лучше реализовать как управляемую автоматизацию, а не заменять .Display на .Send.

Нужно автоматизировать похожую задачу?

Пришлите пример Excel или Word и описание результата — оценю подходящий вариант.