Что такое Google Apps Script и зачем он нужен для работы с Gmail
Google Apps Script – это облачная платформа для автоматизации задач и интеграции различных сервисов Google, включая Gmail. Он позволяет создавать скрипты, которые могут автоматически обрабатывать входящие и исходящие письма, включая работу с вложениями. Это может быть полезно для:
- Автоматического сохранения вложений из определенных писем.
- Извлечения данных из вложений (например, CSV-файлов).
- Автоматической отправки писем с вложениями на основе определенных событий.
- Организации и фильтрации вложений.
Вместо ручного скачивания и обработки каждого вложения, вы можете написать скрипт, который сделает это автоматически, экономя ваше время и усилия.
Необходимые разрешения и настройка скрипта для доступа к Gmail
Для работы с Gmail через Google Apps Script необходимо предоставить скрипту соответствующие разрешения. При первом запуске скрипта, обращающегося к Gmail API, система запросит у вас подтверждение доступа. Убедитесь, что вы понимаете, какие разрешения запрашивает скрипт, прежде чем их предоставлять.
Чтобы начать, откройте редактор Google Apps Script (script.google.com) и создайте новый проект. Далее, чтобы получить доступ к Gmail, вам не требуется явное включение Gmail API – базовые функции доступны сразу через встроенный объект GmailApp.
Получение вложений из писем Gmail
Поиск писем с вложениями по различным критериям (отправитель, тема, дата)
Прежде чем работать с вложениями, необходимо найти нужные письма. GmailApp предоставляет различные методы для поиска писем, например, search(). Этот метод принимает поисковый запрос в формате Gmail API.
/**
* Ищет письма с вложениями от конкретного отправителя за последний месяц.
* @param {string} sender - Адрес электронной почты отправителя.
* @return {GmailThread[]} - Массив найденных потоков писем.
*/
function findEmailsWithAttachments(sender: string): GmailThread[] {
const now = new Date();
const oneMonthAgo = new Date(now.getFullYear(), now.getMonth() - 1, now.getDate());
const searchQuery = `from:${sender} has:attachment after:${oneMonthAgo.toISOString().slice(0, 10)}`;
const threads = GmailApp.search(searchQuery);
return threads;
}
const senderEmail = 'example@example.com';
const threadsWithAttachments = findEmailsWithAttachments(senderEmail);
Logger.log(threadsWithAttachments.length + ' потоков писем найдено.');
Извлечение вложений из найденных писем: основы работы с Blob
После того как письма найдены, нужно извлечь вложения. Каждое вложение в Gmail представляется в виде объекта Blob. Blob – это объект, представляющий собой неизменяемый, похожий на файл, набор данных. Он позволяет получить доступ к содержимому вложения, его имени, типу и размеру.
/**
* Извлекает вложения из потока писем.
* @param {GmailThread} thread - Поток писем.
* @return {Blob[]} - Массив Blob-объектов, представляющих вложения.
*/
function getAttachmentsFromThread(thread: GmailThread): Blob[] {
const messages = thread.getMessages();
let attachments: Blob[] = [];
for (let i = 0; i < messages.length; i++) {
const message = messages[i];
const messageAttachments = message.getAttachments();
attachments = attachments.concat(messageAttachments);
}
return attachments;
}
const attachments = getAttachmentsFromThread(threadsWithAttachments[0]);
Logger.log(attachments.length + ' вложений найдено.');
Обработка нескольких вложений в одном письме
При обработке писем важно учитывать, что одно письмо может содержать несколько вложений. Код выше демонстрирует конкатенацию вложений из каждого сообщения в треде в общий массив, что позволяет итерироваться по всем найденным вложениям.
Сохранение и обработка полученных вложений
Сохранение вложений на Google Drive (или другое хранилище)
Самый распространенный сценарий – сохранение вложений на Google Drive. Для этого используется сервис DriveApp. Прежде чем сохранять, убедитесь, что у вас есть папка, в которую вы хотите сохранять вложения.
/**
* Сохраняет вложение на Google Drive.
* @param {Blob} attachment - Blob-объект, представляющий вложение.
* @param {string} folderId - ID папки на Google Drive, куда нужно сохранить вложение.
*/
function saveAttachmentToDrive(attachment: Blob, folderId: string): void {
const folder = DriveApp.getFolderById(folderId);
folder.createFile(attachment);
Logger.log('Вложение сохранено: ' + attachment.getName());
}
const folderId = 'YOUR_FOLDER_ID'; // Замените на ID вашей папки
attachments.forEach(attachment => saveAttachmentToDrive(attachment, folderId));
Переименование вложений перед сохранением
Иногда требуется переименовать вложения перед сохранением, чтобы дать им более понятные имена или добавить префикс/суффикс.
/**
* Переименовывает вложение и сохраняет его на Google Drive.
* @param {Blob} attachment - Blob-объект, представляющий вложение.
* @param {string} folderId - ID папки на Google Drive.
* @param {string} newName - Новое имя файла.
*/
function renameAndSaveAttachment(attachment: Blob, folderId: string, newName: string): void {
const folder = DriveApp.getFolderById(folderId);
const newAttachment = attachment.setName(newName);
folder.createFile(newAttachment);
Logger.log('Вложение сохранено как: ' + newName);
}
const newFileName = 'Префикс_' + attachments[0].getName();
renameAndSaveAttachment(attachments[0], folderId, newFileName);
Чтение содержимого текстовых вложений (например, TXT, CSV)
Если вложение является текстовым файлом (например, TXT или CSV), можно прочитать его содержимое непосредственно из Blob.
/**
* Читает содержимое текстового вложения.
* @param {Blob} attachment - Blob-объект, представляющий текстовое вложение.
* @return {string} - Содержимое текстового файла.
*/
function readTextAttachmentContent(attachment: Blob): string {
const content = attachment.getDataAsString();
return content;
}
if (attachments[0].getContentType() === 'text/plain') {
const textContent = readTextAttachmentContent(attachments[0]);
Logger.log('Содержимое текстового файла: ' + textContent);
}
Примеры обработки вложений различных типов (изображения, документы)
В зависимости от типа вложения, может потребоваться различная обработка. Для изображений можно использовать сервисы для изменения размера или формата. Для документов Google Docs можно использовать DocumentApp для чтения и редактирования содержимого.
Отправка писем с вложениями
Создание и отправка письма с вложением из Google Drive
Google Apps Script позволяет отправлять письма с вложениями, используя файлы, хранящиеся на Google Drive.
/**
* Отправляет письмо с вложением из Google Drive.
* @param {string} recipient - Адрес электронной почты получателя.
* @param {string} subject - Тема письма.
* @param {string} body - Тело письма.
* @param {string} fileId - ID файла на Google Drive, который нужно прикрепить.
*/
function sendEmailWithDriveAttachment(recipient: string, subject: string, body: string, fileId: string): void {
const file = DriveApp.getFileById(fileId);
GmailApp.sendEmail(recipient, subject, body, {
attachments: [file.getAs(file.getMimeType())]
});
Logger.log('Письмо отправлено с вложением.');
}
const recipientEmail = 'recipient@example.com';
const emailSubject = 'Письмо с вложением из Drive';
const emailBody = 'Это письмо содержит вложение из Google Drive.';
const driveFileId = 'YOUR_FILE_ID'; // Замените на ID вашего файла
sendEmailWithDriveAttachment(recipientEmail, emailSubject, emailBody, driveFileId);
Создание и отправка письма с вложением, сгенерированным скриптом
Можно создавать вложения «на лету», генерируя данные непосредственно в скрипте.
/**
* Отправляет письмо с вложением, сгенерированным скриптом.
* @param {string} recipient - Адрес электронной почты получателя.
* @param {string} subject - Тема письма.
* @param {string} body - Тело письма.
*/
function sendEmailWithGeneratedAttachment(recipient: string, subject: string, body: string): void {
const csvData = "Name,Age\nJohn,30\nJane,25";
const blob = Utilities.newBlob(csvData, 'text/csv', 'data.csv');
GmailApp.sendEmail(recipient, subject, body, {
attachments: [blob]
});
Logger.log('Письмо отправлено с сгенерированным вложением.');
}
sendEmailWithGeneratedAttachment('recipient@example.com', 'Generated Attachment', 'See attached CSV');
Добавление нескольких вложений к одному письму
Чтобы добавить несколько вложений, передайте массив Blob-объектов в параметре attachments функции sendEmail().
Расширенные возможности и полезные примеры
Автоматическая обработка входящих вложений (триггеры)
Google Apps Script позволяет создавать триггеры, которые автоматически запускают скрипты при наступлении определенных событий, например, при получении нового письма. Это позволяет автоматизировать обработку входящих вложений. Для этого можно использовать триггер «On form submit» (при отправке формы) или «On change» (при изменении). Для Gmail API, чаще всего, используется workaround — скрипт запускается по таймеру (например, каждый час) и проверяет новые письма, обрабатывая вложения при их наличии.
Фильтрация вложений по размеру и типу
Перед сохранением вложений может быть полезно отфильтровать их по размеру или типу, чтобы избежать обработки нежелательных файлов.
/**
* Фильтрует вложения по типу.
* @param {Blob[]} attachments - Массив Blob-объектов.
* @param {string} contentType - Тип контента для фильтрации (например, 'image/jpeg').
* @return {Blob[]} - Массив отфильтрованных Blob-объектов.
*/
function filterAttachmentsByType(attachments: Blob[], contentType: string): Blob[] {
return attachments.filter(attachment => attachment.getContentType() === contentType);
}
const imageAttachments = filterAttachmentsByType(attachments, 'image/jpeg');
Logger.log(imageAttachments.length + ' изображений найдено.');
Логирование и обработка ошибок при работе с вложениями
При работе с вложениями важно предусмотреть обработку ошибок и логирование, чтобы отслеживать возможные проблемы. Используйте блоки try...catch для перехвата исключений и Logger.log() для записи информации о ходе выполнения скрипта. Также можно использовать console.error() для логирования ошибок. Это позволит вам быстро выявлять и устранять проблемы в вашем скрипте.