Vba outlook создать письмо от конкретного пользователя

Обновлено: 03.07.2024

Отправка писем из MS Outlook макросом VBA
Подскажите пожалуйста, можно ли при отправке писем макросом изменить шрифт и цвет текста.

Прежде чем вставлять активную книгу. Ее надо сохранить, тогда у вас появится пусть до нее. начиная с 2007 можно отключить его настройками безопасности:
Excel 2007: Меню-Параметры-Центр управления безопасностью-Программный доступ-установить Никогда не предупреждать о подозрительной активности (не рекомендуется);
Excel 2010: Файл-Параметры-Центр управления безопасностью-Программный доступ-установить Никогда не предупреждать о подозрительной активности (не рекомендуется). К сожалению изменение данных настроек заблокировано поэтому хотел узнать может кодом можно как-то обойти это. Если заблокировано - значит у Вас компьютер управляется администратором Microsoft Exchange или Microsoft Windows Active Directory Domain Services и администратором в качестве параметров по умолчанию установлен запрет на внесение изменений в параметры безопасности пользователями Нет. Из VBA вообще никаких. Только умолять админа. Безопасность в Outlook в этом плане хорошая. Спасибо за ответы. Для начала попробуем админов попросить дать доступ. The Prist, скажите, возможно ли имя отправляемого файла формировать из определенной ячейки этого файла?

Добавлено через 11 часов 22 минуты
Когда я писал "возможно" - это был намек на то, чтобы Вы написали какая часть имени файла в ячейке и в какой Потому как есть определенные нюансы. Если все имя файла(без пути):

Range("A1").Value - А1 это ячейка активного листа, в которой имя файла без расширения

Если же в ячейке только часть имени - тут надо знать какая часть в ячейке, а какая статично.

Предложенный вариант конечно работает, но добавляет к имени файла temp. И еще не работает если в имени файла присутствуют кавычки, а в моем случае к сожалению кавычки почти всегда есть и положение в ячейке у них всегда разное. Можно как-то избавиться от temp и от кавычек. Т.е имя файла формировалось из ячейки A1 но если в ячейке встречаются кавычки, то удалять их или пропускать Форум таки съел слеши. Ладно, в этой ситуации мы их так объедем:
А про кавычки внутри ячейки - лучше от них избавляться, в принципе. Но именно поэтому я и написал, что от Вас нужен хоть какой-то пример того, что в ячейке.
что вызывает трудности в удалении кавычек? Пытайтесь, пытайтесь искать ответы сначала самостоятельно. Все не так сложно. Иначе никогда нормально не научитесь в VBA работать:

Удалять кавычки не сложно, но после этого придется переписать еще несколько макросов, а это уже трудоёмко. В ячейке хранятся названия компаний. Пример: ПАО "Пальмира". Но так как имя файла не может содержать кавычек просил вас это обойти.

Добавлено через 10 минут
Самое главное. Последний предложенный вариант естественно работает как надо Спасибо. Пытался сегодня еще добавить сохранение отправляемого файла на ресурс также с именем взятым из ячейки. Сохраняет, но выполнение макроса завершается ошибкой . Ругается на kill ach$

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

Код запускает Outlook, создает письмо с заданными темой, получателем и текстом письма и отображает это письмо(.Display). Отправка не происходит, чтобы можно было сначала посмотреть, что получилось в итоге.

Учетные записи Outlook

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

Там отображены все доступные учетные записи, их имена и тип(POP3, IMAP и т.д.). Синеньким кружочком с галочкой отмечена учетная запись по умолчанию(именно из неё автоматом идет отправка всех создаваемых писем).
Так же нам понадобиться знать и тип подключения - через сервер Exchange(как правило это корпоративный вариант) или обычная пользовательская настройка учетной записи к своему личному почтовому ящику.

Вот и дошли до главного. Как я уже писал, по умолчанию Outlook кодом будет отправлять письмо именно от учетной записи, назначенной записью по умолчанию. И изменить это можно несколькими способами.
Для указания учетной записи отправителя применяются свойства письма .SentOnBehalfOfName или .SendUsingAccount . При этом .SentOnBehalfOfName у меня срабатывал как на обычной учетной записи, так и под Exchange. А вот .SendUsingAccount на Exchange протестировать уже не удалось. Поэтому при необходимости рекомендую опробовать оба варианта и выбрать тот, который будет работать.

метод SendUsingAccount
А этот метод представляет собой объект существующей учетной записи, содержащий в себе все данные о ней, в том числе и псевдоним. Это значит, что такой метод отправки от другой учетной записи ничем не будет отличаться от отправки вручную:

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

Sub GetOutlookAccounts() Dim objOutlookApp As Object, oAccount As Object Dim lr As Long On Error Resume Next Set objOutlookApp = GetObject(, "Outlook.Application") Err.Clear If objOutlookApp Is Nothing Then Set objOutlookApp = CreateObject("Outlook.Application") End If If Err.Number <> 0 Then Set objOutlookApp = Nothing Exit Sub End If For Each oAccount In objOutlookApp.Session.Accounts If oAccount.AccountType = 2 Then 'olPop3 lr = lr + 1 Cells(lr, 1).Value = oAccount End If Next End Sub

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

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

Управление профилями
Однако, не мог обойти стороной и тот момент, что может быть не только несколько учетных записей, но и несколько профилей со своими учетными записями. Несколько профилей могут настраиваться как в панели управления ОС: Панель управления -Mail -Конфигурации:

Так и в Outlook: Файл -Настройка учетных записей -Управление профилями:

  • либо закрыть Outlook, зайти в панель управления и указать другой профиль в качестве профиля по умолчанию(если в настройках не указано запрашивать профиль при запуске): Панель управления -Mail -Конфигурации -Показать -Использовать конфигурацию и выбрать из списка нужный профиль.
  • либо сменить профиль напрямую из Outlook: Файл -Настройка учетных записей -Изменить профиль. Outlook будет закрыт и его надо будет перезапустить вручную. Сразу после запуска будет показано окно выбора профиля. Выбираем нужный.

Теперь можно создавать письмо.
В кодах VBA на мой взгляд все чуть меньше телодвижений: за подключение к конкретному профилю отвечает функция Logon объекта Session:
Session.Logon [имя профиля],[пароль],[показывать окно выбора профиля], [запускать в новой сессии]
Session.Logon [Profile],[Password],[Show dialog], [New Session]

  • имя профиля (Profile) - имя профиля, в точности как оно записано в конфигурациях
  • пароль (Password) - пароль от профиля
  • показывать окно выбора профиля (Show dialog) - если указать True, то будет показано окно выбора профиля. Если известны имя профиля и пароль, то в кодах как правило указывают False(чтобы не показывать окно).
  • запускать в новой сессии (New Session) - запускать ли профиль в новой сессии. На мой взгляд несколько спорный пункт, т.к. невозможно запустить Outlook от другого профиля, не закрыв текущий экземпляр приложения. Метод Logoff всего лишь выходит из сессии Exchange, но никак не из профиля.

В итоге в кодах выглядит это примерно так:

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

  • я уже писал, что для смены профиля необходимо обязательно перезапустить Outlook, и после этого перед запуском выбрать профиль. А это означает, что в коде VBA мы попадаем в замкнутый круг: .Session.Logon является методом самого Outlook и чтобы его вызвать необходимо запустить Outlook. А как только мы подключаемся к Outlook - у нас либо запускается профиль по умолчанию(что по факту лишает нас возможности указать другой профиль), либо выдается запрос на выбор профиля. По факту запуская кодом мы должны во время выполнения закрыть появившееся окно без выбора профиля(нажать кнопку "закрыть" не подтверждая какой-либо профиль) - тогда код продолжит выполняться и назначит указанный профиль.
  • исходя из изложенного выше следует, что мы должны в настройках профилей указать "запрашивать конфигурацию". Иначе Outlook всегда будет запускаться с профилем, указанным по умолчанию без возможности его выбора, что сведет на нет все наши попытки его поменять в коде в момент запуска.

На данный момент я не нашел корректного способа обойти эти проблемы и поэтому код выше по сути приложен "до кучи". Хотя если речь идет не о простом подключении, а об Exchange - допускаю более корректную работу(но надо будет добавить перед Logon метод Logoff). Т.к. на данный момент у меня нет аккаунта Exchange, то проверить не могу.

Первый метод ниже, CreateMailItemFromAccount создает MailItem для определенной учетной записи и отображает ее в режиме композитации; хранилище доставки определенной учетной записи по умолчанию является таким же, как хранилище для папки, отображаемой в активном проводнике. Текущий пользователь учетной записи устанавливается как отправитель. CreateMailItemFromAccount Сначала определяет соответствующую учетную запись, соотнося с хранилищем текущей папки (полученной из свойства Folder.Store) с хранилищем доставки каждой учетной записи по умолчанию (полученным с помощью свойства Account.DeliveryStore), определенным в коллекции Учетных записей для сеанса. CreateMailItemFromAccount затем создает MailItem. Чтобы связать элемент с учетной записью, пользователь учетной записи назначается отправиком элемента, установив объект CreateMailItemFromAccount AddressEntry для пользователя учетной записи в свойство Отправитель MailItem . Назначение свойства Отправитель является важным шагом, так как в противном случае mailItem создается для основной учетной записи. В конце метода отображается CreateMailItemFromAccount MailItem. Обратите внимание, что если текущая папка не находится в магазине доставки, просто создайте MailItem для основной учетной записи CreateMailItemFromAccount сеанса.

Следующий метод, аналогичный тому, что он создает AppointmentItem вместо MailItem, и связывает AppointmentItem с учетной записью с помощью свойства CreateMeetingRequestFromAccount CreateMailItemFromAccount SendUsingAccount. CreateMeetingRequestFromAccount создает appointmentItem в папке Calendar учетной записи, хранилище доставки которой по умолчанию является таким же, как и хранилище для папки, отображаемой в активном проводнике. CreateMeetingRequestFromAccount Сначала определяет соответствующую учетную запись, соотнося с хранилищем текущей папки (полученной из свойства Folder.Store) с хранилищем доставки каждой учетной записи по умолчанию (полученным с помощью свойства Account.DeliveryStore), определенным в коллекции Учетных записей для сеанса. CreateMeetingRequestFromAccount затем создает AppointmentItem. Чтобы связать элемент с учетной записью, назначает эту учетную запись в качестве учетной записи отправки элемента, задав объект учетной записи свойству CreateMeetingRequestFromAccount SendUsingAccount свойства AppointmentItem. Назначение свойства SendUsingAccount является важным шагом, так как в противном случае для основной учетной записи создается AppointmentItem. В конце метода отображается CreateMeetingRequestFromAccount AppointmentItem. Обратите внимание, что если текущая папка не находится в магазине доставки, просто создайте CreateMeetingRequestFromAccount AppointmentItem для основной учетной записи сеанса.

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

date

22.11.2017

directory

Office, Outlook, Скрипты

comments

комментариев 57

Возникла задача организации рассылки писем по списку email пользователей в Excel. Причем в каждом письме нужно указывать некоторые данные, индивидуальные для каждого пользователя. Я попытался реализовать этот функционал с помощью vba макроса в Excel, который отправляет почту через настроенный на компьютере почтовый профиль Outlook. Ниже мое решение.

Допустим, у нас есть Excel файл, содержащий следующие столбцы:

Email пользователя | ФИО | Время последней смены пароля | Статус учетной записи

отправка писем по списку адресов в excel через макрос и outlook

Совет. Если для учетных записей пользователей нужно получить значение одного из атрибутов пользователя в Active Directory, можно воспользоваться решением из статьи Функция Excel для получения данных пользователя из AD.

Создадим новый макрос: вкладка Вид -> Макросы. Укажите имя макроса send_email и нажмите кнопку Создать:

Важно. На компьютере, рассылающем письма должен быть установлен и настроен почтовый профиль 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 = 1 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
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 с поддержкой макросов). Для запуска рассылки выберите созданную процедуру (макрос) и нажмите кнопку выполнить.

запустить макрос в vba

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

Предыдущая статья Следующая статья

page

page

page

Как узнать ключ активации установленного MS Office Скрипты для полного удаления старых версий Office Проверка статуса активации и типа лицензии Office 2019/ 2016 и 365 Правила лицензирования и отличия между Office 2016 и Office 365

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

Для прикрепления файла, код формирования письма нужно поменять на такой:
olMailItm.Body = strBody
olMailItm .Attachments.Add ("C:\Users\Desktop\send.xls")
olMailItm.Send

Лучше скрипт сделать на контроллере домена например, или любом другом сервере, который будет опрашивать нужную ОУшку, на предмет время смены пароля, и отправлять если нужно письмо. Задание на выполнение каждый день этого скрипта.
Еще можно на логон пользователя сделать скрипт с проверкой, и вывести окошко при входе что необходимо сменить пароль, чтобы даже не заглядывая в почту человек видел, что до смены пароля например 3 дня.

Как сделать что бы в письме узазывалась ссылка на файл ?

Сменить текст письма на HTML
olMailItm.BodyFormat = 2
И добавить в Body строку со ссылкой. Как-то так:
strBody = strBody & "[a href="\\srv1\public\main.docx"]Ссылка на файл[/a]"
ЗЫ. Заменить квадратные кавычки на теги

Доброго времени суток, столкнулся с проблемой, есть 2000 адресов и outlook привязанный к яндексу, как разослать по 3 письма с вложениями (шаблон сохранен) каждые 5 минуты чтоб адреса брались следующие по списку?

Вы не разошлете, если письма будут одинаковые. Яндекс заблокирует отправку на 300-м письме — проверено мной лично экспериментальным путем. Для рассылки большого количества одинаковых писем используйте специализированные сервисы.

Если не сложно укажите какие сервисы лучше использовать?

Лично я использую Mailchimp
А из российских есть, например sendpulse

Спасибо большое за совет.

Добрый день! А возможно ли сделать, чтобы подпись с Outlook тоже подхватывалась и была в письме?

Можно просто добавить в письмо HTML код подписи:

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

Смысл в том, чтобы HTML код с вашей подписью вставить прямо в код макроса. Таким образом в теле письма кроме данных будет отображаться ваша подпись.

Добрый день! VBA код ругается на такую строчку
strSign="С уважением" &lt/font> & _
"Андрей Иванов"
strBody = strBody & strSign & vbCrLf

Конкретно на аперандекс и символ подчеркивания (& _). Подскажите что не так?

On Error GoTo dbg

strSign = "С Уважением &lt/font>" & "Кутькин Антон"

Наверно лучше сохранить эти письма в черновиках Outlook.
Вместо
olMailItm.Send
используйте
olMailItm.Save
olMailItm.Close
Потом уже запускаете Outlook, проверяете черновики (Drafts) и отправляете по очереди.

Здравствуйте,
выдает что Argument is not optional.
Так же хотелось бы узнать как сделать так что б vba читал данные со второго ряда?

Во втором случае: у меня в первом ряду наименование столбцов: name, email,status и прочее.
Поетому мне необходимо что б код выполнял команду со второго ряда.

Добрый день!
Давно использую аналогичный механизм. Встала следующая задача: есть ползователи, включенные в Outlook в группу, у группы есть свой почтовый адрес, у пользователей есть разрешение отправлять письма от лица группы.

Как поменять адрес отправителя на адрес группы?
With objMail
.To = MailTo
.From = MailFrom
.Subject = MailSubject
.Body = MailText
If Len(MailAttachment) > 0 Then .Attachments.Add MailAttachment
.Send
End With
При подстановке адреса группы в переменную MailFrom, получатель все-равно видит адрес отправителя.

Подскажите, пожалуйста, зачем объявляются эти переменные в коде?
Dim Dest As Variant
Dim SDest As String

Это не обязательно. Visual Basic позволяет динамически создавать переменные без объявления. Просто по правилам хорошего тона и улучшения производительности обычно стоит все-таки объявлять переменные в начале скрипта.

Что добавить, чтобы были сохранения в отправленных?

По умолчание письмо, отправленное из Outlook скриптом vbs сохранялось в отправленны. По крайней мере, было так когда я тестировал скрипт в outlook 2010.

увы, это не так) это в 2013 у меня так.
а есть похожий скрипт чтобы сохранялись в отправленных?
а вообще истоки где? чтобы почитать как создавать

Может нужно добавить что-то вида:
olMailItm.Save

Добрый день. В аутлуке подключено несколько учетных записей, как отправлять не от учетки по умолчанию, а от имени доп. ящика?

Скорее всего для отправки с доп. адреса outlook вам нужно добавить в ващ vba скрипт такую строку:
olMailItm.SentOnBehalfOfName = "yoursecondemail@domaincom"

Добрый день. Подскажите, может кто-нибудь сталкивался. Как вложить в тело письма рисунок. В данном макросе такое возможно?

Добавляйте файл с каринкой в виде вложения. См. пример выше:
olMailItm .Attachments.Add ("C:\Users\Desktop\send.jpg")

Добрый день. Подскажите, пожалуйста, как сделать, чтобы значение из столбца 3 вставлялось в текст жирным?
Я указала, что бы использовался html -это позволило ссылку вставить, но текст никак не делается жирным и цветным(

Используйте HTML формат письма:

И такой код сделает данное значение в теле письма жирным:

Замените скобки [ ] на , сайт фильтрует их в комментариях

тут почему-то преобразовало, а в письме нет(
так и отображается тэг СЛОВО закрытие тэга

Посмотрите какой формат определяет Outlook в полученном письме? Plain text или HTML?

Указан HTML. ссылка из ячейки 4 корректно подтягивается (гиперссылкой).
при изменении вида письма- ссылка становится текстом

Добрый день!
Подскажите мне настройки безопасности в EXCEL влияют на корректность работы данного макроса. Пытаюсь применить ваш код для выполнения задачи по рассылке ежечасной рассылке писем адресатам. Я в VBA не силен.

Добрый день, спасибо огромное за статью,
а как можно сделать, чтобы в каждое письмо присоединялся персональный файл?

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

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

Добрый день. Посдкажите. А как отправлять разное вложение, разным людям.
Я так понимаю команда olMailItm.Attachments.Add («C:\Users\Desktop\send.xls») делает рассылку одно и того файле всем.

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

Читайте также: