Как успешно отправить сообщение с помощью нового 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"."}