Google GMail API - users.messages.import () отсутствует в INBOX Почему? - PullRequest
0 голосов
/ 27 мая 2018

Я импортирую сообщение напрямую, используя API-интерфейс GMAil. Когда я просматриваю учетную запись пользователя GMail (браузерное приложение GMail), я вижу это сообщение, полученное во всех письмах, но не в папке INBOX

Google GMailСостояния API: Users.messages.import ()

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

Поскольку сообщение лежит там, я не могу получить его из Mail.app (OSX) или Outlook (MS), поскольку оно не считается новым сообщением ...правда ?в любом случае, чтобы решить эту проблему?

Вот функция, которую я использую для импорта нового сообщения

        unction gMailInserMessage (sender_name, sender_email, msg_text) {

      // Create a new JWT client using the key file downloaded from the Google Developer Console
      const jwtClient = new google.auth.JWT(
        postoffice_key.client_email,
        null,
        postoffice_key.private_key,
        _.values(config_key.scopes.postoffice),
        config_key.contact_email // subject (or sub) impersonated user
      );

      return jwtClient.authorize().then(tokens => {
          // Obtain a new gmail client, making sure we pass along the auth client
          const gmail = google.gmail({
            version: 'v1',
            auth: jwtClient
           });

          const subject = '? CONTACT ?';
          const utf8Subject = `=?utf-8?B?${Buffer.from(subject).toString('base64')}?=`;
          const messageParts = [
            'From: ' + sender_name + '<' + sender_email + '>',
            'To: Contact Box <' + config_key.contact_email + '>',
            'Content-Type: text/html; charset=utf-8',
            `Subject: ${utf8Subject}`,
            '',
            'A new contact message just to say hello.',
            'So... <b>Hello!</b>  ?❤️?'
          ];
          const message = messageParts.join('\n');

          // The body needs to be base64url encoded.
          const encodedMessage = Buffer.from(message)
          .toString('base64')
          .replace(/\+/g, '-')
          .replace(/\//g, '_')
          .replace(/=+$/, '');

          //Make an authorized request to import a User Messages
          return gmail.users.messages.import({
            userId: 'me',
            resource: {
              raw: encodedMessage
            }
          });
      }).then(res => {
        // console.log('RES: ', res)
        return res.data;
      });
    }

Вот ответ, который я получаю из запросов

                RES:  { status: 200,
              statusText: 'OK',
              headers: 
               { 'cache-control': 'no-cache, no-store, max-age=0, must-revalidate',
                 pragma: 'no-cache',
                 expires: 'Mon, 01 Jan 1990 00:00:00 GMT',
                 date: 'Sun, 27 May 2018 10:00:12 GMT',
                 etag: '"Mr5Glppow16hK9x9KiNoxDVbWS4/98vlvSafvJVr4JD8evQ2SHoRCuQ"',
                 vary: 'Origin, X-Origin',
                 'content-type': 'application/json; charset=UTF-8',
                 'x-content-type-options': 'nosniff',
                 'x-frame-options': 'SAMEORIGIN',
                 'x-xss-protection': '1; mode=block',
                 server: 'GSE',
                 'alt-svc': 'hq=":443"; ma=2592000; quic=51303433; quic=51303432; quic=51303431; quic=51303339; quic=51303335,quic=":443"; ma=2592000; v="43,42,41,39,35"',
                 connection: 'close',
                 'transfer-encoding': 'chunked' },
              config: 
               { adapter: [Function: httpAdapter],
                 transformRequest: { '0': [Function: transformRequest] },
                 transformResponse: { '0': [Function: transformResponse] },
                 timeout: 0,
                 xsrfCookieName: 'XSRF-TOKEN',
                 xsrfHeaderName: 'X-XSRF-TOKEN',
                 maxContentLength: 2147483648,
                 validateStatus: [Function],
                 headers: 
                  { Accept: 'application/json, text/plain, */*',
                    'Content-Type': 'application/json;charset=utf-8',
                    'Accept-Encoding': 'gzip',
                    'User-Agent': 'google-api-nodejs-client/31.0.2 (gzip)',
                    Authorization: 'Bearer ya29.GoEByAXKR5aJgJanVZebkHwurMcOn6FB4ymK9BZqmi_0K0uMPK_1AJAL-EQa0ajz1OBDoJE1cWAyRzprOYbDnJrnpusrPfFSL7HuBmMqXFULxEKECedOb5pKwkTFA9CffIZS1Fg1uwuGcsgUqO98XOkYeRh9ul7icvBpuzUgaML0SVJN',
                    'Content-Length': 397 },
                 method: 'post',
                 url: 'https://www.googleapis.com/gmail/v1/users/me/messages/import',
                 paramsSerializer: [Function],
                 data: '{"raw":"RnJvbTogTW1lIElzYWJlbGxlIER1Zm91ciA8ZHVmb3VyaXNhYmVsbGVAb3JhbmdlLmZyPgpUbzogQ29udGFjdCBCb3ggPHl2ZXNkdWZvdXJAbGVjaG9yb2Rlc2NoYXJlbnRlcy5vcmc-CkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ck1JTUUtVmVyc2lvbjogMS4wClN1YmplY3Q6ID0_dXRmLTg_Qj84SitrbUNCRFQwNVVRVU5VSVBDZnBKZz0_PQoKVGhpcyBpcyBhIE5FVyBORVcgbWVzc2FnZSBqdXN0IHRvIHNheSBoZWxsby4KU28uLi4gPGI-SGVsbG8hPC9iPiAg8J-kmOKdpO-4j_CfmI4"}',
                 params: { internalDateSource: 'dateHeader' } },

1 Ответ

0 голосов
/ 28 мая 2018

Решены все проблемы, возникающие при попытке использовать функцию Firebase для обработки контактной формы сайта.

1 - Используя GCP, в моем проекте Firebase я создал служебную учетную запись с именем 'postoffice' в DomainWide Delegation, загрузил учетные данные в формате JSON в functions / postoffice-key.json 2 - Я включил GMail API для проекта 3 - Я работаю с областями и адресами электронной почты в другой функции / config-key.json

4. В консоли администратора GSuite («Безопасность»> «Дополнительные настройки»> «Управление клиентским доступом API») я добавил clientId из файла postoffice-key.json с авторизованными областями действия

5 - я написал новую функцию Firebase HTTPS: newContactMessage ()

    const functions = require('firebase-functions');
    const admin = require('firebase-admin');
    admin.initializeApp();

    const { google } = require('googleapis');
    const path = require('path');
    const _ = require('lodash');

    var Buffer = require('buffer/').Buffer  // note: the trailing slash is important!

    // KEY FILES
    const postoffice_key = require('./postoffice-key.json');
    const config_key = require('./config-key.json');

    function gMailInsertContactMessage (sender_name, sender_email, msg_text) {

      // Create a new JWT client using the key file downloaded from the Google Developer Console
      const jwtClient = new google.auth.JWT(
        postoffice_key.client_email,
        null,
        postoffice_key.private_key,
        _.values(config_key.scopes.postoffice),
        config_key.admin_email // subject (or sub) impersonated user
      );

      return jwtClient.authorize().then(tokens => {
          // Obtain a new gmail client, making sure we pass along the auth client
          const gmail = google.gmail({
            version: 'v1',
            auth: jwtClient
           });

          const subject = '? CONTACT ?';
          const utf8Subject = `=?utf-8?B?${Buffer.from(subject).toString('base64')}?=`;
          const messageParts = [
            'From: "Administrator" <' + config_key.admin_email + '>',
            'To: "Contact Box" <' + config_key.contact_email + '>',
            'Reply-To: "' + sender_name + '" <' + sender_email + '>',
            'Content-Type: text/html; charset=utf-8',
            'MIME-Version: 1.0',
            `Subject: ${utf8Subject}`,
            '',
            '<h2>MESSAGE</h2>',
            '<p>' + msg_text + '</p>'
          ];
          const message = messageParts.join('\n');

          // The body needs to be base64url encoded.
          const encodedMessage = Buffer.from(message)
          .toString('base64')
          .replace(/\+/g, '-')
          .replace(/\//g, '_')
          .replace(/=+$/, '');

          //Make an authorized request to import a User Messages
          return gmail.users.messages.send({
            userId: 'me',
            resource: {
              raw: encodedMessage
            }
          });
      }).then(res => {
        // console.log('RES: ', res)
        return res.data;
      });
    }

    // FIREBASE HTTP FUNCTIONS ==================

    exports.newContactMessage = functions.https.onRequest((req, res) => {
      const sender_name = 'Mrs Jenny Doe'
      const sender_email = 'jenny.doe@example.com'
      const sender_msg = 'Hello, how are you overthere ?'
      gMailInsertContactMessage(sender_name, sender_email, sender_msg).then((res) => {
        return { status: 200, infos: res };
      }, error => {
        return {status: error.status, infos: error.message};
      }).then(response => {
        return res.send(response);
      }).catch(console.error);
    });

тестовый запрос:

curl -v https://us-central1-myproject.cloudfunctions.net/newContactMessage

Возвращает функцию Firebase:

{"status":200,"infos"
{"id":"163a5738080e3ee9","threadId":"163a5738080e3ee9","labelIds":["SENT"]}}

В приложении Mail.app на моем компьютере я вижу поле От: являющийся владельцем проекта (Администратор), поле Кому: являющееся контактным лицом (contact@mysite.org и поле Ответить-на: являющееся Cконтактная форма отправителя электронной почты ... легко ответить ..!и содержание сообщения!

Надеюсь, что это поможет ... (я должен отредактировать заголовок вопроса?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...