• BSA Lab.
      home

  • apps
    Главная
  • contacts
    Об авторе
  • library_books
    Блог
  • shop
    Портфолио
    keyboard_arrow_down
    • Google API
    • Gapi-People
      wc
    • Gapi-Email
      mail_outline
    • Gapi-Examples
      more

    • Silex (PHP micro-framework)
    • Silex-MVC
      desktop_windows
    • Silex-UBKI
      last_page

    • Zend (PHP framework)
    • ZF-MyBlog
      library_books
    • ZF2-ASM
      show_chart

    • Node.js
    • Express-Passport
      verified_user
    • Feathers-Examples
      more

    • Vue.js (JavaScript framework)
    • Vue-Resume
      account_circle
    • Vue-Business-Light
      work
    • Vue-Examples
      more
    • Vuex-Examples
      more

    • Nuxt (JavaScript framework)
    • Nuxt-Business-Light
      work
    • Nuxt-Vuetify-Start
      picture_in_picture

  • Темы
  • message
    WEB ресурсы
    keyboard_arrow_down
    • Обзор
      filter_none

  • message
    Google Client API
    keyboard_arrow_down
    • Обзор
      filter_none
    • Gmail-Send
      contact_mail
    • Gmail-Inbox
      mail_outline
BSA / Blog-gapi-gmail-send
  • Информация

  • contact_mail
    Контакты
  • contacts
    Об авторе
  • public
    Мои проекты на GitHub
Gmail - Send Message
Передача сообщений через Gmail Client API.

2017-11-08

library_books

Введение.

Gmail API является RESTful API, которое можно использовать для доступа к почтовым сообщениям пользователя и отправлять электронные сообщения. Для большинства веб приложений (включая мобильные приложения), Gmail API является лучшим выбором для авторизованного доступа к пользовательским данным Gmail.

Gmail API дает вам гибкий RESTful доступ к пользовательскому почтовому ящику с естественным интерфейсом к Threads, Messages, Labels, Drafts, History, и Settings. Этот интерфейс реализован на многих современных языках программирования. Ваше приложение может использовать это API, чтобы опеспечить следущие возможности Gmail:

  • Читать сообщения с Gmail;
  • Передавать email сообщения;
  • Поиск соответствующих сообщений;
  • Создавать фильтры для автоматической маркировки, пересылки или архивирования сообщений.

Все что вам необходимо чтобы использовать Gmail API - это выбрать клиенскую библиотеку для вашего языка программирования и ваше приложение должно уметь авторизировать пользователя Gmail.

Пример использования Gmail API на GitHub можно посмотреть здесь

Ресурсы

Gmail API
Руководство по Gmail API
Users.messages
Users.messages: send
Структура электронного сообщения
RFC 1521 — Почтовый стандарт MIME
RFC 5322 — Формат сообщений Internet (IMF)

Загрузка/Инициализация клиенской библиотеки Google API

Вначале нужно загрузить и инициализировать клиенскую библиотеку Google API см. пр.1.

пр.1


    ...

    /**
    * Google Client load/init
    * @param params (Object)
    *  etc. {
    *  apiKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    *  clientId: 'xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
    *  discoveryDocs: ['https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest'],
    *  scope: 'https://www.googleapis.com/auth/gmail.readonly https://www.googleapis.com/auth/gmail.send'
    *  }
    * @return {Promise}
    */
    loadClient (params) {
        return new Promise(function (resolve, reject) {
            _loadGoogleApi().then(function () {
                if (debug) {
                    console.log('loadGoogleAPI - OK')
                }
                return _initClient(params)
            }).then(function () {
                if (debug) {
                    console.log('googleClient.init - OK')
                }
                // Load gmail library
                window.gapi.client.load('gmail', 'v1', resolve)
            })
        })
    }

    /**
    * Load google api
    * @return {Promise}
    * @private
    */
    _loadGoogleApi () {
        return new Promise(function (resolve, reject) {
            const script = document.createElement('script')
            script.src = 'https://apis.google.com/js/platform.js'
            script.onreadystatechange = script.onload = function () {
                if (!script.readyState || /loaded|complete/.test(script.readyState)) {
                    setTimeout(function () {
                        resolve()
                    }, 500)
                }
            }
            document.getElementsByTagName('head')[0].appendChild(script)
        })
    }

    /**
    * Google client  load/init
    * @param params (Object)
    *  etc. {
    *  apiKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    *  clientId: 'xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
    *  discoveryDocs: ['https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest'],
    *  scope: 'https://www.googleapis.com/auth/gmail.readonly https://www.googleapis.com/auth/gmail.send'
    *  }
    * @return {Promise}
    * @private
    */
    _initClient (params) {
        return new Promise(function (resolve, reject) {
            // Client Init
            const initClient = function () {
                window.gapi.client.init(params).then(() => {
                    resolve()
                }, (error) => {
                    console.error('gapi.client.init - Error', error)
                    alert(`gapi.client.init - Error: ${error.error}\n Details: ${error.details}`)
                })
            }
            window.gapi.load('client:auth2', initClient)
        })
    }

    ...

Передача email сообщений (Users.messages: send)

grade Требуется авторизация

Отправляет указанное сообщение получателям в To, Cc, Bcc заголовках.

Этот метод поддерживает /upload URI и может передавать медиа со следующими характеристиками:

  • Максимальный размер файла: 35MB
  • Предполагает Media MIME типы: message/rfc822

Более подробную информацию по передаче email сообщений можно посмотреть здесь

Прежде чем передать сообщение необходимо авторизироваться пользователю на Google сервере. Для этого нужно выполнить функцию авторизации, см. пр.2:

пр.2


    ...

    /**
    * Google SignIn
    * @param successCallback (Function)
    * @param errorCallback (Function)
    */
    signIn (successCallback, errorCallback) {
        window.gapi.auth2.getAuthInstance().signIn().then(function (googleUser) {
            successCallback(googleUser)
            if (debug) {
                console.log('GoogleAuth.signIn - OK')
            }
        }, function (error) {
            errorCallback(error)
            console.log('GoogleAuth.signIn - Error: ', error)
        })
    }

    ...

После авторизации пользователя можно передать сообщение см. пр.3:

пр.3


    ...

    /**
    * Send email
    * @param params
    * etc.{
    userId: 'me',
    to: my@test.com,
    subject: Request for my resume from the employer,
    message: 'My Message!',
    callback: function () {
    ....
    }
    * }
    */
    send (params) {
        try {
            const headers = {
                'To': params.to,
                'Subject': params.subject,
                'Content-Type': 'text/html; charset="UTF-8"'
            }

            let email = ''
            _.forEach(headers, function (value, key) {
                email += `${key}: ${value}` + '\r\n'
            })

            email += '\r\n' + params.message
            const base64EncodedEmail = _b64UrlEncodeUnicode(email)
            const sendRequest = window.gapi.client.gmail.users.messages.send({
                'userId': params.userId,
                'resource': {
                    'raw': base64EncodedEmail
                }
            })
            sendRequest.execute(params.callback)
        } catch (e) {
            throw e
        }
    }

    /**
    * To encode the unicode string into Base64-encoded-url value
    *
    * @param str
    * @return {string}
    */
    _b64UrlEncodeUnicode (str) {
        // first we use encodeURIComponent to get percent-encoded UTF-8,
        // then we convert the percent encodings into raw bytes which
        // can be fed into btoa.
        const b64Encoded = btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g,
            function toSolidBytes (match, p1) {
                return String.fromCharCode('0x' + p1)
            }))
        // Replace for URL
        return b64Encoded.replace(/\+/g, '-').replace(/\//g, '_')
    }

    ...

© 2017 Сергей Бескоровайный
language Разработчик:
BSA Lab.