Автоматическая отправка письма excel

  • Интернет
  • Рассылка почты

Пример макроса, отправляющего письма со вложениями из Excel через почтовый клиент Outlook:

Sub Отправить_Письмо_из_Outlook()
 
    'отправляем письмо без вложений
    res = SendEmailUsingOutlook("name@domain.ru", "Текст письма 1", "Тема письма 1")
    If res Then Debug.Print "Письмо 1 отправлено успешно" Else Debug.Print "Ошибка отправки"
 
 
    'отправляем письмо с 1 вложением
    attach$ = ThisWorkbook.FullName    ' прикрепляем текущий файл Excel
    res = SendEmailUsingOutlook("name@domain.ru", "Текст письма 2", "Тема письма 2", attach$)
    If res Then Debug.Print "Письмо 2 отправлено успешно" Else Debug.Print "Ошибка отправки"
 
 
    'отправляем письмо с несколькими вложениями
    Dim coll As New Collection    ' заносим в коллекцию список прикрепляемых файлов
    coll.Add "C:Documents and SettingsAdminРабочий столTyres.jpg"
    coll.Add "C:Documents and SettingsAdminРабочий столcalc.xls"
    coll.Add ThisWorkbook.FullName    ' прикрепляем текущий файл Excel

    res = SendEmailUsingOutlook("name@domain.ru", "Текст письма 3", "Тема письма 3", coll)
    If res Then Debug.Print "Письмо 3 отправлено успешно" Else Debug.Print "Ошибка отправки"
End Sub

Макрос использует функцию SendEmailUsingOutlook, которая:

  • принимает в качестве параметров адрес получателя письма, тему и текст письма, список вложений
  • запускает Outlook, формирует письмо, и отправляет его
  • возвращает TRUE, если отправка прошла успешно, или FALSE, если с отправкой почты вызникли проблемы

Код функции SendEmailUsingOutlook:

Function SendEmailUsingOutlook(ByVal Email$, ByVal MailText$, Optional ByVal Subject$ = "", _
                               Optional ByVal AttachFilename As Variant) As Boolean
    ' функция производит отправку письма с заданной темой и текстом на адрес Email
    ' с почтового ящика, настроенного в Outlook для отправки писем "по-умолчанию"
    ' Если задан параметр AttachFilename, к отправляемому письму прикрепляется файл (файлы)

    On Error Resume Next: Err.Clear
    Dim OA As Object: Set OA = CreateObject("Outlook.Application")
    If OA Is Nothing Then MsgBox "Не удалось запустить OUTLOOK для отправки почты", vbCritical: Exit Function
 
    With OA.CreateItem(0)   'создаем новое сообщение
        .To = Email$: .Subject = Subject$: .Body = MailText$
        If VarType(AttachFilename) = vbString Then .Attachments.Add AttachFilename
        If VarType(AttachFilename) = vbObject Then    ' AttachFilename as Collection
            For Each file In AttachFilename: .Attachments.Add file: Next
        End If
        For i = 1 To 100000: DoEvents: Next    ' без паузы не отправляются письма без вложений
        Err.Clear: .Send
        SendEmailUsingOutlook = Err = 0
    End With
    Set OutApp = Nothing
End Function

Пример макроса, с получением параметров письма из ячеек листа Excel: 

Sub Отправить_Письмо_из_Outlook()
    ' адрес получателя - в ячейке A1, текст письма - в ячейке A2
    res = SendEmailUsingOutlook(Cells(1, 1), Range("a2"), "Тема письма 1")
    If res Then Debug.Print "Письмо 1 отправлено успешно" Else Debug.Print "Ошибка отправки"
End Sub
  • 176222 просмотра

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.

Бывает нужно разослать большое количество писем списку контактов из таблицы в Excel.

Это может быть список потенциальных клиентов с мероприятия, выгрузка контактов из программы (1С, Битрикс24, amoCRM), просто список родственников, которые с нетерпением ждут от вас поздравления с праздником или уникального предложения.

Расскажу, как сделать это просто, быстро и бесплатно. Для решения задачи понадобится Excel, Word и Outlook из пакета Microsoft Office.

Итак, например, есть Excel таблица с данными клиентов (ФИО, компания, E-mail) и мы хотим отправить им персонализированное сообщение о предстоящих скидках.

Таблица Excel
Таблица Excel со списком клиентов

Колонка “Пол” потребуется для определения окончания “уважаемый” или “уважаемая”, ее я вычислил по формуле, если “Отчество” заканчивается на “ч” значит это мужчина, если нет — женщина:

=ЕСЛИ(ПРАВСИМВ(C2;1) = "ч"; "М";"Ж")

В новом документе Word наберём шаблон текста сообщения, которое будем отправлять. Вместо обращения, имени и названия компании оставим пока пустые места.

Запустим Мастер Слияния: вкладка Рассылки (Mailings), Начать слияние (Start Mail Merge), далее Пошаговый мастер слияния (Step-by-Step Merge Wizard).

Пошаговый мастер слияния
Запуск пошагового мастера слияния

Откроется мастер, состоящий из 6 этапов.

На перовом этапе выберем пункт Электронное сообщение (E-mail), так как хотим отправить наши сообщения по электронной почте.

Выбор типа документа
Выбор типа документа

На втором этапе нужно указать, какой документ будет использоваться в качестве шаблона, выберем Текущий документ (Current document).

Выбор документа
Выбор документа

Третий этап — выбор получателей. Так как список наших клиентов хранится в файле Excel, выбираем пункт Использование списка, жмем Обзор (Browse) и указываем наш файл.

Выбор получателей
Выбор получателей

Откроется окно Получатели слияния, в нем можно выбрать или отменить клиентов для которых делаем рассылку.

Получатели слияния
Выбор получателей рассылки

Четвертый этап — создание сообщения. Тут можно вставить данные из нашего файла Excel в шаблон сообщения, который мы подготовили.

Создание сообщения
Создание сообщения

Вставим Фамилию, Имя, Отчество и название компании в наш шаблон, для этого: установим курсор в текст сообщения куда хотим вставить значение поля Excel, нажмем Другие элементы, в открывшемся окне выберем поле, которое хотим вставить, и так для всех полей.

Вставка поля слияния
Вставка поля

Чтобы правильно указать обращение “уважаемый” для мужчин, и “уважаемая” для женщин создадим правило. Жмём кнопку Правила (Rules) на вкладке Рассылки (Mailings) и выберем пункт IF…THEN…ELSE.

Создание правила
Создание правила

В открывшемся окне укажем правило: если поле “Пол” равно “М” — вставить текст “уважаемый”, в противном случае — вставить текст “уважаемая”.

Настройка правила
Настройка правила

В итоге, после вставки полей должен получиться шаблон похожий на мой (вставленные поля выделил красным цветом).

Готовый шаблон слияния
Готовый шаблон слияния

На пятом этапе можно предварительно просмотреть результаты слияния. Для перехода между письмами служат кнопки со стрелками.

Просмотр сообщений
Предварительный просмотр сообщений

На завершающем 6 этапе нужно выбрать единственный пункт Электронная почта.

Завершение слияния
Завершение слияния

Затем в открывшемся окне указать тему отправляемых писем и выбрать в поле Кому столбец нашей таблицы Excel, в котором содержаться адреса получателей

Запуск рассылки
Запуск рассылки

После нажатия на кнопку ОК, Word автоматически подключится к вашему почтовому клиенту Outlook, поместит все сообщения в папку «Исходящие», после чего письма отправятся получателям.

Если вы хотите проверить письма перед отправкой, есть небольшая хитрость, нужно предварительно перевести Outlook в автономный режим Файл — Автономный режим. Письма останутся в исходящих, пока вы не выйдете из автономного режима и при необходимости вы сможете проверить или внести в них изменения.

На этом всё. Но вы можете поддержать проект. Даже небольшая сумма поможет нам писать больше полезных статей.

Если статья помогла или понравилась, пожалуйста поделитесь ей в соцсетях.

письмо excel

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

Данная статья описывает три способа отправки писем с помощью VBA в Excel. Вы можете скачать файл с примером отправки email с помощью VBA в Excel.

Отправить письмо в Excel с помощью VBA

Один из самых простых способов для автоматизации отправки почты с Excel заключается в вызове функции Create («ObjectOutlook.Application»). Данная функция возвращающает ссылку на ActiveX объект (в данном случает приложение Outlook), которое затем используется для создания и отправки электронной почты.

Чтобы проверить данный способ в работе, скопируйте и вставьте код ниже в VB редактор.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

Sub Send_Email_Using_VBA()
Dim Email_Subject, Email_Send_From, Email_Send_To, _
Email_Cc, Email_Bcc, Email_Body As String
Dim Mail_Object, Mail_Single As Variant
Email_Subject = «Попытка отправить письмо с помощью VBA»
Email_Send_From = «exceltipmail@gmail.com»
Email_Send_To = » exceltipmail@gmail.com «
Email_Cc = » exceltipmail@gmail.com «
Email_Bcc = » exceltipmail@gmail.com «
Email_Body = «Поздравляем!!!! Ваше письмо успешно отправлено !!!!»
On Error GoTo debugs
Set Mail_Object = CreateObject(«Outlook.Application»)
Set Mail_Single = Mail_Object.CreateItem(0)
With Mail_Single
.Subject = Email_Subject
.To = Email_Send_To
.cc = Email_Cc
.BCC = Email_Bcc
.Body = Email_Body
.send
End With
debugs:
If Err.Description <> «» Then MsgBox Err.Description
End Sub

В качестве напоминания: Когда вы пытаетесь отправить письмо вышеуказанным способом, система безопасности будет выдавать каждый раз предупреждающее окно, в котором будет говориться о том, что Программа пытается отправить сообщение от вашего имени… и возможности обойти этот шаг нет.

предупреждение об отправке письма

К счастью, существует еще два способа, с помощью которых данный вопрос может быть решен: первый – через использование CDO, второй – имитирующий использование событий нажатий клавиш клавиатуры.

Отправить письмо в Excel с помощью CDO

Что такое CDO? CDO является библиотекой объектов, которая предоставляет интерфейс Messaging Application Programming Interface (MAPI). CDO позволяет манипулировать обменом данных, и отправлять и получать сообщения.

Использование CDO может быть предпочтительно в случаях, когда вы хотите предотвратить появление вплывающих окон безопасности Программа пытается отправить сообщение от вашего имени… и следовательно, предотвратить задержку отправки сообщения.

В нашем примере мы используем функцию CreateObject («CDO.Message»). Важно отметить, что необходимо правильно установить конфигурацию SMTP сервера, чтобы не допустить появления ошибок Run-time error 2147220973(80040213) или sendUsing configuration value is invalid. Пример ниже настроен на отправку сообщений через почту Google (Gmail). Для других почтовых серверов, вам потребуется ввести свои значения SMTP-сервера и SMTP-порта.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

Sub CDO_Mail_Small_Text_2()
Dim iMsg As Object
Dim iConf As Object
Dim strbody As String
Dim Flds As Variant
Set iMsg = CreateObject(«CDO.Message»)
Set iConf = CreateObject(«CDO.Configuration»)
iConf.Load -1
Set Flds = iConf.Fields
With Flds
.Item(«https://schemas.microsoft.com/cdo/configuration/smtpusessl») = True
.Item(«https://schemas.microsoft.com/cdo/configuration/smtpauthenticate») = 1
.Item(«https://schemas.microsoft.com/cdo/configuration/sendusername») = «Полный адрес вашего GMail ящика»
.Item(«https://schemas.microsoft.com/cdo/configuration/sendpassword») = «GMail пароль»
.Item(«https://schemas.microsoft.com/cdo/configuration/smtpserver») = «smtp.gmail.com»
.Item(«https://schemas.microsoft.com/cdo/configuration/sendusing») = 2
.Item(«https://schemas.microsoft.com/cdo/configuration/smtpserverport») = 465
.Update
End With
strbody = «Поздравляем!!!! Ваше письмо успешно отправлено !!!!»
With iMsg
Set .Configuration = iConf
.To = «Почтовый адрес получателя»
.CC = «»
.BCC = «»
.From = «»«ВашеИмя»» <Reply@something.nl>»
.Subject = «Попытка отправить письмо с помощью CDO»
.TextBody = strbody
.Send
End With
End Sub

Обратите внимание, чтобы воспользоваться данным методом вам необходимо подключить библиотеку CDO в редакторе макросов Tool –> References.

Отправить письмо с помощью CDO

Отправить письмо в Excel с помощью Send Keys

Другой способ отправки email с помощью Excel – использование команды ShellExecute, которая выполняет любую программу в VBA. Команда ShellExecute используется для загрузки документа с соответствующей программой. По сути, вы создаете объект String (текстовые данные) и передаете его в качестве параметра для функции ShellExecute. Остальная часть операций выполняется в окнах. Автоматически определяется, какая программа связана с данным типом документа и используется для загрузки документа. Вы можете использовать функцию ShellExecute, чтобы открыть Internet Explorer, Word, Paint и множество других приложений. В коде ниже используется задержка в три секунды, чтобы убедиться, что отправляемое письмо корректно и для возможности предотвратить отправку, если вы вдруг нашли какие-нибудь недочеты.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

Sub Send_Email_Using_Keys()
Dim Mail_Object As String
Dim Email_Subject, Email_Send_To, Email_Cc, Email_Bcc, Email_Body As String
Email_Subject = «Попытка отправить письмо с помощью SendKeys»
Email_Send_To = «exceltipmail@gmail.com «
Email_Cc = «exceltipmail@gmail.com «
Email_Bcc = «exceltipmail@gmail.com «
Email_Body = «Поздравляем!!!! Ваше письмо успешно отправлено !!!!»
Mail_Object = «mailto:» & Email_Send_To & «?subject=» & Email_Subject & «&body=» & Email_Body & «&cc=» & Email_Cc & «&bcc=» & Email_Bcc
On Error GoTo debugs
ShellExecute 0&, vbNullString, Mail_Object, vbNullString, vbNullString, vbNormalFocus
Application.Wait (Now + TimeValue(«0:00:03»))
Application.SendKeys «^({ENTER})»
Application.SendKeys («{ENTER}»)
debugs:
If Err.Description <> «» Then MsgBox Err.Description
End Sub

Cкачать файл с примером отправки email с помощью VBA в Excel

Иногда, в процессе трудовой деятельности, приходится периодически отправлять различного рода сообщения однотипного характера по списку рассылки. Например, напоминание о предоставлении показаний приборов от разных абонентов, необходимо запрашивать каждое 25-тое число месяца. Это очень муторно и требует каждый раз создавать сообщение, вспоминать адреса электронной почты абонентов, набирать текст сообщения, тему. В принципе это занимает не так много времени, но зачем отвлекаться на то, что можно сделать автоматически использую автоматическую рассылку писем из Excel через Outlook?

В статье «Отправить почту через Excel с помощью макроса» мы разработали функцию, которая создает новое сообщение Outlook из экселя:


Function CreateNewMail(email As String, tema As String, text As String, Optional put_file As String)
'' Создать объект Outlook
Set Mail = CreateObject("outlook.application")
'' Создать новое сообщение
With Mail.CreateItem(olMailItem)
.To = email'' адрес электронной почты
.body = text'' текст сообщения
.Subject = tema '' тема сообщения
.Display '' показать окно сообщения перед отправкой
'' прикрепить файл (при необходимости)
If Len(put_file) <> 0 Then .Attachments.Add put_file
End With
End Function

Для автоматической рассылки писем из excel через outlook необходимо данную функцию доработать, удалив из оператора With строку .Display чтобы окно созданного сообщение не отображалось лишний раз не отвлекая, от более важных дел. А также в конце оператора With добавив строку .Send. Соответственно получится функция следующего вида:


Function CreateNewMail(email As String, tema As String, text As String, Optional put_file As String)
'' Создать объект Outlook
Set Mail = CreateObject("outlook.application")
'' Создать новое сообщение
With Mail.CreateItem(olMailItem)
.To = email'' адрес электронной почты
.body = text'' текст сообщения
.Subject = tema '' тема сообщения
'' прикрепить файл (при необходимости)
If Len(put_file) <> 0 Then .Attachments.Add put_file
.Send '' отправить сообщение
End With
End Function

Теперь необходимо объявить глобальную переменную Vremya для запуска и остановки таймера выполнения макроса рассылки писем из excel через outlook.


Public Vremya '' объявляем глобальную переменную времени, в которое необходимо выполнить макрос

Создаем макрос рассылки писем:


'' отправка сообщения в указанное время
Sub otMessage()
Vremya = Now + TimeSerial(0, 1, 0)'' к текущему времени прибавить одну минуту
Application.OnTime Vremya, "newMessage"'' выполнять отправку сообщения через каждую минуту
End Sub

Переменная Vremya может иметь любое значение вида «15.05.2020 13:23:14». Присваиваем ей значение текущего времени (получая его вызвав встроенную в vba функцию Now) прибавляя к нему одну минуту используя TimeSirial, синтаксис которого приведен ниже:


TimeSerial(ЧАСЫ, МИНУТЫ, СЕКУНДЫ)

На итог переменная Vremya равна текущей дате и времени плюс одна минута.

Дальше используя таймер Application.OnTime ЧЕРЕЗ_СКОЛЬКО_ЗАПУСТИТЬ_МАКРОС, ФУНКЦИЯ запускаем выполнение функции newMessage(). Здесь вводится дополнительная функция newMessage() ввиду невозможности передачи атрибутов используя OnTime.

Сама же функция newMessage() представляет собой следующее:


Function newMessage()
'' вызываем функцию (с передачей необходимых параметров) отправки нового сообщения
Message = CreateNewMail("planero.ru@yandex.ru;", "текст сообщения", "тема сообщения")
'' прекратить отправку сообщений через каждую минуту
Application.OnTime Vremya, "newMessage", , False
End Function

Первым делом вызываем функцию CreateNewMail с передачей ей необходимых атрибутов: адреса электронной почты, текста сообщения, темы сообщения. И после выполнения автоматической отправки письма останавливаем ранее запущенный таймер OnTime в процедуре otMessage.

В итоге получилось реализовать в vba автоматическую рассылку писем из excel через outlook, которая избавит от необходимости отправки однотипно-повторяющихся сообщений. А изменив переменную Vremya под себя, можно сделать рассылку в нужное вам время.

Сам макрос можно написать самому, а можно скачать уже готовый вариант по ссылке.

Комментарии 2

Если после выполнения макроса необходимо отправить в качестве вложения получившийся документ Excel, можно использовать следующий код. Он создаёт письмо с нужным перечнем адресатов в полях «Кому» и «Копия», с указанной темой, текстом и прикреплённым Excel файлом. Остаётся толкьо дописать письмо в случае необходимости и нажать кнопку «Отправить».

Dim OutlookApp As Object, SM As Object
 Set OutlookApp = CreateObject("Outlook.Application")
 Set SM = OutlookApp.CreateItem(olMailItem)
 'SM.SentOnBehalfOfName = "mail@example.ru" 'Поле "От", если нужен другой отправитель
 SM.To = "mail@example.ru" 'Поле "Кому"
 SM.CC = "mail@example.ru" 'Поле "Копия"
 SM.Subject = "Тема письма"
 On Error Resume Next
 SM.Body = "Текст письма"
 SM.Attachments.Add ("C:Test.xls") 'Адрес вложения
 SM.Display
 Set SM = Nothing
 Set OutlookApp = Nothing

Если же нужно отправить письмо в фоновом режиме, без отображения и необходимости самостоятельно нажимать кнопку «Отправить», то вместо SM.Display нужно вставить следующий код:

Чтобы вместо простого текста в теле письма было отформатированное содержимое можно воспользоваться вместо SM.Body следующее:

 SM.HTMLBody =  "&lt;html&gt;&lt;body&gt;&lt;div&gt;" & Text & "&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;"

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

Sub cbSendMail_Click(FileName)
 Application.DisplayAlerts = False
 FullFilePath = ThisWorkbook.Path & "" & FileName & ".xlsx"
 Dim OutlookApp As Object, SM As Object
 Set OutlookApp = CreateObject("Outlook.Application")
 Set SM = OutlookApp.CreateItem(olMailItem)
 SM.To = "mail@example.ru"
 SM.CC = "mail@example.ru"
 SM.Subject = "Название темы" & FileName
 On Error Resume Next
 'в этом случае открывается письмо 
 'с подписью той которая по умолчанию в Outlooke
 SM.Body = Activedocument.Content
 SM.HTMLBody = Activedocument.Content.Text
 If Dir(FullFilePath) <> "" Then
 SM.Attachments.Add (FullFilePath) 'Адрес вложения
 Else
 MsgBox "Файл для вложения не найден: " & Chr(13) & FullFilePath
 End If
 SM.Display
 SM.HTMLBody = "Добрый день!" & SM.HTMLBody
 Set SM = Nothing
 Set OutlookApp = Nothing
End Sub

Ещё по теме

Источник: Клуб ПРОграммистов — Отправка почты макросом Excel

  • Отправка книги или листа по email
  • Форум программистов и сисадминов — Автоматическая отправка E-mail с Excel или с Access
  • Как из VBA открыть Outlook Item, лежащий отдельно в виде .msg файла

Order_macros

Комментировать

Понравилась статья? Поделить с друзьями:
  • Автоматическая окраска ячейки в excel
  • Автоматическая оглавление word 2007
  • Автоматическая обработка данных в excel это
  • Автоматическая обновления в excel
  • Автоматическая нумеровка строк в excel