2

Я использую RSS2Email to turn Gmail into Google Reader.Как создать сообщение Gmail с определенным ярлыком?

Я хотел бы создать Google Apps Script, чтобы сделать это вместо того, чтобы получить два преимущества:

  1. Планирование будет обрабатываться Google Apps Script. (Нет необходимости иметь выделенный компьютер для запуска сценария.)

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

Использование сценария Google Apps будет таким же способом реализации, как, например, Gmail Snooze.


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

  1. Gmail Service for Google Apps Scripts не допускает этого, по крайней мере, не очевидно.
    • GmailApp.sendEmail не позволяет указать метку. Это имеет смысл, поскольку это для общей отправки электронной почты. Но ...
    • GmailApp.sendEmail возвращает GmailApp, а не то, что вы могли бы использовать для идентификации сообщения и изменения его метки позже.
    • Служба также не позволяет программным образом создавать фильтры Gmail, исключая еще один возможный способ решения этой проблемы.
  2. Gmail Migration API будет идеально подходит для этого, но он не работает для обычных учетных записей Gmail для потребителей. Гах.
  3. IMAP extensions Google может это допускать, но это мне непонятно.

Я полагаю, что я мог бы использовать 1, помещая некоторый UID в тему, которую я мог бы использовать, чтобы найти доставленное сообщение, чтобы добавить метку (и, надеюсь, не обнулить Субъект, удалив UID). Но это кажется немного клочковым.

Использование 3 расширений IMAP, по-видимому, возможно менее клочковое, хотя, вероятно, гораздо больше работы по кодированию и тестированию.

Любые рекомендации среди них? Есть ли другой API или стратегия?

+0

Я думал о трюк UID-в-Subject тоже. И я согласен: уродливый. Только последний курорт. – offby1

+0

Помимо уродства, я беспокоюсь о задержке после вызова 'GmailApp.sendEmail' и доступен в почтовом ящике для поиска. –

+0

Чем больше я думаю об этом, тем больше я думаю, что IMAP - это правильный путь. Это просто «тяжелее», чем я надеялся сделать в среде скриптов Google Apps. –

ответ

4

Служб Google Script GmailApp API не дать способ добавить ярлык к сообщению по мере его отправки, что-то, что вы может сделать из пользовательского интерфейса.Это отображается как Issue 1859 в журнале отслеживания проблем, посещает и запускает его для обновления.

Обход должен был бы использовать поток apis. Если сообщение отправлено слепым (bcc'd) отправителю, оно также будет отображаться как новое сообщение в папке «Входящие», где мы можем использовать getInboxThreads(), чтобы найти его. Добавьте метку в этот поток и, возможно, пометите ее, затем заархивируйте.

Код available as a gist.

/** 
* An alternative to GmailApp.sendEmail(), which applies a 
* label to the message thread in the sender's account. 
* 
* Sends an email message with optional arguments. The email can 
* contain plain text or an HTML body. The size of the email 
* (including headers, but excluding attachments) may not 
* exceed 20KB. 
* 
* @param {String} recipient the addresses of the recipient 
* @param {String} subject  the subject line 
* @param {String} body   the body of the email 
* @param {Object} options  a JavaScript object that specifies 
*        advanced parameters, as documented 
*        for GmailApp.sendEmail() 
* @param {String} label  the label to be applied 
*/ 
function sendAndLabel(recipient, subject, body, options, label) { 
    var sender = Session.getActiveUser().getEmail(); 

    // Add sender to bcc list 
    if (options.bcc) { 
    options.bcc = options.bcc.split(',').concat(sender).join(','); 
    } 
    else { 
    options.bcc = sender; 
    } 

    GmailApp.sendEmail(recipient, subject, body, options) 

    // Check if label already exists, create if it doesn't 
    var newLabel = GmailApp.getUserLabelByName(label); 
    if (!newLabel) newLabel = GmailApp.createLabel(label); 

    // Look for our new message in inbox threads 
    Utilities.sleep(2000); // Wait for message to be received 
    var inboxThreads = GmailApp.getInboxThreads(); 
    for (var t = 0; t < inboxThreads.length; t++) { 
    var foundSubject = inboxThreads[t].getFirstMessageSubject(); 
    var numLabels = inboxThreads[t].getLabels().length; // Could add more criteria 
    if (foundSubject === subject && numLabels === 0) { 
     // Found our thread - label it 
     inboxThreads[t].addLabel(newLabel) 
        .markRead() 
        .moveToArchive(); 
     break; 
    } 
    } 
} 

Пример использования:

function test_sendAndLabel() { 
    var recipient = Session.getActiveUser().getEmail(); 
    var subject = "Test Labelling"; 
    var body = "This email is testing message labelling."; 
// var options = {bcc:"[email protected]"}; 
    var options = {}; 
    var label = "LabelTest"; 
    sendAndLabel(recipient, subject, body, options, label); 
} 
1

Да, IMAP - это правильный путь. Вы можете найти стороннюю IMAP-библиотеку, чтобы упростить вашу работу.

команду, чтобы добавить этикетку является: STORE 123 + X-GM-ЭТИКЕТКИ (yourLabel)

Официальные документы о ярлыке Gmail:

https://developers.google.com/google-apps/gmail/imap_extensions#access_to_gmail_labels_x-gm-labels

+0

Мы создали клиент Gmail на основе IMAP, включая манипуляции с метками. Поэтому я уверен, что IMAP может решить вашу проблему. – skyfree

+0

Согласовано. К сожалению, я не вижу, как разговаривать с IMAP из среды скриптов Google Apps. AFAICT не только не существует службы IMAP, для меня нет службы TCP для ее низкого уровня. 'UrlFetchApp' является таким же общим, как и он, и это только для HTTP. –

+0

Вы можете использовать стандартный протокол [IMAP protocol] (http://tools.ietf.org/html/rfc3501) для управления вашим gmail, а также расширения GMail IMAP. Протокол IMAP не полагается на HTTP, демонстрационный код, подобный этому: imapClient.ConnectSsl («imap.gmail.com», 993); сложной частью IMAP является аутентификация XOAUTH. – skyfree