Небольшой рецепт на MS VB для сисадминов, которые хотят упростить жизнь сотрудникам.
Задача: девочка на reception периодически отправляет официальные анонсы всей компании. При этом дизайн, нарисованный дизайнером есть, а процесс отправки находится в состоянии вплоть до «отыскать старое письмо в отправленных, нажать переслать всем, отредактировать текст и тему письма, отправить».
Есть два способа:
Шаблоны — подойдет для простых вариантов, когда все поля статичны
VBA — под катом рассмотрим пример создания простейшего шаблона на встроенном в Outlook Visual Basic.
Есть еще конечно и нормальный способ — взять программиста, который напишет автоматическую рассылку писем на любом удобном ему движке, получить данные о сотрудниках из Exchange или LDAP и все будет ок, но для этого надо бюджет. Кому интересно костыль — под кат.
VBA-макрос можно настроить на автоматическое заполнение всех полей достаточно гибко. Вызов макроса можно добавить прямо в ленту Outlook, создав для нее пиктограмму.
Пользователь может случайно удалить файл с шаблоном, или запороть его. В таких случаях, макрос надежнее, и всегда на панели быстрых кнопок.
Верстка письма в Outlook идет в HTML, и ниже — инструкция и пример простого кода, который создает письмо, аттачит две картинки с логотипами, форматирует html-тело письма, прописывает поля письма.
Итак:
Как можно улучшить?
Можно добавиьт несколько inputbox, или форму с radio button, где можно будет выбрать какие-то параметры, выбирая или адресатов, или нужный подвид анонса.
Можно делать поиск по адресной книге outlook (цикл по Outlook.Application.GetNamespace(«MAPI»).AddressLists(«Global Address List»).AddressEntries), и использовать информацию из карточки (имя, проект, контактные данные), создавая персонифицированные письма.
Можно сделать несколько заготовок для разных полей, и выбирать нужное случайно или по дате/времени.
К сожалению, столкнулся с тем, что если просматривать html письма Не в desktop outlook, могут возникать проблемы
Даже родной web-интерфейс exchange по какой-то причине может откусывать части, которые он считаем лишними (у меня он не отображал картинки в заголовке таблицы, хотя отображал фотки сотрудников в той же таблице). Выяснить принцип по которому он выбирал что отображать или нет, я не смог — все файлы аттачились одинаково.
Клиент с мака видит съехавший дизайн, там еще хуже вем в web-интерфейсе.
Причина в том, что exchange переделывает весь html-код и выводит его по своим личным правилам, используя жуткие cpan вместо того, что дизайнил я (div/table...). Попытки нагуглить решение пока печальные — видимо в текущем exchange это сделать нельзя. Если у вас были успешные решения — поделитесь!
P.S. Да, это конечно костыль, но в моей компании это сэкономило примерно 200 человекочасов в год, что немало.
Задача: девочка на reception периодически отправляет официальные анонсы всей компании. При этом дизайн, нарисованный дизайнером есть, а процесс отправки находится в состоянии вплоть до «отыскать старое письмо в отправленных, нажать переслать всем, отредактировать текст и тему письма, отправить».
Есть два способа:
Шаблоны — подойдет для простых вариантов, когда все поля статичны
VBA — под катом рассмотрим пример создания простейшего шаблона на встроенном в Outlook Visual Basic.
Есть еще конечно и нормальный способ — взять программиста, который напишет автоматическую рассылку писем на любом удобном ему движке, получить данные о сотрудниках из Exchange или LDAP и все будет ок, но для этого надо бюджет. Кому интересно костыль — под кат.
VBA-макрос можно настроить на автоматическое заполнение всех полей достаточно гибко. Вызов макроса можно добавить прямо в ленту Outlook, создав для нее пиктограмму.
Пользователь может случайно удалить файл с шаблоном, или запороть его. В таких случаях, макрос надежнее, и всегда на панели быстрых кнопок.
Верстка письма в Outlook идет в HTML, и ниже — инструкция и пример простого кода, который создает письмо, аттачит две картинки с логотипами, форматирует html-тело письма, прописывает поля письма.
Итак:
- Запускаем редактор макросов в Outlook (Alt+F11)
- Создаем новый модуль
- Пишем код
Attribute VB_Name = "Announce" Option Explicit Sub CreateAnnounce() Dim htmlBody As String Dim fileAttach As Outlook.Attachment Dim newMail As Outlook.MailItem Set newMail = Application.CreateItem(olMailItem) ' Аттачим два файла, к которым из html-тела можно обратиться как src="cid:<имя файла>" ' Третий параметр (position) установлен в 0, чтобы аттачи не отображались отдельными файлами и не портили "внешний вид" Set fileAttach = newMail.Attachments.Add("c:\images\logo1.png", , 0) Set fileAttach = newMail.Attachments.Add("c:\images\logo2.png", , 0) Set fileAttach = Nothing // освобождаем память ' формируем тело письма. Таблица, два ряда - в верхнем две картинки, в нижнем текст. Немного стиля и форматирования. htmlBody = "<table align=center style='width:650;border:solid #316AA5 6.0pt;background=white;padding:0'>" + _ "<tr height=150>" + _ "<td style='padding:20;width:200' valign=top><img src='cid:logo1.png' height=150></td>" + _ "<td style='padding:20;width:200' align=right valign=top><img src='cid:logo2.png' height=150></td></tr>" + _ "<tr><td colspan=2 valign=top style='padding:80'> <h3>Уважаемые коллеги, </h3><br><br>" + _ "SCIgen — компьютерная программа, генерирующая случайный текст, напоминающий научную статью, содержащую иллюстрации, графики и примечания. Заявленное назначение: «автоматически генерировать тезисы для конференций, подозреваемых в низком цензе приёма»." + _ "<br><br>Благодарим за ваше внимание.<br><br><hr>С уважением, служба охраны труда<br><br></tr></table>" With newMail .Subject = "[Announce] " + Format(Date, "dd.mm.yyyy, dddd") .To = "test@example.com" .BodyFormat = olFormatHTML .htmlBody = htmlBody .Display End With Set newMail = Nothing End Sub
- 4. Добавляем вызов данного макроса в ленту Outlook
- 5. Профит
Как можно улучшить?
Можно добавиьт несколько inputbox, или форму с radio button, где можно будет выбрать какие-то параметры, выбирая или адресатов, или нужный подвид анонса.
Можно делать поиск по адресной книге outlook (цикл по Outlook.Application.GetNamespace(«MAPI»).AddressLists(«Global Address List»).AddressEntries), и использовать информацию из карточки (имя, проект, контактные данные), создавая персонифицированные письма.
Можно сделать несколько заготовок для разных полей, и выбирать нужное случайно или по дате/времени.
К сожалению, столкнулся с тем, что если просматривать html письма Не в desktop outlook, могут возникать проблемы
Даже родной web-интерфейс exchange по какой-то причине может откусывать части, которые он считаем лишними (у меня он не отображал картинки в заголовке таблицы, хотя отображал фотки сотрудников в той же таблице). Выяснить принцип по которому он выбирал что отображать или нет, я не смог — все файлы аттачились одинаково.
Клиент с мака видит съехавший дизайн, там еще хуже вем в web-интерфейсе.
Причина в том, что exchange переделывает весь html-код и выводит его по своим личным правилам, используя жуткие cpan вместо того, что дизайнил я (div/table...). Попытки нагуглить решение пока печальные — видимо в текущем exchange это сделать нельзя. Если у вас были успешные решения — поделитесь!
P.S. Да, это конечно костыль, но в моей компании это сэкономило примерно 200 человекочасов в год, что немало.