Как успешно отправить сообщение с помощью нового API GEST REST?

В настоящее время я пытаюсь протестировать новый Gmail REST API.

В API Explorer можно разрешить запросы с использованием OAuth 2.0 и выполнить запрос, то есть отправить сообщение.

Сначала я разрешил. enter image description here

Я использую следующие тестовые данные (и, конечно же, я использовал правильный адрес электронной почты to):

{    
   "raw": "c2VuZGluZyBhIG1haWwgdXNpbmcgR21haWwgUkVTVCBBUEk=",  
   "payload": { 
     "headers": [ 
       { "name": "to",      "value": "[email protected]"   }, 
       { "name": "from",    "value": "[email protected]" }, 
       { "name": "subject", "value": "Test Gmail REST API"  } 
     ],
     "mimeType": "text/plain" 
   }
}

Я также получаю 200 OK и следующий результат, который выглядит нормально.

{
  "id": "146dee391881b35b",
  "threadId": "146dee391881b35b",
}

Однако почта не будет отправлена ​​успешно, и я могу найти сообщение от [email protected] в папке "Входящие": "An error occurred, your message has not been sent."

enter image description here

Вопросы:
1. Кто-то испытал это успешно?
2. Должен ли я добавить какой-либо другой параметр, чтобы запустить его?



EDIT. Существует два разных метода HTTP-запроса:

  • URI загрузки для запросов на загрузку мультимедиа и
  • Идентификатор метаданных для запросов только для метаданных

The API Explorer currently supports metadata requests only, что означает текстовые сообщения без вложения, и это то, что я пытаюсь сделать.

Ответы

Ответ 1

получил его!

после прочтения спецификации RFC 2822 Я выяснил, что полное сообщение необходимо передать в параметре raw, см. пример

From: John Doe <[email protected]> 
To: Mary Smith <[email protected]> 
Subject: Saying Hello 
Date: Fri, 21 Nov 1997 09:55:06 -0600 
Message-ID: <[email protected]>

This is a message just to say hello. So, "Hello".

Итак, после того, как base64 кодирует полное сообщение, передав его в параметре raw без использования какого-либо другого параметра, он отлично работает.

Изменить 1:
Как отметил @Amit, он должен быть закодирован в web-safe base64, см. Также https://code.google.com/p/stringencoders/wiki/WebSafeBase64

Итак, чтобы преобразовать base64 alpha в формат, который является "безопасным для веб-сайта", рекомендуется следующие изменения:

+ --> - (char 62, plus to dash)
/ --> _ (char 63, slash to underscore)
= --> * padding

Для меня было достаточно преобразовать + в - и / в _.

Изменить 2:
Чтобы ответить на вопрос @Hjulle, вот пример: вам нужен только userId, а в теле запроса - параметр raw. Предположим, ваш адрес электронной почты [email protected]

First Base64 кодирует полное сообщение (см. выше) с помощью

Ответ 2

Примечание: Это ответ на конкретный PHP, но я уверен, что некоторые из вас сочтут это полезным.

Если вы пытаетесь правильно настроить исходные данные на PHP, используя PHPMailer, вы делаете вещи более чистыми и вам легче.

После включения библиотеки в ваш код (если вы используете композитор, просто добавьте "phpmailer/phpmailer": "~ 5.2" в разделе require вашего composer.json), вы устанавливаете основные сведения:

$mail = new PHPMailer();
$mail->From = 'FROM_EMAIL';
$mail->FromName = 'FROM_NAME';
$mail->addAddress('TO_EMAIL','TO_NAME');
$mail->Subject = 'EMAIL_SUBJECT';
$mail->Body = 'EMAIL_BODY';
$mail->preSend(); 
$mime = $mail->getSentMIMEMessage();

Теперь вы можете base64 закодировать $mime, чтобы получить необработанную строку для API Gmail. Используйте это вместо простого base64_encode, чтобы получить допустимую строку, закодированную в Интернете. rtrim(strtr(base64_encode($mime), '+/', '-_'), '=');

Ответ 3

Это сработало для меня

URL: https://www.googleapis.com/upload/gmail/v1/users/me/messages/send (метод POST)

InHeaders: - "Authorization": "Bearer ya29.Il-iBylW9AUr6V0QO72ryo17r7hf8i5zh8dU63ZjDNaxAApumh6T7lh20my_DQZomtL_qokZnJEgapYN20LmdlG6lFbqGASL5lqFAKnOoUtZA992JwOlUQxMVW6_Yto7jQ", "Content-Type": "message/rfc822"

InBody: -

{"raw": "From: <[email protected]> 
To: <[email protected]> 
Subject: Saying Hello
This is a message just to say hello. So, "Hello"."}