Lost your password?


Хитрости »
Основные понятия (27)
Сводные таблицы и анализ данных (10)
Графики и диаграммы (5)
Работа с VB проектом (12)
Power BI и Power Query (23)
Условное форматирование (5)
Списки и диапазоны (5)
Макросы(VBA процедуры) (68)
Разное (43)
Баги и глюки Excel (5)

Как отправить письмо из Excel?

Прежде чем начать читать статью прошу принять к сведению объявление: используйте СВОИ АДРЕСА ЭЛ.ПОЧТЫ при тестировании кодов. Не надо отсылать письма на указанные в статье e-mail адреса- это все приходит мне на почту. Помимо этого Вы сами не сможете понять работает или нет, т.к. письма придут мне, а не Вам.
Спасибо за понимание
P.S. А если написанное выше Вы все же проигнорировали и отправили письмо на мои адреса электронной почты - это означает, что Вы соглашаетесь с тем, что вся информация внутри письма, включая вложения, может быть использована мной без ограничений в личных целях.

Отправить письмо из Excel можно несколькими способами, в том числе и через написание кода в VBA.


Отправка через меню Excel
Отправку без кода осуществить достаточно просто:

  • Excel 2003: Файл(File) -Отправить(Send To) -Сообщение(Mail Recipient)
    и выбрать способ отправки:

    • Сообщение(Mail Recipient) - создается сообщение в программе по умолчанию для отправки электронных писем
    • Сообщение (для ознакомления) (Mail Recipient for Review) - вполне интересный вариант. Перед отправкой для книги включается отслеживание изменений(Сервис(Tools)-Исправления(Track changes)). Можно воспользоваться этим методом, чтобы отправить получателю для внесения им изменений, а после отследить их(Сервис -Исправления -Выделить исправления(Highlight changes))
    • Сообщение (как вложение)(Mail Recipient as attachment) - создается сообщение в программе по умолчанию для отправки электронных писем, в которое вложением вкладывается активная книга целиком
    • По маршруту(Routing Recipient) - практически тоже самое, что и Сообщение (для ознакомления) (Mail Recipient for Review) с той разницей, что письмо с вложением пересылается как эстафета от одного получателя к другому. После этого так же можно отследить изменения, внесенные каждым пользователем
    • Папка Exchange(Exchange folder) - активная книга автоматически сохраняется в заданную папку общего сервера Microsoft Exchange. Доступ к этой книге будет открыт всем участникам рабочей группы
    • Факс пользователю службы факсов интернета(Fax) - отправляет содержимое книги по факсу указанным получателям. Для использования данной возможности должна быть установлена служба факсов

     

  • Excel 2007: Кнопка Офис -Отправить(Send) -Сообщение(E-mail)
  • Excel 2010: Файл(File) -Сохранить и отправить(Save & Send) -Отправить(Send Using E-mail)
  • Далее выбирается способ отправки:

    • Как вложение(Send as attachment) - будет автоматически запущена почтовая программа по умолчанию и создано новое письмо, в которое уже будет вложен файл книги, из которой была вызвана команда
    • Как ссылку(Send link) - доступно, только если файл находится на сетевом ресурсе. После нажатия будет создано новое письмо в почтовой программе по умолчанию, в тело которого будет вставлена ссылка на книгу
    • Как PDF(Send as PDF) - файл будет автоматически сохранен в формате PDF, далее будет создано новое письмо в почтовой программе по умолчанию и файл PDF будет вставлен в письмо
    • Как XPS(Send as XPS) - файл будет автоматически сохранен в формате PDF, далее будет создано новое письмо в почтовой программе по умолчанию и файл PDF будет вставлен в письмо
    • Отправить как факс через интернет(Send as internet fax) - если у вас на ПК установлена служба работы с факсами и есть возможность отправлять и получать факсы на ПК - то данная команда отправит данные активного листа файла как факс


Простая отправка книги через VBA без Outlook
Описанные выше действия можно выполнить так же кодом(так же будет использоваться программа, установленная по умолчанию для отправки писем):

Sub SendMailStandart()
    ActiveWorkbook.SendMail "mail1@excel-vba.ru", "Тема письма"
End Sub

Также можно указать несколько получателей:

Sub SendMailStandart_MassRecipients()
    ActiveWorkbook.SendMail Array("mail1@excel-vba.ru", "mail2@excel-vba.ru"), "Тема письма"
End Sub

Внутри скобок Array можно в кавычках через запятую указать достаточное количество получателей.
Данный метод универсален, но работает только с активным файлом. Нельзя выбрать файл с диска и отправить как вложение. Кроме того, нельзя отправить более одного файла разом и указать текст письма.
Поэтому очень часто на форумах возникает вопрос как отправить письмо из Excel кодом с указанием темы, текста и вложения.
Есть несколько вариантов:



Отправить письмо через Outlook кодом VBA

Option Explicit
 
Sub Send_Mail()
    Dim objOutlookApp As Object, objMail As Object
    Dim sTo As String, sSubject As String, sBody As String, sAttachment As String
 
    Application.ScreenUpdating = False
    On Error Resume Next
    'пробуем подключиться к Outlook, если он уже открыт
    Set objOutlookApp = GetObject(, "Outlook.Application")
    Err.Clear 'Outlook закрыт, очищаем ошибку
    If objOutlookApp Is Nothing Then
        Set objOutlookApp = CreateObject("Outlook.Application")
    End If
    'раскомментировать строку, если в Outlook несколько учетных записей и нужно подключиться к конкретной(только если Outlook закрыть)
    '   [параметры]: Session.Logon "имя профиля","пароль",[показывать окно выбора профиля], [запускать в новой сессии]
    'objOutlookApp.Session.Logon "profile","1234",False, True
    Set objMail = objOutlookApp.CreateItem(0)   'создаем новое сообщение
    'если не получилось создать приложение или экземпляр сообщения - выходим
    If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub
 
    sTo = "AddressTo@mail.ru"    'Кому(можно заменить значением из ячейки - sTo = Range("A1").Value)
    sSubject = "Автоотправка"    'Тема письма(можно заменить значением из ячейки - sSubject = Range("A2").Value)
    sBody = "Привет от Excel-VBA"    'Текст письма(можно заменить значением из ячейки - sBody = Range("A3").Value)
    sAttachment = "C:\Temp\Книга1.xls"    'Вложение(полный путь к файлу. Можно заменить значением из ячейки - sAttachment = Range("A4").Value)
 
    'создаем сообщение
    With objMail
        .To = sTo 'адрес получателя
        .CC = "" 'адрес для копии
        .BCC = "" 'адрес для скрытой копии
        .Subject = sSubject 'тема сообщения
        .Body = sBody 'текст сообщения
        '.HTMLBody = sBody 'если необходим форматированные текст сообщения(различные шрифты, цвет шрифта и т.п.)
        'добавляем вложение, если файл по указанному пути существует(dir проверяет это)
        If sAttachment <> "" Then
            If Dir(sAttachment, 16) <> "" Then
                .Attachments.Add sAttachment 'просто вложение
                'чтобы отправить активную книгу вместо sAttachment указать ActiveWorkbook.FullName
            End If
        End If
        .Send 'Display, если необходимо просмотреть сообщение, а не отправлять без просмотра
    End With
 
    Set objOutlookApp = Nothing: Set objMail = Nothing
    Application.ScreenUpdating = True
End Sub

Этот код отправляет одно письмо и одно вложение за раз. Но если несколько раз вызвать метод .Attachments.Add, то можно добавить еще файлы:

.Attachments.Add "C:\Temp\Книга1.xlsx"
.Attachments.Add "C:\Temp\Книга2.xlsx"
.Attachments.Add "C:\Documents\Report.rar"

Строка:

objOutlookApp.Session.Logon "user","1234",False, True

имеет особое значение. По сути она нужна только в тех случаях, когда в Outlook настроено несколько профилей(не путать с учетными записями) и запускать нужно от конкретного. Если профиль только один или не указан, то Outlook запускается с профилем по умолчанию. Для этого строку нужно записать без параметров(так же можно записать эту строку, если Outlook при попытке создания письма выдает ошибку профиля):

objOutlookApp.Session.Logon

Важно помнить: пути для файлов в качестве вложений должны содержать полный путь до файла, включая его имя и расширение: C:\Documents\Report.rar. При указании только имени Report.rar или пути без расширения (C:\Documents\Report) ошибки не будет, но вложения не будут помещены в сообщения и адресату отправится письмо без вложений.

Этот код создает сообщение, но есть маленький нюанс - если в Outlook настроено добавление подписей в новые сообщения - то созданные кодом VBA письма игнорирует эту настройку(особенность Outlook, так назовем). Поэтому, если необходимо отправлять письма с подписью, то ознакомьтесь со статьей: Вставить в письмо подпись из Outlook через VBA
В этой же статье можно посмотреть пример составления письма с форматированным текстом.


 

Отправить письма через Outlook с картинкой в теле письма

Sub Send_Mail_With_Picture()
    Dim objOutlookApp As Object, objMail As Object
    Dim sTo As String, sSubject As String, sBody As String, sAttachment As String, sPicture As String
 
    Application.ScreenUpdating = False
    On Error Resume Next
    'пробуем подключиться к Outlook, если он уже открыт
    Set objOutlookApp = GetObject(, "Outlook.Application")
    Err.Clear 'Outlook закрыт, очищаем ошибку
    If objOutlookApp Is Nothing Then
        Set objOutlookApp = CreateObject("Outlook.Application")
    End If
    'objOutlookApp.Session.Logon "user","1234",False, True
    Set objMail = objOutlookApp.CreateItem(0)   'создаем новое сообщение
    'если не получилось создать приложение или экземпляр сообщения - выходим
    If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub
 
    sTo = "AddressTo@mail.ru"    'Кому(можно заменить значением из ячейки - sTo = Range("A1").Value)
    sSubject = "Автоотправка"    'Тема письма(можно заменить значением из ячейки - sSubject = Range("A2").Value)
    sBody = "Привет от Excel-VBA"    'Текст письма(можно заменить значением из ячейки - sBody = Range("A3").Value)
    sAttachment = "C:\Temp\Книга1.xls"    'Вложение(полный путь к файлу. Можно заменить значением из ячейки - sAttachment = Range("A4").Value)
    sPicture = "C:\Документы\Изображения\Excel_vba_ru.png" 'если надо вставить в письмо картинку
    'создаем сообщение
    With objMail
        .To = sTo 'адрес получателя
        .CC = "" 'адрес для копии
        .BCC = "" 'адрес для скрытой копии
        .Subject = sSubject 'тема сообщения
'        .Body = sBody 'текст сообщения без форматирования
        .HTMLBody = sBody 'если необходим форматированные текст сообщения(различные шрифты, цвет шрифта и т.п.)
        'чтобы картинка была видна внутри сообщения - надо её сначала добавить как вложение
        'если картинка по указанному пути существует(dir проверяет это)
        If Dir(sPicture, 16) <> "" Then
            If Dir(sPicture, 16) <> "" Then
                .Attachments.Add sPicture
                'теперь вставляем код картинки
                .HTMLBody = .HTMLBody & "<p>Картинка в письме</p>" & "<img src=cid:" & Replace(Dir(sPicture, 16), " ", "%20") & ">" ' & " height=240 width=180>"
            '" height=240 width=180>" - если нужны размеры картинки
            End If
        End If
        'добавляем вложение, если файл по указанному пути существует(dir проверяет это)
        If sAttachment <> "" Then        
            If Dir(sAttachment, 16) <> "" Then
                .Attachments.Add sAttachment 'просто вложение
            End If
        End If
        .Send 'Display, если необходимо просмотреть сообщение, а не отправлять без просмотра
    End With
 
    Set objOutlookApp = Nothing: Set objMail = Nothing
    Application.ScreenUpdating = True
End Sub

Этот код отправляет одно письмо и вставляет одну картинку. За это отвечает строка

"<img src=cid:" & Replace(Dir(sPicture, 16), " ", "%20") & ">"

Если картинку надо вложить с заранее указанными размерами, то строка будет выглядеть так:

"<img src=cid:" & Replace(Dir(sPicture, 16), " ", "%20") & " height=240 width=180>"
'height - высота
'width  - ширина

Если надо добавить несколько картинок, то метод .Attachments.Add sPicture надо будет вызвать столько раз, сколько картинок(для каждого свой путь к картинке).

Важно помнить: пути для картинок должны содержать полный путь до файла, включая его имя и расширение: C:\Документы\Изображения\Excel_vba_ru.png. При указании только имени Excel_vba_ru.png или пути без расширения (C:\Документы\Изображения\Excel_vba_ru) ошибки не будет, но картинка не будет вставлена, а вместо неё скорее всего будет текст "Ошибка загрузки картинки!" или пустой квадрат вместо реальной картинки.


 

Массовая рассылка писем по адресам
Так же можно сделать нечто вроде рассылки, организовав цикл по ячейкам. Предположим, что в столбце А записаны адреса, в столбце В тема, в столбце С текст сообщения, в столбце D путь к вложениям:
Таблица адресов
Тогда можно применить следующий код:

Sub Send_Mail_Mass()
    Dim objOutlookApp As Object, objMail As Object
    Dim sTo As String, sSubject As String, sBody As String, sAttachment As String
    Dim lr As Long, lLastR As Long
 
    Application.ScreenUpdating = False
    On Error Resume Next
    'пробуем подключиться к Outlook, если он уже открыт
    Set objOutlookApp = GetObject(, "Outlook.Application")
    Err.Clear 'Outlook закрыт, очищаем ошибку
    If objOutlookApp Is Nothing Then
        Set objOutlookApp = CreateObject("Outlook.Application")
    End If
    'произошла ошибка создания объекта - выход
    If Err.Number <> 0 Then Set objOutlookApp = Nothing: Set objMail = Nothing: Exit Sub
    'objOutlookApp.Session.Logon "user","1234",False, True
 
    lLastR = Cells(Rows.Count, 1).End(xlUp).Row
    'цикл от второй строки(начало данных с адресами) до последней ячейки таблицы
    For lr = 2 To lLastR
        Set objMail = objOutlookApp.CreateItem(0)   'создаем новое сообщение
        'создаем сообщение
        With objMail
            .to = Cells(lr, 1).Value 'адрес получателя
            .Subject = Cells(lr, 2).Value 'тема сообщения
            .Body = Cells(lr, 3).Value 'текст сообщения
            'вложение(если ячейка не пустая и путь к файлу указан правильно)
            If Cells(lr, 4).Value <> "" Then   
                If Dir(Cells(lr, 4).Value, 16) <> "" Then
                    .Attachments.Add Cells(lr, 4).Value
                End If
            End If
            .Send 'Display, если необходимо просмотреть сообщение, а не отправлять без просмотра
        End With
    Next lr
 
    Set objOutlookApp = Nothing: Set objMail = Nothing
    Application.ScreenUpdating = True
End Sub

Скачать пример массовой рассылки:

  Массовая рассылка писем через Outlook.xls (60,0 KiB, 7 454 скачиваний)

При использовании этих кодов есть один недостаток: очень часто при программной отправке писем Outlook выдает окно с запросом подтверждения отправки. Сообщение может быть трех видов:

  • Программа пытается получить доступ к адресам электронной почты, хранящимся в Outlook. Если вы этого не ожидаете, нажмите кнопку "Запретить" и проверьте наличие последних обновлений для антивирусной программы.
  • Программа пытается отправить сообщение от вашего имени. Если вы этого не ожидаете, нажмите кнопку "Запретить" и проверьте наличие последних обновлений для антивирусной программы.
  • Программа пытается выполнить действие, которое может привести к отправке сообщения от вашего имени. Если вы этого не ожидаете, нажмите кнопку "Запретить" и проверьте наличие последних обновлений для антивирусной программы

Чтобы при программной отправке данных сообщений не появлялось, в версиях Outlook, начиная с 2007 можно отключить его настройками безопасности:

  • Outlook 2007: Меню-Параметры-Центр управления безопасностью-Программный доступ-установить Никогда не предупреждать о подозрительной активности (не рекомендуется)
  • Outlook 2010 и выше: Файл-Параметры-Центр управления безопасностью-Программный доступ-установить Никогда не предупреждать о подозрительной активности (не рекомендуется)

ВАЖНО: Если компьютер управляется администратором Microsoft Exchange или Microsoft Windows Active Directory Domain Services и администратором в качестве параметров по умолчанию установлен запрет на внесение изменений в параметры безопасности пользователями, возможность изменения данных настроек безопасности программного доступа будет недоступна.

Важно: сам код рассылки не имеет никаких ограничений по числу отправляемых сообщений. Но различные почтовые серверы могут устанавливать свои лимиты. Например, Gmail и Yandex могут заблокировать email, с которого ведется рассылка, если общее количество отправленных сообщений превышает 100 штук в день. Поэтому производить важные массовые рассылки рекомендуется с собственного SMTP-сервера.


 

Но так же при отправке файлов и писем часто необходимо не привязываться к конкретной почтовой программе. Ведь далеко не все ставят Outlook. Многие используют иные почтовые программы, например TheBat.

Отправка сообщения без использования Outlook - используем CDO

Option Explicit
 
Sub Send_Mail()
    Const CDO_Cnf = "http://schemas.microsoft.com/cdo/configuration/"
    Dim oCDOCnf As Object, oCDOMsg As Object
    Dim SMTPserver As String, sUsername As String, sPass As String, sMsg As String
    Dim sTo As String, sFrom As String, sSubject As String, sBody As String, sAttachment As String
    On Error Resume Next
    'sFrom – как правило совпадает с sUsername
    SMTPserver = "smtp.yandex.ru"    ' SMTPServer: для Mail.ru "smtp.mail.ru"; для Яндекса "smtp.yandex.ru"; для Рамблера "mail.rambler.ru"
    sUsername = "YourMail@mail.ru"    ' Учетная запись на сервере
    sPass = "1234"    ' Пароль к почтовому аккаунту
 
    If Len(SMTPserver) = 0 Then MsgBox "Не указан SMTP сервер", vbInformation, "www.Excel-VBA.ru": Exit Sub
    If Len(sUsername) = 0 Then MsgBox "Не указана учетная запись", vbInformation, "www.Excel-VBA.ru": Exit Sub
    If Len(sPass) = 0 Then MsgBox "Не указан пароль", vbInformation, "www.Excel-VBA.ru": Exit Sub
 
    sTo = "AddressTo@mail.ru"    'Кому
    sFrom = "YourMail@yandex.ru"    'От кого
    sSubject = "Автоотправка"    'Тема письма
    sBody = "Привет от Excel-VBA"    'Текст письма
    sAttachment = "C:/Temp/Книга1.xls"    'Вложение(полный путь к файлу)
 
    'Назначаем конфигурацию CDO
    Set oCDOCnf = CreateObject("CDO.Configuration")
    With oCDOCnf.Fields
        .Item(CDO_Cnf & "sendusing") = 2
        .Item(CDO_Cnf & "smtpauthenticate") = 1
        .Item(CDO_Cnf & "smtpserver") = SMTPserver
        'если необходимо указать SSL
        '.Item(CDO_Cnf & "smtpserverport") = 465 'для Яндекса и Gmail 465
        '.Item(CDO_Cnf & "smtpusessl") = True
        '=====================================
        .Item(CDO_Cnf & "sendusername") = sUsername
        .Item(CDO_Cnf & "sendpassword") = sPass
        .Update
    End With
    'Создаем сообщение
    Set oCDOMsg = CreateObject("CDO.Message")
    With oCDOMsg
        Set .Configuration = oCDOCnf
        .BodyPart.Charset = "koi8-r"
        .From = sFrom
        .To = sTo
        .Subject = sSubject
        .TextBody = sBody
        'Проверка наличия файла по указанному пути
        If Len(sAttachment) > 0 Then
            If Dir(sAttachment, 16) <> "" Then
                .AddAttachment sAttachment
            End If
        End If
        .Send
    End With
 
    Select Case Err.Number
    Case -2147220973: sMsg = "Нет доступа к Интернет"
    Case -2147220975: sMsg = "Отказ сервера SMTP"
    Case 0: sMsg = "Письмо отправлено"
    Case Else: sMsg = "Ошибка номер: " & Err.Number & vbNewline & "Описание ошибки: " & Err.Description
    End Select
    MsgBox sMsg, vbInformation, "www.Excel-VBA.ru"
    Set oCDOMsg = Nothing: Set oCDOCnf = Nothing
End Sub

Данный код отправляет письмо, используя объект CDO(Collaboration Data Objects - присутствует во всех версиях Windows) и от имени Вашей учетной записи(либо Яндекс, либо Мэйл, либо Рамблер либо др.).

  • SMTPserver - Каждый из приведенных выше сервисов имеет свой сервер для отправки сообщений(его можно посмотреть на сайте сервиса). В комментариях к коду я написал три самых распространенных, но если Вы используете какой-то другой, то просто посмотрите на его сайте настройки для Outlook и отыщите тот параметр, который отвечает за SMTPserver.
  • sUsername - это Ваш логин для входа в почтовый сервис. Думаю тут все понятно. Единственный момент - обязательно указывать e-mail именно в полном виде - YourMail@mail.ru, даже если для входа на сервис через браузер Вы используете только первую часть записи(YourMail). Если необходимо подставить в качестве отправителя псевдоним(чтобы получатель видел не просто адрес, а ассоциированное имя учетной записи), то указывать надо именно в формате псевдонима:
    sFrom = "Excel-vba <YourMail@yandex.ru>"

    Excel-vba - и есть псевдоним. А сам адрес должен указываться между знаками <>

  • sPass - пароль доступа к Вашей учетной записи, который Вы используете для входа в почту.

Это основные моменты. Поля Кому(sTo), От кого(sFrom),Тема письма(sSubject), Текст письма(sBody) и Вложение(sAttachment) думаю не нуждаются в расшифровке.
Так же стоит учесть пару важных моментов: если на почтовом сервере используется шифрование, то необходимо раскомментировать(убрать знак апострофа) эти строки:

.Item(CDO_Cnf & "smtpserverport") = 465
.Item(CDO_Cnf & "smtpusessl")

Иначе вместо отправки письма получим ошибку "Отказ сервера SMTP". Серверы Яндекс и Gmail требуют шифрования, а значит для них указанные выше строки должны быть активированы(т.е. раскомментированы). Номер порта указывается в описании настроек сервера и для каждого сервера может быть своим, поэтому если с указанием приведенного в коде порта("smtpserverport") письмо не отправляется - необходимо зайти в настройки почтового сервера и убедиться в правильности указания номера порта.

Чтобы использовать данный код вы можете либо просто скопировать его прямо со страницы, либо скачать файл. В файле программа немного упрощена к использованию - в ячейки листа вам необходимо будет внести поля: Кому(sTo), От кого(sFrom),Тема письма(sSubject), Текст письма(sBody) и Вложение(sAttachment) и выбрать SMTPserver. SMTPserver выбирается из выпадающего списка. Сам список является динамическим и расположен на листе "Settinngs". Там же расположены поля Учетной записи и Пароль, которые автоматически подставляются в необходимые поля на листе "Отправка". Т.к. список динамический Вы можете просто добавлять к уже имеющимся новые сервисы и потом просто выбирать их из списка. Так же в файле есть еще одна возможность - выбрать файл. Для этого надо просто нажать на кнопку и выбрать файл.

Скачать пример:

  Массовая рассылка писем через CDO - без Outlook.xls (64,0 KiB, 7 802 скачиваний)


Ввиду все более участившихся вопросов о том, как добавить к тексту письма картинку именно через CDO - описываю как это можно сделать. Я приведу лишь самый главный кусок кода - создание непосредственно сообщения. Весь остальной код остается таким же, как приведен выше.

With oCDOMsg
    Set .Configuration = oCDOCnf
    .From = sFrom
    .BodyPart.Charset = "windows-1251"
    .To = sTo
    .Subject = sSubject
    Set objbp = oCDOMsg.AddRelatedBodyPart("C:\Документы\Изображения\11.jpg", "11.jpg", 1)
    objbp.Fields.Item("urn:schemas:mailheader:Content-ID") = "<11.jpg>"
    objbp.Fields.Update
    If Len(sAttachment) > 0 Then
        If Dir(sAttachment, 16) <> "" Then
            .AddAttachment sAttachment
        End If
    End If
    'для вложения картинки письмо лучше формировать в формате HTML
    .HTMLBody = "<img src=""11.jpg""><br />" & sBody
    .Send
End With

Самый главный момент:
AddRelatedBodyPart

    C:\Документы\Изображения\11.jpg - указывается полный путь к файлу картинки на компьютере, включая расширение файла.
    11.jpg - указывается имя картинки с расширением. Это имя будет использовано внутри письма и именно его необходимо будет указать дальше в "urn:schemas:mailheader:Content-ID". И указывать обязательно в треугольных скобках: "<11.jpg>"
    внутри же самого письма в том месте, где должна отображаться картинки надо записать:

    "<img src=""11.jpg"">"

    в приведенном выше коде картинка вставляется в самом начале письма и после неё так же добавляется перенос на новую строку при помощи тэга

    <br />

Также см.:
Отправка листа/книги по почте
Вставить в письмо подпись из Outlook через VBA
Вставить в письмо Outlook таблицу Excel с форматированием
Сохранить вложения из Outlook в указанную папку
Как отправить письмо от другой учетной записи Outlook


Статья помогла? Поделись ссылкой с друзьями!
  Плейлист   Видеоуроки

Поиск по меткам

Access apple watch Multex Power Query и Power BI VBA управление кодами Бесплатные надстройки Дата и время Записки ИП Надстройки Печать Политика Конфиденциальности Почта Программы Работа с приложениями Разработка приложений Росстат Тренинги и вебинары Финансовые Форматирование Функции Excel акции MulTEx ссылки статистика
Обсуждение: 206 комментариев
  1. Alina:

    У меня массово не отправляет с вложениями. Помогите, пожалуйста!

    • Алина, как считаете сами - можно помочь по такому полному описанию проблемы? :) Мысль одна - неверный путь к вложениям. Других вариантов при таких исходных данных просто нет.

  2. Slava:

    Здравствуйте. Заинтересовал такой вот вопрос - при отправке средствами CDO прописывается параметр со ссылкой на сайт "http://schemas.microsoft.com/cdo/configuration/". Насколько я понял, этот сайт выступает как прокси сервер? Стало быть и тут мелкомягкие шпионят? Сканируют все письма или я параноик?

    • Это паранойя :) Здесь не идет речь о подключении через эти строки вообще к любому сайту. Это лишь ссылка на конфигурационную модель CDO. Можете даже попробовать отключить интернет от ПК и выполнить все строки ДО отправки письма - ошибок подключения не будет. Ошибка возникнет лишь в момент отправки. Никакие личные данные эти строки не собирают.

  3. Kirill Dukan:

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

    Sub Mail()
    Dim OutApp As Object 'To call Outlook Application
    Dim OutMail As Object 'To work with a new Outlook message
    Dim TempFilePath As String 'Path to store objects

    TempFilePath = Environ$("temp") & "\"

    Set OutApp = CreateObject("outlook.application") 'Create a new Microsoft Outlook session
    Set OutMail = OutApp.CreateItem(0) 'Create a new message

    With OutMail

    .Subject = ThisWorkbook.Sheets(1).Cells(2, 2) 'So called (by myself) head of letter.
    .To = ThisWorkbook.Sheets(1).Cells(2, 5).Value 'Who will receive our message.
    .Attachments.Add "J:\All Departments\Sales Reports\private\PDCA\Sales & CC flow report.xlsx"
    .Attachments.Add "J:\All Departments\Sales Reports\private\PDCA\Sales & CC flow report by dealers.xlsx"

    'First text part of the message.
    .HTMLBody = "" & "" _
    & "Dear colleagues,Please, find in attach report with current Sales and CC dealer by dealer."

    '== Insert an object 1 ==
    Call Get_Txt("Details") 'Time to create the image as a JPG file
    .Attachments.Add TempFilePath & "Details.jpg", 0, 0
    'Let us combine object 1 with a body of message
    .HTMLBody = .HTMLBody & "" & "<img src=Details.jpg'" & ""

    '== Insert an object 2 ==
    Call Get_Pic("Graphics") 'Time to create the image as a JPG file
    .Attachments.Add TempFilePath & "Graphics.jpg", 0, 0
    'Let us combine object 2 with a body of message
    .HTMLBody = .HTMLBody & "" & "<img src=Graphics.jpg'" & ""

    .HTMLBody = .HTMLBody & "Kind Regards,Sales Planning & Analysis Team"

    .Send 'Choose .Send if you want message to be sended automatically without displaing

    End With

    Set OutApp = Nothing
    Set OutMail = Nothing

    With Application 'Turning graphical options back
    .ScreenUpdating = True
    .EnableEvents = True
    .Calculation = xlCalculationAutomatic
    End With

    Windows("MACROS AUTOMAILING Sale&CC FOR TFO DO NOT OPEN!.xlsm").Activate
    Application.Quit

    End Sub

    Sub Get_Pic(NameFile As String)

    Dim PlaceX As Shape

    ThisWorkbook.Worksheets(2).Activate 'Selecting sheet with future screenshot

    Set PlaceX = ThisWorkbook.Worksheets(2).Shapes(1) 'Selecting exact place to catch
    PlaceX.CopyPicture

    With ThisWorkbook.Worksheets(2).ChartObjects.Add(PlaceX.Left, PlaceX.Top, PlaceX.Width, PlaceX.Height)
    .Activate
    .Chart.Paste
    .Chart.Export Environ$("temp") & "\" & NameFile & ".jpg", "JPG"
    End With

    Worksheets(2).ChartObjects(Worksheets(2).ChartObjects.Count).Delete

    Set PlaceX = Nothing

    End Sub

    Sub Get_Txt(NameFile As String)

    Dim PlaceY As Range

    ThisWorkbook.Worksheets(1).Activate 'Selecting sheet with future screenshot

    Set PlaceY = ThisWorkbook.Worksheets(2).Range("A3:J29") 'Selecting exact place to catch
    PlaceY.CopyPicture

    With ThisWorkbook.Worksheets(2).ChartObjects.Add(PlaceY.Left, PlaceY.Top, PlaceY.Width, PlaceY.Height)
    .Activate
    .Chart.Paste
    .Chart.Export Environ$("temp") & "\" & NameFile & ".jpg", "JPG"
    End With

    Worksheets(2).ChartObjects(Worksheets(2).ChartObjects.Count).Delete

    Set PlaceY = Nothing

    End Sub

  4. Kirill Dukan:

    Проблема решилась. Добавил .Display перед .Send

    Спасибо всем за помощь)

  5. Дмитрий:

    Здравствуйте!
    Попробовал запустить данный макрос ( Tips_Macro_SendMail_Mass.xls) на МАКЕ, не заработал!
    А вот ВИНДОВС запустил и все работает! В чем может быть проблема в отправке на МАКЕ??

    Спасибо!

    • Проблема на MACе в самом MACе. Макросы под Windows могут значительно отличаться от таковых на MAC, т.к. это принципиально различные ОС с различными способами организации взаимодействия приложений.

  6. Юрий Храпский:

    Добрый день, Дмитрий! Прочитал Вашу статью. Очень помогла в работе при рассылке писем. Однако остался вопрос — возможно ли много адресов вставлять не циклом, из таблицы Эксель, а получить доступ к уже готовым группам контактов в Outlook. Совсем не хочется выуживать МАССУ адресов из контактов, приводить их единообразный вид и, по сути, дублировать и поддерживать в актуальном состоянии группы контактов, которые и так уже есть в Outlook? Спасибо!

    • По идее для получения адресов из адресной книги можно делать что-то вроде этого:

      Dim oNamespace As NameSpace
      Dim oFolder As Object, oContactItem As Object,lr As Long
      Set oNamespace = Outlook.Application.GetNamespace("MAPI")
      Set oFolder = oNamespace.GetDefaultFolder(10) 'olFolderContacts
      For Each oContactItem In oFolder.Items
          lr = lr + 1
          Cells(lr, 1) = oContactItem.Email1Address 'записываем в ячейку
      Next

      как это в свой код оформить, полагаю, придумаете.
      Еще можно использовать Outlook.Application.Session.AddressLists("Глобальный список адресов").AddressEntries
      Все зависит от того, откуда контакты брать, в каком виде и что с ними потом делать. Пробуйте.

      • Юрий Храпский:

        Дмитрий, спасибо за пример. Но, к сожалению, проверить его не удается, т.к. компилятор сразу же начинает ругаться на строку №1 "Dim oNamespace As NameSpace". В сообщении об ошибке говорится: User-defined type not defined. Непонятно, почему не хочет определяться тип переменной.

  7. Артем:

    как в письмо Outlook в ставить Body не текст или содержимое ячейки а выделенный диапазон ячеек с их форматом то есть таблицу например: Range("A1:C5")

  8. Sla_0412:

    Дмитрий привет.
    Скачал макрос отправка с использованием CDO. Почему возникает ошибка?

    Ошибка номер -2147220977. Сервер отклонил один или несколько адресов получателей. Отклик сервера: 550 SMTP is available only with SSL or TLS connection enabled.

    • Sla_0412, даже если перевести текст ошибки станет понятно, что порт 550 может быть использован только при защищенном подключении с SSL или TLS. В статье показано как установить защиту SSL для письма.

      'если необходимо указать SSL
      '.Item(CDO_Cnf & "smtpserverport") = 465 'для Яндекса и Gmail 465
      '.Item(CDO_Cnf & "smtpusessl") = True

      просто раскомментируйте две строки с параметрами и все.

      • Sla_0412:

        Спасибо Дмитрий. Еще есть вопрос. С почты яндекса все работает замечательно. Но при отправке с @mail.ru получаю следующее сообщение об ошибке: Отказ сервера SMTP. У меня в The Bat настройки такие же как и в экселе. Только там работает отправка. (smtp.mail.ru, TLS порт 465)

  9. Надир:

    Дмитрий, добрый день!
    Спасибо за примеры работы с почтой.
    Подскажите, пожалуйста, как создать письмо с "голосованием"?

    • Надир, чтобы программно создать голосование, надо использовать свойство VotingOptions объекта MailItem. Оно должно представлять собой текст из значений, разделенный точками с запятыми. Что-то вроде:

      mail.Subject = "Какой Excel Вы используете в работе?"
      mail.VotingOptions = "2003; 2010; 2013; 2016; 365; Не использую Excel;"

      при этом тема письма должна быть темой голосования.

  10. asutos:

    Дмитрий, здравствуйте.
    При отправке письма через CDO, при коррекции поля B3 в примере (от кого) на отличное от электронного адреса (например "Сергей") возникает ошибка. Но мне нужно, чтобы получатель видел в поле от кого не мой мэйл адрес, а мое имя. Как реализовать это? И кроме того как отправить фото отправителя через SMTP? Огромное спасибо!

    • asutos, CDO не позволяет отправлять письма на основании имен, которые фигурируют в адресной книге, т.к. адресные книги являются частью почтовой программы и никак с CDO не связаны.

Поделитесь своим мнением

Комментарии, не имеющие отношения к комментируемой статье, могут быть удалены без уведомления и объяснения причин. Если есть вопрос по личной проблеме - добро пожаловать на Форум


Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Тренинги

Заказать
Юридическая информация

Использование материалов сайта

Политика Конфиденциальности

ИП Щербаков Дмитрий Валентинович
ОГРНИП: 318502700083307
ИНН: 504013350772

Наши партнеры

Перейти

Счетчики

Рейтинг@Mail.ru Яндекс.Метрика
© 2024 Excel для всех   Войти