Как организовать почтовую рассылку средствами Google

Кирилл Соппа, финансовый консультант

Продолжая тему автоматизации с помощью сервисов Google, в канун Нового года подготовил для Вас легкий праздничный материал. О том, как я с помощью скриптов сделал поздравительную рассылку для своих клиентов и партнеров.

Итак, у нас есть на Google Диске праздничная открытка и список клиентов в Google Таблице, которым надо разослать поздравление, например, в таком формате:

Название компании Фамилия Имя Отчество Почта
1 Индивидуальный предприниматель Соппа Кирилл Михайлович This email address is being protected from spambots. You need JavaScript enabled to view it.
2 Крутая компания Петров Евгений Алексеевич This email address is being protected from spambots. You need JavaScript enabled to view it.

Жмем кнопку “Создать” в Google Диске, выбираем в меню “Еще/Google Apps Script”. Открывается редактор скриптов. Меняем название проекта кликнув мышью на само название или в меню “Файл/Переименовать” на “Sending mails”. Удаляем заготовку function myFunction() {} и начинаем создавать свой код. Сначала создадим переменные ADDRESS_BOOK и PICTURE и присвоим им значения идентификаторов файлов списка клиентов и открытки:

// идентификаторы адресной книги и картинки
var ADDRESS_BOOK='1CrYN4w8gpwIfxNI7tx580YuqxCJjPDM2g96etxEb7Hk';
var PICTURE='0B5dfvgXy_O9QY3JnYnVoT0FZU0k';

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

https://drive.google.com/open?id=0B5dfvgXy_O9QY3JnYnVoT0FZU0k

Все что после символов "...id=" и есть идентификатор файла на Google Диске. Копируем и вставляем в наш код. Дальше нам надо вставить текст письма. В письме должно быть обращение, поздравительная открытка и ссылка для перехода на наш сайт (это же наш клиент).

// текст письма в HTML-формате
var TEXT_EMAIL='<font size="4 face=fantasy" color="blue">’+
  ‘Здравствуйте, #NAME#!</font><br>'+
  '<img src="cid:imageHappyNewYear"><br>'+
  '<a href="/google.ru"><font size="4 face=fantasy" color="blue">’+
  ‘посетить наш сайт</font></a>';

Это текст в HTML-разметке. Кратко его прокомментирую. В первой строке задаются параметры обращения. Во второй строке стоит само обращение. На место #NAME# мы будем вставлять адресата письма. В следующей строке мы задаем контейнер для нашего рисунка imageHappyNewYear. А в последних двух строках задается ссылка на наш сайт (в данном примере указан сайт Google).

Теперь создадим функцию отправки писем:

function sendMails() {

}

и дальше код будем вставлять между операторных скобок {}. Переносим наш рисунок из файла на Google Диске в контейнер:

// загружаем картинку из файла в Blob-хранилище
var imageBlob=DriveApp.getFileById(PICTURE).getBlob()
  .setName("imageBlob");

Доступ к файлу с картинкой мы получили через идентификатор файла, который записан в переменной PICTURE с помощью функции getFileById объекта DriveApp. Дальше нам надо получить доступ к списку адресов:

// открываем список адресов, сохраняем его в addressTable, узнаем его размер
var sh=SpreadsheetApp.open(DriveApp.getFileById(ADDRESS_BOOK))
  .getSheetByName('List');
var addressTable=sh.getDataRange().getValues();
var numRows=sh.getDataRange().getNumRows()-1;

Объект SpreadsheetApp дает доступ к функциям работы с Google Таблицами. Доступ к нужной таблице опять же осуществляется через ее идентификатор ADDRESS_BOOK. Функция getSheetByName возвращает нужный лист, функция getDataRange возвращает прямоугольную область, в которой есть какие-либо значения. Функция getValues возвращает значения в диапазоне. Функция getNumRows возвращает количество строк в диапазоне. Таким образом, у нас в массиве addressTable значения списка клиентов, а в переменной numRows их количество. Вставляем код дальше:

// создаем файл отчета с именем "REPORT дата и время отправки"
var curDate=new Date();
var ss=SpreadsheetApp.create('REPORT '+curDate.getDate()+'/'
  +(curDate.getMonth()+1)+'-'
  +curDate.getHours()+':'+curDate.getMinutes());
var shr=ss.getSheets()[0];

Это необязательная часть — создание таблицы с отчетом об отправке писем. Нужна мне была в основном для отработки навыков работы с таблицами и выявления случайных ошибок в написании электронной почты в большом списке клиентов. Строка var curDate=new Date() создает переменную curDate с текущими датой и временем. Дальше мы создаем таблицу с именем вида “REPORT 26/12 17-12”. Функции getDate, getMonth, getHours, getMinutes как видно из их названия возвращают соответствующую часть даты. Тут стоит только отметить функцию getMonth. Она отличается тем, что нумерация месяцев в отличие от дней начинается с нуля. Ну и в последней строке мы получаем ссылку на первый лист таблицы (листы тоже нумеруются с нуля). Все готово, можно запускать цикл по рассылке писем:

// цикл по всем записям из списка адресов
for (var index=1; index=numRows; index++) {
  // меняем #NAME# на ФИО контакта
  var html_text=TEXT_EAIL.replace('#NAME#', addressTable[index][2]+' '
    +addressTable[index][3]+' '+addressTable[index][4]);
  // формируем сообщение 
  var mail={
    htmlBody: html_text, 
    name: 'Наша компания', 
    to: addressTable[index][5], 
    subject: 'С Новым Годом!', 
    inlineImages: {imageHappyNewYear: imageBlob}
  };
  // пытаемся отправить, результат пишем в отчет
  try {
    MailApp.sendEmail(mail);
    shr.getRange(index, 3).setValue('Отправлено');
  } catch (err) {
    shr.getRange(index, 3).setValue('Ошибка: '+err.message);
  }; 
  // заполняем остальные колонки отчета
  shr.getRange(index, 1).setValue(addressTable[index][0]);
  shr.getRange(index, 2).setValue(addressTable[index][1]);
  shr.getRange(index, 4).setValue(MailApp.getRemainingDailyQuota());
}

Код содержит комментарии, но все же дам краткие пояснения. Объект MailApp дает доступ к отправке писем, функция sendMail отправляет письмо, заданное структурой mail. В структуре письма параметры name, to, subject соответствуют своим обиходным значениям: имя отправителя, адресат, тема письма. Параметр htmlBody содержит текст письма в HTML-разметке. Параметр inlineImages — это структура, которая показывает соответствие между ссылкой на контейнер картинки в HTML-тексте письма и самим контейнером. Конструкция try {} catch (err) {} позволяет не прерывать выполнение скрипта при возникновении ошибки. Если ошибка возникает при выполнении кода в секции try {}, то выполнение передается секции catch (err) {}. Если ошибки не возникает, секция catch (err) {} не выполняется вообще. Функция getRange возвращает диапазон (в данном случае одну ячейку), функция setValue помещает в указанный диапазон значение. Наконец, функция getRemainingDailyQuota возвращает остаток от дневного лимита на отправку сообщений.

Код готов. Необходимо выполнить его авторизацию. Это делается просто — запускаем функцию sendMails (меню “Выполнить/sendMails”), Google сам напоминает нам, что нужна авторизация. Жмем “Далее”, видим следующее окно:

“Просмотр и изменение таблиц на Google Диске” нам нужно для доступа к списку клиентов, “Храните файлы пользователей на Google Диске” необходимо для сохранения файла отчета, “Рассылка почты от вашего имени” - собственно, для рассылки от Вашего имени.

Жмем “Разрешить”, скрипт выполняется. Находим на Google Диске (в корне) таблицу REPORT с текущим временем. Открываем, видим примерно следующее:

1 Индивидуальный предприниматель Отправлено 96
2 Крутая компания Отправлено 95

В завершении скажу несколько слов о своем опыте использования данного скрипта.

  1. Рассылка производится с адреса @gmail.com, по моим наблюдениям (тестовые запуски и опрос некоторых клиентов) такие ящики практически не попадают в спам. Единственное ограничение, отмеченное мной - яндексовский ящик в браузере отключал ссылку. Причем если то же самое письмо из этого же ящика “затянуть” в аутлук - все работало.
  2. По сравнению с бесплатными сервисами рассылки - письма клиентам приходят от “”понятного” адреса и отправителя, а не “Сервис рассылки через ... “ (вместо многоточия указана Ваша почта). Создается небольшая иллюзия что кто-то сидел и отправлял. Так, мы получили в ответ на рассылку несколько благодарностей с встречными поздравлениями (все-таки слать ответ “Сервису рассылки” желания обычно не возникает) и даже одну заявку на товар!
  3. Если приведенный пример письма кажется Вам достаточно простым, можете поступить так. как сделали мы. Мы составили письмо для рассылки в конструкторе бесплатного рассылочного сервиса, отправили себе на почту и потом скопировали HTML-код в переменную TEXT_HTML, подправив пару сообщений. И у нас получилось красиво оформленное поздравительное письмо.
  4. Вы легко можете использовать данный скрипт не только для поздравительных, но и для рабочих рассылок. Помимо того, легко можно, например, сегментировать клиентов. Для этого в достаточно в дополнительной колонке в Google Таблице указывать их статус, а в скрипте в зависимости от значения в этой колонке прикреплять к письму нужное коммерческое предложение.

Также, если Вас заинтересовали возможности, предоставляемые сервисами Google для автоматизации бизнес-процессов, есть сообщество в Google+. Там очень отзывчивые ребята, собственно, по мотивам их публикаций я и написал данный скрипт.

Ссылки на документы из блога:
Список клиентов
Скрипт
Картинка



Рейтинг@Mail.ru

Copyright (c) 2005-2015 by Igor Nikolaev. All Rights Reserved.