Что такое Google Apps Script и его применение для работы с почтой?
Google Apps Script (GAS) — это облачная платформа на базе JavaScript, позволяющая расширять функциональность приложений Google Workspace (Docs, Sheets, Forms, Gmail и др.) и создавать собственные веб-приложения. В контексте работы с электронной почтой, GAS предоставляет мощные инструменты для автоматизации отправки, получения и обработки писем непосредственно из вашего Google-аккаунта.
GAS позволяет интегрировать почтовые функции с другими сервисами Google. Например, можно автоматически отправлять персонализированные письма на основе данных из Google Sheets, генерировать отчеты и рассылать их по расписанию или уведомлять пользователей о событиях в Google Calendar.
Преимущества использования Google Apps Script для автоматизации отправки email
Интеграция: Бесшовная работа с экосистемой Google Workspace (Gmail, Sheets, Drive и т.д.).
Автоматизация: Возможность настройки триггеров для отправки писем по расписанию или на основе событий.
Персонализация: Легкость создания динамических и персонализированных email-сообщений с использованием данных из других сервисов.
Бессерверность: Отсутствие необходимости в собственной инфраструктуре для выполнения скриптов.
Простота: Использование JavaScript, знакомого многим разработчикам, и интуитивно понятных API.
Необходимые условия и настройка окружения Google Apps Script
Для начала работы вам потребуется:
Аккаунт Google: Любой стандартный аккаунт Google (@gmail.com) или аккаунт Google Workspace.
Доступ к редактору скриптов: Его можно открыть из любого приложения Google Workspace (например, в Google Sheets через меню "Расширения" -> "Apps Script") или напрямую по адресу script.google.com.
При первом запуске скрипта, отправляющего почту, Google запросит авторизацию. Необходимо предоставить скрипту разрешение на отправку писем от вашего имени.
Основные методы отправки электронной почты
Использование MailApp.sendEmail() для простой отправки
Сервис MailApp является основным инструментом для отправки электронной почты в GAS. Метод sendEmail() — наиболее часто используемый и простой способ отправки.
Он имеет несколько перегруженных версий, но базовая сигнатура позволяет отправить простое текстовое письмо, указав получателя, тему и тело сообщения.
Примеры отправки простого текста и HTML-сообщений
/**
* Отправляет простое текстовое электронное письмо.
*
* @param {string} recipient Адрес электронной почты получателя.
* @param {string} subject Тема письма.
* @param {string} body Тело письма (простой текст).
*/
function sendSimpleEmail(recipient: string, subject: string, body: string): void {
try {
MailApp.sendEmail(recipient, subject, body);
Logger.log(`Письмо успешно отправлено на ${recipient}`);
} catch (error) {
Logger.log(`Ошибка отправки письма: ${error}`);
}
}
/**
* Отправляет электронное письмо с HTML-содержимым.
*
* @param {string} recipient Адрес электронной почты получателя.
* @param {string} subject Тема письма.
* @param {string} htmlBody Тело письма в формате HTML.
*/
function sendHtmlEmail(recipient: string, subject: string, htmlBody: string): void {
try {
// Для отправки HTML необходимо использовать объект опций
MailApp.sendEmail(recipient, subject, '', { // Текстовое тело оставляем пустым
htmlBody: htmlBody
});
Logger.log(`HTML письмо успешно отправлено на ${recipient}`);
} catch (error) {
Logger.log(`Ошибка отправки HTML письма: ${error}`);
}
}
// Пример использования:
sendSimpleEmail('test@example.com', 'Тестовое сообщение', 'Это тело простого текстового письма.');
sendHtmlEmail('test@example.com', 'Тестовое HTML сообщение', 'Это тело письма в формате HTML.
');Отправка электронной почты с указанием получателя, темы и тела письма
Как видно из примеров выше, базовый вызов MailApp.sendEmail(recipient, subject, body) покрывает основной сценарий отправки. Важно убедиться, что все три параметра (recipient, subject, body) являются строками.
Расширенные возможности отправки электронной почты
Добавление копий (CC) и скрытых копий (BCC)
Для добавления получателей в копию (CC) или скрытую копию (BCC) используется объект опций (третий или четвертый параметр sendEmail).
/**
* Отправляет письмо с указанием CC и BCC.
*
* @param {string} recipient Основной получатель.
* @param {string} ccRecipients Получатели копии (через запятую).
* @param {string} bccRecipients Получатели скрытой копии (через запятую).
* @param {string} subject Тема письма.
* @param {string} body Тело письма.
*/
function sendEmailWithCcBcc(recipient: string, ccRecipients: string, bccRecipients: string, subject: string, body: string): void {
try {
MailApp.sendEmail(recipient, subject, body, {
cc: ccRecipients,
bcc: bccRecipients
});
Logger.log(`Письмо с CC/BCC отправлено на ${recipient}`);
} catch (error) {
Logger.log(`Ошибка отправки письма с CC/BCC: ${error}`);
}
}
// Пример использования:
sendEmailWithCcBcc('primary@example.com', 'cc1@example.com,cc2@example.com', 'bcc@example.com', 'Отчет за неделю', 'Текст отчета...');Отправка email с вложениями: добавление файлов из Google Drive
Метод sendEmail позволяет прикреплять файлы. Чаще всего файлы берутся из Google Drive. Для этого необходимо получить файл как объект Blob.
/**
* Отправляет письмо с вложением из Google Drive.
*
* @param {string} recipient Получатель.
* @param {string} subject Тема.
* @param {string} body Тело письма.
* @param {string} fileId Идентификатор файла на Google Drive.
*/
function sendEmailWithAttachment(recipient: string, subject: string, body: string, fileId: string): void {
try {
const file = DriveApp.getFileById(fileId);
if (!file) {
Logger.log(`Файл с ID ${fileId} не найден.`);
return;
}
const fileBlob = file.getBlob(); // Получаем файл как Blob
MailApp.sendEmail(recipient, subject, body, {
attachments: [fileBlob] // Вложения передаются массивом Blob
});
Logger.log(`Письмо с вложением ${file.getName()} отправлено на ${recipient}`);
} catch (error) {
Logger.log(`Ошибка отправки письма с вложением: ${error}`);
}
}
// Пример использования (замените 'YOUR_FILE_ID' на реальный ID файла):
// sendEmailWithAttachment('client@example.com', 'Ваш отчет', 'Добрый день, во вложении отчет.', 'YOUR_FILE_ID');Использование дополнительных параметров (options) для настройки отправки
Объект options позволяет гибко настраивать отправку:
cc: Строка с адресами для копии (через запятую).
bcc: Строка с адресами для скрытой копии (через запятую).
htmlBody: Строка с HTML-версией тела письма.
attachments: Массив объектов Blob для вложений.
name: Имя отправителя, которое будет отображаться у получателя.
replyTo: Адрес для ответа (если отличается от адреса отправителя).
noReply: Если true, добавляет заголовок Precedence: bulk и может помочь избежать автоответчиков (не гарантировано).
/**
* Демонстрация использования различных опций при отправке.
*
* @param {string} recipient Получатель.
*/
function sendWithAdvancedOptions(recipient: string): void {
try {
const reportFile = DriveApp.getFileById('YOUR_REPORT_FILE_ID'); // Замените ID
const imageFile = DriveApp.getFileById('YOUR_IMAGE_FILE_ID'); // Замените ID
MailApp.sendEmail({
to: recipient,
cc: 'manager@example.com',
subject: 'Ежедневный отчет по кампаниям',
body: 'Добрый день! Во вложении отчет и график.', // Текстовая версия для клиентов без HTML
htmlBody: 'Добрый день!
Во вложении ежедневный отчет по рекламным кампаниям и график эффективности.
',
attachments: [reportFile.getBlob()],
inlineImages: {
reportImage: imageFile.getBlob() // Встраивание изображения в HTML
},
name: 'Система Автоматических Отчетов',
replyTo: 'noreply@example.com',
// noReply: true
});
Logger.log('Письмо с расширенными опциями отправлено.');
} catch (error) {
Logger.log(`Ошибка при отправке с расширенными опциями: ${error}`);
}
}Использование HTML Service для создания сложных шаблонов писем
Для генерации сложного HTML-содержимого писем, особенно с динамическими данными, рекомендуется использовать HtmlService. Он позволяет создавать HTML-шаблоны, обрабатывать их на стороне сервера с помощью скриптлетов (<? ... ?>) и получать готовую HTML-строку для htmlBody.
/**
* Отправляет письмо, используя HTML-шаблон.
*
* @param {string} recipient Получатель.
* @param {object} templateData Данные для подстановки в шаблон.
*/
function sendEmailFromTemplate(recipient: string, templateData: object): void {
try {
// Загружаем шаблон из HTML-файла (например, 'EmailTemplate.html' в проекте)
const htmlTemplate = HtmlService.createTemplateFromFile('EmailTemplate');
// Передаем данные в шаблон
htmlTemplate.data = templateData;
// Получаем готовый HTML
const htmlBody = htmlTemplate.evaluate().getContent();
MailApp.sendEmail(recipient, 'Персонализированное предложение', '', {
htmlBody: htmlBody,
name: 'Маркетинговый отдел'
});
Logger.log('Письмо из шаблона отправлено.');
} catch (error) {
Logger.log(`Ошибка отправки из шаблона: ${error}`);
}
}
// Пример использования:
/*
// Содержимое EmailTemplate.html:
Здравствуйте, !
У нас есть специальное предложение для вас по продукту: .
Скидка: %
*/
// sendEmailFromTemplate('customer@example.com', { name: 'Иван', product: 'XYZ', discount: 15 });Автоматизация отправки электронной почты с помощью триггеров
Триггеры позволяют запускать функции Apps Script автоматически по расписанию или в ответ на определенные события.
Настройка триггеров, запускаемых по времени (time-driven triggers)
Такие триггеры запускают функцию через заданные интервалы времени (ежеминутно, ежечасно, ежедневно, еженедельно и т.д.). Настраиваются в редакторе скриптов во вкладке "Триггеры".
Пример: Ежедневная отправка отчета.
/**
* Функция для ежедневной отправки отчета (запускается триггером).
*/
function sendDailyReport(): void {
const recipient = 'manager@example.com';
const subject = `Ежедневный отчет за ${new Date().toLocaleDateString()}`;
const body = generateReportBody(); // Функция, генерирующая текст отчета
sendSimpleEmail(recipient, subject, body);
}
/**
* Генерирует тело отчета (заглушка).
* @returns {string} Тело отчета.
*/
function generateReportBody(): string {
// Здесь логика сбора данных, например, из Google Sheets или Analytics
const impressions = 15000;
const clicks = 300;
const ctr = ((clicks / impressions) * 100).toFixed(2);
return `Отчет по контекстной рекламе:
Показы: ${impressions}
Клики: ${clicks}
CTR: ${ctr}%`;
}
// Для настройки: зайдите в 'Триггеры', 'Добавить триггер',
// выберите 'sendDailyReport', источник 'Триггер по времени',
// тип 'Таймер на день', установите время.Отправка писем на основе событий в Google Sheets или Google Forms
Триггеры могут запускаться при событиях, таких как редактирование ячейки в Google Sheets (onEdit) или отправка формы Google Forms (onFormSubmit).
Пример: Уведомление при заполнении формы.
/**
* Отправляет уведомление при отправке Google Form.
* Устанавливается как триггер 'On form submit' для таблицы,
* связанной с формой.
*
* @param {GoogleAppsScript.Events.SheetsOnFormSubmit} e Объект события.
*/
function notifyOnFormSubmit(e: GoogleAppsScript.Events.SheetsOnFormSubmit): void {
// e.namedValues содержит объект с вопросами и ответами формы
// {'Имя': ['Анна'], 'Email': ['anna@example.com'], ...}
const userEmail = e.namedValues['Email'] ? e.namedValues['Email'][0] : null;
const userName = e.namedValues['Имя'] ? e.namedValues['Имя'][0] : 'Клиент';
if (!userEmail) {
Logger.log('Email не найден в ответе формы.');
return;
}
const subject = 'Спасибо за вашу заявку!';
const htmlBody = `Уважаемый(ая) ${userName},
Мы получили вашу заявку и скоро свяжемся с вами.
`;
sendHtmlEmail(userEmail, subject, htmlBody);
// Можно также отправить уведомление администратору
const adminEmail = 'admin@example.com';
const adminSubject = 'Новая заявка с формы';
const adminBody = `Получена новая заявка:
Имя: ${userName}
Email: ${userEmail}
Ответы: ${JSON.stringify(e.namedValues)}`;
sendSimpleEmail(adminEmail, adminSubject, adminBody);
}Примеры автоматической отправки уведомлений или отчетов
Примеры выше демонстрируют типичные сценарии: отправка регулярных отчетов менеджерам или клиентам (time-driven) и отправка подтверждений или уведомлений пользователям и администраторам при взаимодействии с формами или таблицами (event-driven).
Обработка ошибок и лучшие практики
Обработка исключений при отправке электронной почты
Всегда оборачивайте вызовы MailApp.sendEmail() в блок try...catch. Это позволит перехватывать ошибки (например, невалидный адрес, превышение квоты) и корректно их обрабатывать или логировать, не прерывая выполнение всего скрипта.
function safeSendEmail(recipient: string, subject: string, body: string): boolean {
try {
MailApp.sendEmail(recipient, subject, body);
Logger.log(`Письмо успешно отправлено на ${recipient}`);
return true;
} catch (error) {
// Логирование ошибки для последующего анализа
console.error(`Ошибка отправки письма на ${recipient}: ${error.message}`);
// Logger.log(`Ошибка отправки письма на ${recipient}: ${error.toString()}`);
// Можно добавить отправку уведомления администратору об ошибке
// MailApp.sendEmail('admin@example.com', 'Ошибка отправки Email', `Не удалось отправить письмо на ${recipient}. Ошибка: ${error.toString()}`);
return false;
}
}Ограничения Google Apps Script на отправку писем и способы их обхода
Google накладывает квоты на количество отправляемых писем для предотвращения спама. Квоты зависят от типа аккаунта (Gmail, Google Workspace).
Количество получателей в день: Обычно 100 для @gmail.com и 1500 для Google Workspace.
Количество писем в день: Квота общая с Gmail.
Количество получателей за вызов: Ограничено.
Объем письма: Ограничен (включая вложения).
Актуальные квоты можно найти в официальной документации Google Apps Script.
Способы обхода (частичного):
Паузы: При отправке большого количества писем в цикле используйте Utilities.sleep() для добавления задержек между отправками, чтобы не превысить лимиты скорости.
Очередь: Создайте очередь задач (например, в Google Sheets) и обрабатывайте ее порциями с помощью триггеров по времени.
GmailApp: Сервис GmailApp имеет схожие, но иногда чуть более высокие квоты и больше возможностей (работа с черновиками, метками), но требует других разрешений.
Сторонние сервисы: Для массовых рассылок рекомендуется использовать специализированные email-сервисы (SendGrid, Mailgun и т.д.), интегрируясь с ними через UrlFetchApp.
Рекомендации по безопасности при работе с электронной почтой в Google Apps Script
Авторизация: Будьте осторожны при предоставлении разрешений скриптам. Убедитесь, что скрипт запрашивает только необходимые доступы.
Конфиденциальные данные: Не храните email-адреса, API-ключи или другие чувствительные данные непосредственно в коде. Используйте PropertiesService для хранения настроек.
Валидация ввода: При отправке писем на адреса, полученные из внешних источников (формы, таблицы), всегда валидируйте их формат.
Избегайте спама: Не используйте GAS для массовых нежелательных рассылок. Соблюдайте правила CAN-SPAM и GDPR, предоставляйте возможность отписки.