Вытащить Gmail данные от "mailer-damon" и "from: postmaster" на листы Google? - PullRequest
1 голос
/ 11 марта 2020

Я наткнулся на код ниже в статье. Я попытался изменить его (q: "from:mailer-daemon OR from:postmaster",), чтобы код мог извлекать не только mailer-daemon, но и postmaster электронные письма. Однако он обрабатывал данные по-разному для postmaster электронных писем (postmaster электронные письма получателей были указаны в столбце «Причина отказов» вместе с причиной). Я также хотел бы, чтобы он извлек ярлык, созданный в Gmail, который называется «Удалить из CMM C Список», но я не уверен, как это сделать.

Столбец называет эти данные Подразделяются на:

Bounce Date
Email Recipient
Error Status
Bounce Reason
Gmail Link

Исходный код, который необходимо изменить:

/*
* Gmail Bounce Report
* u/labnol Feb 12, 2020
* Written by Amit Agarwal
* email: amit@labnol.org
* twitter: u/labnol
* web: www.labnol.org
*/

const toast_ = e => SpreadsheetApp.getActiveSpreadsheet().toast(e);

const parseMessage_ = messageId => {
    const message = GmailApp.getMessageById(messageId);
    const body = message.getPlainBody();
    const [, failAction] = body.match(/^Action:\s*(.+)/m) || [];

    if (failAction === "failed") {
        const emailAddress = message.getHeader("X-Failed-Recipients");
        const [, errorStatus] = body.match(/^Status:\s*([.\d]+)/m) || [];
        const [, , bounceReason] =
            body.match(/^Diagnostic-Code:\s*(.+)\s*;\s*(.+)/m) || [];

        if (errorStatus && bounceReason) {
            return [
                message.getDate(),
                emailAddress,
                errorStatus,
                bounceReason.replace(/\s*(Please|Learn|See).+$/, ""),
                `=HYPERLINK("${message.getThread().getPermalink()}";"View")`
            ];
        }
    }
    return false;
};

const writeBouncedEmails_ = (data = []) => {
    if (data.length > 0) {
        toast_("Writing data to Google Sheet..");
        const sheet = SpreadsheetApp.getActiveSheet();

        sheet
            .getRange(3, 1, sheet.getLastRow(), sheet.getLastColumn())
            .clearContent();
        sheet.getRange(3, 1, data.length, data[0].length).setValues(data);

        SpreadsheetApp.flush();
        toast_("Bounce Report is ready!");
        showCredit_();
    }
};

const findBouncedEmails_ = () => {
    try {
        const rows = [];
        const { messages = [] } = Gmail.Users.Messages.list("me", {
            q: "from:mailer-daemon",
            maxResults: 200
        });

        if (messages.length === 0) {
            toast_("No bounced emails found in your mailbox!");
            return;
        }

        toast_("Working..");

        for (let m = 0; m < messages.length; m += 1) {
            const bounceData = parseMessage_(messages[m].id);

            if (bounceData) {
                rows.push(bounceData);
            }

            if (rows.length % 10 === 0) {
                toast_(`${rows.length} bounced emails found so far..`);
            }
        }
        writeBouncedEmails_(rows);
    } catch (error) {
        toast_(error.toString());
    }
};

const onOpen = e => {
    SpreadsheetApp.getUi()
        .createMenu("??‍♂️ Bounced Emails")
        .addItem("Run Report", "findBouncedEmails_")
        .addSeparator()
        .addItem("Credits", "showCredit_")
        .addToUi();
};

const showCredit_ = () => {
    const template = HtmlService.createHtmlOutputFromFile("help");
    const html = template
        .setTitle("Bounce Report for Gmail")
        .setWidth(460)
        .setHeight(225);
    SpreadsheetApp.getActiveSpreadsheet().show(html);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...