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

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

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

Сначала я разрешил. введите описание изображения здесь

Я использую следующие тестовые данные (и, конечно же, я использовал действующий 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."

введите описание изображения здесь

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



РЕДАКТИРОВАТЬ: существует 2 разных метода HTTP-запроса,

  1. URI загрузки для запросов на загрузку мультимедиа, и
  2. URI метаданных для запросов только метаданных

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


person Taifun    schedule 27.06.2014    source источник
comment
конечно, я сначала разрешил запрос, иначе я бы не получил 200 OK обратно ...   -  person Taifun    schedule 28.06.2014
comment
@Taifun, как ты создал строку RFC 2822, есть ли библиотеки или жестко закодированы, какие-то примеры?   -  person Sasikanth    schedule 25.03.2015
comment
@Sasikanth Это зависит от вашего любимого языка программирования. см. мой ответ ниже, как безопасно в сети base64 закодировать все сообщение   -  person Taifun    schedule 25.03.2015


Ответы (3)


понятно!

прочитав спецификацию 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, он должен быть закодирован в веб-кодировке base64, см. также https://code.google.com/p/stringencoders/wiki/WebSafeBase64

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

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

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

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

Сначала Base64 закодирует полное сообщение (см. Выше) с помощью онлайн-кодировщика, и вы получите следующую строку:

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h
cnlAZXhhbXBsZS5uZXQ+IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4=

Теперь преобразуйте + в - и / в _, и вы получите

RnJvbTogSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiAKVG86IE1hcnkgU21pdGggPG1h
cnlAZXhhbXBsZS5uZXQ-IApTdWJqZWN0OiBTYXlpbmcgSGVsbG8gCkRhdGU6IEZyaSwgMjEgTm92
IDE5OTcgMDk6NTU6MDYgLTA2MDAgCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhh
bXBsZT4KClRoaXMgaXMgYSBtZXNzYWdlIGp1c3QgdG8gc2F5IGhlbGxvLiBTbywgIkhlbGxvIi4=

Теперь передайте это в параметре raw API Explorer.

person Taifun    schedule 27.06.2014
comment
Требуется кодировка URL. stackoverflow.com/questions/22128789 / - person Amit G; 31.07.2014
comment
gist.github.com/AkashkumarDev/20ab002e7f5785ae778e есть идеи, где проблема? - person akdev; 17.08.2014
comment
@akdev для вопросов, пожалуйста, начните новый вопрос, а не комментируйте здесь. Спасибо. - person Taifun; 19.08.2014
comment
stackoverflow.com/questions/25396463/ - person akdev; 20.08.2014
comment
У меня не работает stackoverflow.com/questions/28122074/gmail- api-emails-bouncing - person Allen King; 24.01.2015
comment
@taifun, мое сообщение отправлено успешно. но как добавить threadId и labelId при отправке сообщения? - person m2j; 23.01.2016
comment
@ users4393829, пожалуйста, задайте новый вопрос - person Taifun; 23.01.2016
comment
уже сделал. Заголовок stackoverflow.com/questions/34960683/ - person m2j; 24.01.2016

Примечание. Это специфичный для 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), '+/', '-_'), '=');

person trajchevska    schedule 16.05.2016
comment
вопрос: использовать новый Gmail REST API? ... так зачем говорить о PHPMailer ... - person mcfly; 21.07.2018
comment
@mcfly, потому что я потратил два дня на изучение того, как реализовать это на PHP, и подумал, почему бы не поделиться своими выводами на этой прекрасной платформе обмена знаниями с людьми, которые, как я, натолкнулись на этот ответ, потому что не смогли найти то, что они находясь в поиске. Обратите внимание на отказ от ответственности вверху. Счастливый понедельник! - person trajchevska; 23.07.2018
comment
все еще не в нужной теме ... я могу опубликовать, как отправлять и отправлять по электронной почте с помощью python, а затем и java, и люди, которые ищут настоящий ответ по теме, будут так счастливы найти это здесь. - person mcfly; 24.07.2018
comment
Это действительно отвечает на вопрос в том смысле, что вы получаете полностью подготовленное сообщение, созданное PHPMailer, а затем используете Gmail API для его отправки. Идея состоит в том, чтобы получить какую-то стороннюю библиотеку, а не заниматься необработанными настройками сообщения. - person Vladan; 21.09.2018

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

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"."}
person Dharmendra Prajapati    schedule 21.10.2019