Хитрости »
1 Май 2011 386300 просмотров
Прежде чем начать читать статью прошу принять к сведению объявление: используйте СВОИ АДРЕСА ЭЛ.ПОЧТЫ при тестировании кодов. Не надо отсылать письма на указанные в статье e-mail адреса- это все приходит мне на почту. Помимо этого Вы сами не сможете понять работает или нет, т.к. письма придут мне, а не Вам.
Спасибо за понимание
P.S. А если написанное выше Вы все же проигнорировали и отправили письмо на мои адреса электронной почты — это означает, что Вы соглашаетесь с тем, что вся информация внутри письма, включая вложения, может быть использована мной без ограничений в личных целях.
- Отправка через меню Excel
- Простая отправка книги через VBA без Outlook
- Отправка писем через VBA при помощи Outlook(с вложениями)
- Отправить письма через Outlook с картинкой в теле письма
- Массовая рассылка писем по адресам при помощи Outlook
- Отправка сообщения без использования Outlook — используем CDO
Отправить письмо из 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:DocumentsReport.rar"
Строка:
objOutlookApp.Session.Logon "user","1234",False, True
имеет особое значение. По сути она нужна только в тех случаях, когда в Outlook настроено несколько профилей(не путать с учетными записями) и запускать нужно от конкретного. Если профиль только один или не указан, то Outlook запускается с профилем по умолчанию. Для этого строку нужно записать без параметров(так же можно записать эту строку, если Outlook при попытке создания письма выдает ошибку профиля):
objOutlookApp.Session.Logon
Важно помнить: пути для файлов в качестве вложений должны содержать полный путь до файла, включая его имя и расширение: C:DocumentsReport.rar. При указании только имени Report.rar или пути без расширения (C:DocumentsReport) ошибки не будет, но вложения не будут помещены в сообщения и адресату отправится письмо без вложений.
Этот код создает сообщение, но есть маленький нюанс — если в 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, 6 986 скачиваний)
При использовании этих кодов есть один недостаток: очень часто при программной отправке писем 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 545 скачиваний)
Ввиду все более участившихся вопросов о том, как добавить к тексту письма картинку именно через 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>»
внутри же самого письма в том месте, где должна отображаться картинки надо записать:
в приведенном выше коде картинка вставляется в самом начале письма и после неё так же добавляется перенос на новую строку при помощи тэга
Также см.:
Отправка листа/книги по почте
Вставить в письмо подпись из Outlook через VBA
Вставить в письмо Outlook таблицу Excel с форматированием
Сохранить вложения из Outlook в указанную папку
Как отправить письмо от другой учетной записи Outlook
Статья помогла? Поделись ссылкой с друзьями!
Видеоуроки
Поиск по меткам
Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика
Poglad_kota Пользователь Сообщений: 33 |
#1 17.07.2014 15:06:13 Добрый день всем! mail1@mail.ru ) и департамента ( mail2@mail.ru ), при этом первичной является учетка сотрудника — по умолчанию письма отправляются с его адреса (и она же привязана к его учетной записи на машине).
но результат — ноль.
Заранее спасибо всем отписавшимся! Изменено: Poglad_kota — 21.07.2014 11:58:43 |
||||
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
Мыло в кавычки. Навскидку. <#0> |
Поправил, но все равно результат тот же. |
|
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
А профиль именно так называется? Проверить не могу — не использую аутлук. У меня Мышь_летучая. Могу только высказывать свои умозаключения. Изменено: JayBhagavan — 17.07.2014 15:28:30 <#0> |
Изменения внес, спасибо! Но все равно не работает) Изменено: Poglad_kota — 21.07.2014 11:47:48 |
|
Ни у кого больше нет идей? ( |
|
Игорь Пользователь Сообщений: 3632 |
с Logon в аутлуке как-то все непросто программе рассылки писем , — работает через раз, закономерности не понял |
JayBhagavan Пользователь Сообщений: 11833 ПОЛ: МУЖСКОЙ | Win10x64, MSO2019x64 |
Всего лишь идея. Может из разряда бреда, но осмелюсь высказать. Возможно ли через ВБА менять ящик по-умолчанию? <#0> |
Nic70y Пользователь Сообщений: 3289 Win7 MSO 2013 |
в Outlook тоже же есть макросы, может с этой стороны подойти (предположение — исследовать этот вопрос лень) |
вот, как раз этим я сейчас и пытаюсь заниматься — тоже пришел к этой идее) |
|
vikttur Пользователь Сообщений: 47199 |
Ящик в VBA менять можно. В отдельных ячейках адреса, фамилии, текст письма (тоже может быть разным). |
Nic70y Пользователь Сообщений: 3289 Win7 MSO 2013 |
#12 21.07.2014 13:13:38
это понятно.
можно подробнее? чисто теорию (именно с отправкой через Outlook, vba в Excel) |
||||
Присоединяюсь к просьбе Nic70y , хотя интересует именно смена ящика, с остальным уже сталкивался) Изменено: Poglad_kota — 21.07.2014 14:30:18 |
|
The_Prist Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#14 21.07.2014 15:20:40 Есть такой параметр — .SetOnBehalfOfName…Может его стоит попробовать?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
vikttur Пользователь Сообщений: 47199 |
#15 21.07.2014 18:18:05
Вот же ж. Заставляет напрягаться…
и т.д. |
||||
Nic70y Пользователь Сообщений: 3289 Win7 MSO 2013 |
Виктор, спасибо! |
Poglad_kota Пользователь Сообщений: 33 |
#17 22.07.2014 09:58:14
Большое спасибо! Проблема решена, главное, что бы у пользователя были соответствующие права от администратора. Изменено: Poglad_kota — 22.07.2014 10:36:21 |
||
Dimarik1987 Пользователь Сообщений: 26 |
#18 15.05.2019 00:37:18 Добрый вечер!
Изменено: Dimarik1987 — 15.05.2019 00:39:19 |
||
БМВ Модератор Сообщений: 21385 Excel 2013, 2016 |
#19 15.05.2019 07:56:10 Dimarik1987, Задача очень косвенно касается Excel, и всеж. SetOnBehalfOfName используется в тех случаях, когда надо показать что отправляет кто-то за другого. Например помощник за руководителя. Эти права должны быть даны на сервере и обычный Mail.ru такое не предоставляет. Для отправки от другого аккаунта нужно именно переключится на него и ниже ответ на #13
Изменено: БМВ — 15.05.2019 08:01:25 По вопросам из тем форума, личку не читаю. |
||
Татьяна Агафонова Пользователь Сообщений: 140 |
#20 09.01.2020 14:02:44 БМВ, ругается, что oAccount «variable not defined» (((
Изменено: Татьяна Агафонова — 09.01.2020 14:06:45 |
||
МатросНаЗебре Пользователь Сообщений: 5516 |
#21 09.01.2020 14:11:21 Объявите переменные.
|
||
Nordheim Пользователь Сообщений: 3154 |
Татьяна Агафонова, Объявите все переменные в процедуре либо за комментируйте строку Option Explicit «Все гениальное просто, а все простое гениально!!!» |
Дмитрий Попов Пользователь Сообщений: 21 |
#24 10.02.2021 10:57:29 Добрый день.
Т.к. поиск письма осуществляется на технологическом почтовом ящике (ТПЯ), то по умолчанию пересылка производится с него же yyy@mail.ru « В чем может быть проблема? может необходимо какой-то другой параметр менять? Подскажите, пожалуйста Изменено: Дмитрий Попов — 10.02.2021 10:58:50 |
||
Дмитрий(The_Prist) Щербаков Пользователь Сообщений: 14182 Профессиональная разработка приложений для MS Office |
#25 10.02.2021 14:48:45
в том, что сообщение создали до того, как попробовать все предложенные в этой теме решения. Пробуйте .SendUsingAccount Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы… |
||
Возникла задача организации рассылки писем по списку e-mail пользователей в Excel. В каждом письме будут содержаться некоторые данные, индивидуальные для каждого пользователя, и приложен персональный файл. В этой статье, мы рассмотрим, как использовать Outlook для автоматической рассылки писем по списку из Excel с помощью VBA макроса или PowerShell
Содержание:
- VBA макрос в Excel для рассылки писем из Outlook
- Отправить письмо из Outlook с помощью PowerShell
Важно. Оба способа отправки писем подразумевают, что на вашем компьютере установлен и настроен почтовый профиль Outlook. Именно с этого почтового ящика (и e-mail адреса) будет выполнятся рассылка.
Допустим, у нас есть Excel файл, содержащий следующие столбцы:
Email пользователя | ФИО | Время последней смены пароля | Статус учетной записи
В рамках моей задачи нужно каждому пользователю из списка отправить письмо вида:
Тема: Статус учетной записи в домене winitpro.ru
Тело письма: Уважаемый %FullUsername%
Ваша учетная запись в домене winitpro.ru — %status%
Время последней смены пароля: %pwdchange%
Совет. Если для учетных записей пользователей нужно получить значение одного из атрибутов пользователя в Active Directory, можно воспользоваться решением из статьи Функция Excel для получения данных пользователя из AD.
VBA макрос в Excel для рассылки писем из Outlook
Сначала рассмотрим небольшой макрос отправки писем на языке VBA (Visual Basic for Applications), который можно создать прямо в документе Excel.
Создайте новый макрос: вкладка Вид -> Макросы. Укажите имя макроса send_email и нажмите кнопку Создать:
В открывшемся редакторе VBA вставьте следующий код (я снабдил его всеми необходимыми комментариями). Для автоматизации отправки писем я воспользуюсь функцией CreateObject(«Outlook.Application»), позволяющей создать и использовать в скрипте объект приложения Outlook.
Sub send_email()
Dim olApp As Object
Dim olMailItm As Object
Dim iCounter As Integer
Dim Dest As Variant
Dim SDest As String
' тема письма
strSubj = "Статус учетной записи в домене winitpro.ru"
On Error GoTo dbg
' создаем новый объект типа Outlook
Set olApp = CreateObject("Outlook.Application")
For iCounter = 2 To WorksheetFunction.CountA(Columns(1))
' создаем новый элемент (письмо) в Outlook
Set olMailItm = olApp.CreateItem(0)
strBody = ""
useremail = Cells(iCounter, 1).Value
FullUsername = Cells(iCounter, 2).Value
Status = Cells(iCounter, 4).Value
pwdchange = Cells(iCounter, 3).Value
'формируем тело письма
strBody = "Уважаемый " & FullUsername & vbCrLf
strBody = strBody & "Ваша учетная запись в домене winitpro.ru " & Status & vbCrLf
strBody = strBody & "Время последней смены пароля: " & pwdchange & vbCrLf
olMailItm.To = useremail
olMailItm.Subject = strSubj
'добавляем вложение, формат имени файла [email protected] . Если вложение не нужно, закомментируйте следующую строку
olMailItm.Attachments.Add ("C:ps" & useremail & ".txt")
olMailItm.BodyFormat = 1
' 1 - текстовый формат письма, 2 - HTML формат
olMailItm.Body = strBody
olMailItm.Send
'следующую строку можно использовать для отладки текста письма, закомментировав предыдущую
'MsgBox strBody
Set olMailItm = Nothing
Next iCounter
Set olApp = Nothing
dbg:
'отображение ошибок, если есть
If Err.Description <> "" Then MsgBox Err.Description
End Sub
Данный Excel файл нужно сохранить с расширением xlsm (формат книги Excel с поддержкой макросов). Для запуска рассылки выберите созданную процедуру (макрос) и нажмите кнопку выполнить.
Макрос последовательно перебирает все строки на листе Excel, формирует и отправляет по одному письму на каждый Email из списка. Отправленные письма сохраняются в папку Sent Items Outlook.
Если вам нужно отправить письмо от имени другого пользователя или общего почтового ящика, нужно предоставить на него права SendAs/Sent on behalf (в случае использования Exchange) и добавить в скрипт строку (перед olMailItm.Send).
olMailItm.SentOnBehalfOfName = "[email protected]"
Отправить письмо из Outlook с помощью PowerShell
В PowerShell можно использовать командлет Send-MailMessage для отправки писем, однако он требует выполнения аутентификации на почтовом сервере перед отправкой и не поддерживает современные методы проверки подлинности, такие как в том числе OAuth и Microsoft Modern Authentication. Поэтому, если на вашем компьютер есть настроенный профиль Outlook, гораздо проще использовать его для отправки писем.
Ниже приведен пример скрипта PowerShell, который получает данные из Excel файла и использует Outlook для отправки письма для каждого пользователя:
# открыть Excel файл
$ExcelObj = New-Object -comobject Excel.Application
$ExcelWorkBook = $ExcelObj.Workbooks.Open("C:PSuser_list.xlsx")
$ExcelWorkSheet = $ExcelWorkBook.Sheets.Item("Sheet1")
# Получаем количество заполненных строк в xlsx файле
$rowcount=$ExcelWorkSheet.UsedRange.Rows.Count
# Перебираем все строки в столбце 1, начиная со второй строки (в этих ячейках указано доменное имя пользователя)
for($i=2;$i -le $rowcount;$i++){
$useremail = $ExcelWorkSheet.Columns.Item(1).Rows.Item($i).Text
$FullUsername = $ExcelWorkSheet.Columns.Item(2).Rows.Item($i).Text
$Status = $ExcelWorkSheet.Columns.Item(4).Rows.Item($i).Text
$pwdchange = $ExcelWorkSheet.Columns.Item(3).Rows.Item($i).Text
# формируем тело письма
$strSubj = "Статус учетной записи в домене winitpro.ru"
$strBody = "Уважаемый " + $FullUsername
$strBody = $strBody + " `r`n Ваша учетная запись в домене winitpro.ru " + $Status
$strBody = $strBody + "`r`n Время последней смены пароля: " + $pwdchange
$strfile="C:ps" + $useremail + ".txt"
# предполагаем, что Outlook открыт, если нет нужно запустить его командой $outlook = new-object -comobject outlook.application
$outlook = [Runtime.InteropServices.Marshal]::GetActiveObject("Outlook.Application")
$email = $outlook.CreateItem(0)
$email.To = $useremail
$email.Subject = $strSubj
$email.Body = $strBody
# добавить вложение (если нужно)
$email.Attachments.add($strfile)
#отправить письмо
$email.Send()
}
$ExcelWorkBook.close($true)
Данный PowerShell скрипт предполагает, что на компьютере запущен Outlook. Для каждого email адреса из XLSX файла скрипт генерирует тему и текст письма и прикрепляет файл. Затем выполняется отправка письма.
Если после выполнения макроса необходимо отправить в качестве вложения получившийся документ 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 = "<html><body><div>" & Text & "</div></body></html>"
Чтобы создать письмо с подписью, которая ставится по умолчанию, можно прибегнуть к следующему коду:
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 файла
Комментировать
Содержание
- Метод Workbook.SendMail (Excel)
- Синтаксис
- Параметры
- Пример
- Поддержка и обратная связь
- Exceltip
- Блог о программе Microsoft Excel: приемы, хитрости, секреты, трюки
- Три способа отправить письмо из Excel с помощю VBA
- Отправить письмо в Excel с помощью VBA
- Отправить письмо в Excel с помощью CDO
- Отправить письмо в Excel с помощью Send Keys
- Как отправить письмо из Excel?
Метод Workbook.SendMail (Excel)
Отправляет книгу с помощью установленной почтовой системы.
Синтаксис
expression. SendMail (Recipients, Subject, ReturnReceipt)
Выражение Переменная, представляющая объект Workbook .
Параметры
Имя | Обязательный или необязательный | Тип данных | Описание |
---|---|---|---|
Получатели | Обязательный | Variant | Указывает имя получателя в виде текста или массива текстовых строк, если получателей несколько. Должен быть указан по крайней мере один получатель, а все получатели добавляются в качестве получателей. |
Тема | Необязательный | Variant | Задает тему сообщения. Если этот аргумент опущен, используется имя документа. |
ReturnReceipt | Необязательный | Variant | Значение True для запроса квитанции о возврате. Значение false , чтобы не запрашивать квитанцию о возврате. Значение по умолчанию — False. |
Пример
В этом примере активная книга отправляется одному получателю.
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
Exceltip
Блог о программе Microsoft Excel: приемы, хитрости, секреты, трюки
Три способа отправить письмо из Excel с помощю VBA
Excel позволяет создавать диаграммы высокого качества, работать с огромным количеством данных, обрабатывать картинки, блок-схемы и многое другое. И даже если вам и этого не достаточно, можно использовать Excel для автоматической отправки писем с помощью встроенного VBA редактора.
Данная статья описывает три способа отправки писем с помощью VBA в Excel. Вы можете скачать файл с примером отправки email с помощью VBA в Excel.
Отправить письмо в Excel с помощью VBA
Один из самых простых способов для автоматизации отправки почты с Excel заключается в вызове функции Create («ObjectOutlook.Application»). Данная функция возвращающает ссылку на ActiveX объект (в данном случает приложение Outlook), которое затем используется для создания и отправки электронной почты.
Чтобы проверить данный способ в работе, скопируйте и вставьте код ниже в VB редактор.
В качестве напоминания: Когда вы пытаетесь отправить письмо вышеуказанным способом, система безопасности будет выдавать каждый раз предупреждающее окно, в котором будет говориться о том, что Программа пытается отправить сообщение от вашего имени… и возможности обойти этот шаг нет.
К счастью, существует еще два способа, с помощью которых данный вопрос может быть решен: первый – через использование 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-порта.
Обратите внимание, чтобы воспользоваться данным методом вам необходимо подключить библиотеку CDO в редакторе макросов Tool –> References.
Отправить письмо в Excel с помощью Send Keys
Другой способ отправки email с помощью Excel – использование команды ShellExecute, которая выполняет любую программу в VBA. Команда ShellExecute используется для загрузки документа с соответствующей программой. По сути, вы создаете объект String (текстовые данные) и передаете его в качестве параметра для функции ShellExecute. Остальная часть операций выполняется в окнах. Автоматически определяется, какая программа связана с данным типом документа и используется для загрузки документа. Вы можете использовать функцию ShellExecute, чтобы открыть Internet Explorer, Word, Paint и множество других приложений. В коде ниже используется задержка в три секунды, чтобы убедиться, что отправляемое письмо корректно и для возможности предотвратить отправку, если вы вдруг нашли какие-нибудь недочеты.
Источник
Как отправить письмо из 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) — отправляет содержимое книги по факсу указанным получателям. Для использования данной возможности должна быть установлена служба факсов
Далее выбирается способ отправки:
- Как вложение (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:DocumentsReport.rar»
objOutlookApp.Session.Logon «user»,»1234″,False, True
имеет особое значение. По сути она нужна только в тех случаях, когда в Outlook настроено несколько профилей(не путать с учетными записями) и запускать нужно от конкретного. Если профиль только один или не указан, то Outlook запускается с профилем по умолчанию. Для этого строку нужно записать без параметров(так же можно записать эту строку, если Outlook при попытке создания письма выдает ошибку профиля):
Важно помнить: пути для файлов в качестве вложений должны содержать полный путь до файла, включая его имя и расширение: C:DocumentsReport.rar . При указании только имени Report.rar или пути без расширения ( C:DocumentsReport ) ошибки не будет, но вложения не будут помещены в сообщения и адресату отправится письмо без вложений.
Этот код создает сообщение, но есть маленький нюанс — если в 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 & «
Картинка в письме
» & » » ‘ & » 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
Этот код отправляет одно письмо и вставляет одну картинку. За это отвечает строка
Если картинку надо вложить с заранее указанными размерами, то строка будет выглядеть так:
» » ‘height — высота ‘width — ширина
Если надо добавить несколько картинок, то метод .Attachments.Add sPicture надо будет вызвать столько раз, сколько картинок(для каждого свой путь к картинке).
Важно помнить: пути для картинок должны содержать полный путь до файла, включая его имя и расширение: C:ДокументыИзображенияExcel_vba_ru.png . При указании только имени Excel_vba_ru.png или пути без расширения ( C:ДокументыИзображенияExcel_vba_ru ) ошибки не будет, но картинка не будет вставлена, а вместо неё скорее всего будет текст «Ошибка загрузки картинки!» или пустой квадрат вместо реальной картинки.
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, 6 942 скачиваний)
При использовании этих кодов есть один недостаток: очень часто при программной отправке писем Outlook выдает окно с запросом подтверждения отправки. Сообщение может быть трех видов:
- Программа пытается получить доступ к адресам электронной почты, хранящимся в Outlook. Если вы этого не ожидаете, нажмите кнопку «Запретить» и проверьте наличие последних обновлений для антивирусной программы.
- Программа пытается отправить сообщение от вашего имени. Если вы этого не ожидаете, нажмите кнопку «Запретить» и проверьте наличие последних обновлений для антивирусной программы.
- Программа пытается выполнить действие, которое может привести к отправке сообщения от вашего имени. Если вы этого не ожидаете, нажмите кнопку «Запретить» и проверьте наличие последних обновлений для антивирусной программы
Чтобы при программной отправке данных сообщений не появлялось, в версиях Outlook, начиная с 2007 можно отключить его настройками безопасности:
- Outlook 2007 : Меню—Параметры—Центр управления безопасностью—Программный доступ-установить Никогда не предупреждать о подозрительной активности (не рекомендуется)
- Outlook 2010 и выше : Файл—Параметры—Центр управления безопасностью—Программный доступ-установить Никогда не предупреждать о подозрительной активности (не рекомендуется)
ВАЖНО: Если компьютер управляется администратором Microsoft Exchange или Microsoft Windows Active Directory Domain Services и администратором в качестве параметров по умолчанию установлен запрет на внесение изменений в параметры безопасности пользователями, возможность изменения данных настроек безопасности программного доступа будет недоступна.
Важно: сам код рассылки не имеет никаких ограничений по числу отправляемых сообщений. Но различные почтовые серверы могут устанавливать свои лимиты. Например, Gmail и Yandex могут заблокировать email, с которого ведется рассылка, если общее количество отправленных сообщений превышает 100 штук в день. Поэтому производить важные массовые рассылки рекомендуется с собственного SMTP-сервера.
Отправка сообщения без использования 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). Если необходимо подставить в качестве отправителя псевдоним(чтобы получатель видел не просто адрес, а ассоциированное имя учетной записи), то указывать надо именно в формате псевдонима:
Excel-vba — и есть псевдоним. А сам адрес должен указываться между знаками <>
Это основные моменты. Поля Кому(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 526 скачиваний)
Ввиду все более участившихся вопросов о том, как добавить к тексту письма картинку именно через 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») = » » objbp.Fields.Update If Len(sAttachment) > 0 Then If Dir(sAttachment, 16) <> «» Then .AddAttachment sAttachment End If End If ‘для вложения картинки письмо лучше формировать в формате HTML .HTMLBody = »
» & sBody .Send End With
Самый главный момент:
AddRelatedBodyPart
- C:ДокументыИзображения11.jpg — указывается полный путь к файлу картинки на компьютере, включая расширение файла.
11.jpg — указывается имя картинки с расширением. Это имя будет использовано внутри письма и именно его необходимо будет указать дальше в » urn:schemas:mailheader:Content-ID «. И указывать обязательно в треугольных скобках: » »
внутри же самого письма в том месте, где должна отображаться картинки надо записать:
в приведенном выше коде картинка вставляется в самом начале письма и после неё так же добавляется перенос на новую строку при помощи тэга
Статья помогла? Поделись ссылкой с друзьями!
Источник