Как реализовать Gmail OAuth API для отправки электронного письма (особенно через SMTP)?

Я разрабатываю веб-приложение, которое пошлет электронные письма от имени зарегистрированного пользователя.

Я пытаюсь использовать новый Gmail протокол OAuth, о котором объявляют описанный здесь для отправки этих электронных писем через учетную запись Gmail пользователя (предпочтительно использующий SMTP, а не IMAP, но я легок). Однако демонстрационный код PHP дает мне несколько проблем.

  1. Весь пример кода основан на IMAP, не SMTP. Почему "поддерживают" протокол SMTP, если Вы не собираетесь показывать людям, как использовать его?
  2. Пример кода дает мне фатальную ошибку от непойманного исключения Зенда - он не может найти папку "INBOX".

Фатальная ошибка: Неперехваченное исключение 'Zend_Mail_Storage_Exception' с сообщением 'не может изменить папку, возможно, это не существует' в path\to\xoauth-php-samples\Zend\Mail\Storage\Imap.php:467 Отслеживании стека: № 0 path\to\xoauth-php-samples\Zend\Mail\Storage\Imap.php (248): Zend_Mail_Storage_Imap-> selectFolder ('ЯЩИК ВХОДЯЩИХ СООБЩЕНИЙ') № 1 path\to\xoauth-php-samples\three-legged.php (184): Zend_Mail_Storage_Imap-> __ конструкция (Объект (Zend_Mail_Protocol_Imap)) № 2 {основное} Следующее исключение 'Zend_Mail_Storage_Exception' с сообщением 'не может выбрать ЯЩИК ВХОДЯЩИХ СООБЩЕНИЙ, действительно ли это - допустимый транспорт?' в path\to\xoauth-php-samples\Zend\Mail\Storage\Imap.php:254 Отслеживании стека: № 0 path\to\xoauth-php-samples\three-legged.php (184): Zend_Mail_Storage_Imap-> __ конструкция (Объект (Zend_Mail_Protocol_Imap)) № 1 {основной} в path\to\xoauth-php-samples\Zend\Mail\Storage\Imap.php на строке 254

Я проверил, что возвращаю хорошие маркеры OAuth, я просто не знаю, как заставить фактическую почтовую транзакцию произойти. Этот протокол является все еще довольно новым, таким образом, нет большого количества неофициальной общественной документации об этом там, и официальные документы являются бесполезно сухим материалом о RFC SMTP. Таким образом, если бы кто-либо может помочь получить это движение, я был бы очень признателен за его.

Примечание: Я уже смог соединиться с сервером SMTP Gmail через SSL и успешно послать электронное письмо, при условии, что пользователь дал моему приложению его имя пользователя Gmail и пароль. Я хотел бы избежать этого метода, потому что он поощряет фишинг, и настроенные на безопасность пользователи не примут его. Этот вопрос не об этом.

14
задан Curtis Gibby 8 April 2010 в 19:09
поделиться

1 ответ

Вы используете аккаунт Google Apps?

При перенаправлении на URL OAuthAuthorize token я ошибочно указывал hd=default. Это указывает конечной точке OAuth авторизовать токен для стандартного аккаунта Google, а это НЕ работает с Google Apps.

Итак, в файле three-legged.php замените строку, в которой говорится:

$consumer->redirect(array('hd' => 'default'));

на

$consumer->redirect();

И все должно быть в порядке - вас попросят выбрать между потребительским аккаунтом и аккаунтом Google Apps, если вы вошли в систему с обоими.

Надеюсь, это поможет - я буду исправлять код, чтобы решить эту проблему.

Будьте здоровы, -Райан

#

По поводу использования SMTP... Я еще не до конца разобрался с этим, чтобы хорошо задокументировать, но вот основы.

1) Создайте Zend/Mail/Protocol/Smtp/Auth/Xoauth.php, где метод auth() довольно прост:

// Ensure AUTH has not already been initiated.
parent::auth();
$this->_send('AUTH XOAUTH ' . $this->_xoauth_request);
$this->_expect(235);
$this->_auth = true;

2) Сгенерируйте $initClientRequest немного иначе, поскольку URL меняется для SMTP и IMAP. 3) Отправить почту следующим образом:

  // where getXoauthClientRequest abstracts out line 116-165 in existing three-legged.php
  $smtpInitClientRequestEncoded = getXoauthClientRequest($smtpUrl, $accessToken);

  $config = array('ssl' => 'ssl',
                  'port' => '465',
                  'auth' => 'xoauth',
                  'xoauth_request' => $smtpInitClientRequestEncoded);

  $transport = new Zend_Mail_Transport_Smtp('smtp.gmail.com', $config);
  $mail = new Zend_Mail();
  $mail->setBodyText('This is the text of the mail.');
  $mail->setFrom($email_address, 'Some Sender');
  $mail->addTo($email_address, 'Some Recipient');
  $mail->setSubject('TestSubject');
  $mail->send($transport);

Я попробую создать что-то более документированное - что не требует создания классов в "пространстве имен" Zend, но это, вероятно, потребует расширения Zend_Mail_Transport_Smtp, потому что способ _sendMail() там написан так, чтобы загружать классы auth только из "пакета" Zend_Mail_Protocol_Smtp_Auth_*

.
2
ответ дан 1 December 2019 в 16:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: