Как реализовать Gmail OAuth API для отправки электронной почты (особенно через SMTP)? - PullRequest
14 голосов
/ 08 апреля 2010

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

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

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

Неустранимая ошибка: необработанное исключение «Zend_Mail_Storage_Exception» с сообщением «не может изменить папку, возможно, оно не существует» в пути \ to \ xoauth-php-samples \ Zend \ Mail \ Storage \ Imap.php: 467 Трассировка стека: # 0 пути \ к \ xoauth-php-samples \ Zend \ Mail \ Storage \ Imap.php (248): Zend_Mail_Storage_Imap-> selectFolder ('INBOX') # 1 путь \ к \ xoauth-php-samples \ three-legged.php (184): Zend_Mail_Storage_Imap -> __ construct (Object (Zend_Mail_Protocol_Imap)) # 2 {main} Следующее исключение 'Zend_Mail_Storage_Exception' с сообщением 'не может выбрать INBOX, это допустимый транспорт?' в пути \ to \ xoauth-php-samples \ Zend \ Mail \ Storage \ Imap.php: 254 Трассировка стека: путь # 0 \ до \ xoauth-php-samples \ three-legged.php (184): конструкция Zend_Mail_Storage_Imap -> __ (Объект (Zend_Mail_Protocol_Imap)) # 1 {main} в пути \ к \ xoauth-php-samples \ Zend \ Mail \ Storage \ Imap.php в строке 254

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

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

Ответы [ 2 ]

4 голосов
/ 21 сентября 2010

Я использую учетную запись Google Apps и пытаюсь создать приложение, которое позволяет моим пользователям отправлять почту через SMTP с помощью новой авторизации Oauth. Я смог заставить его работать, используя некоторую информацию об этом обсуждении. Тем не менее, я думаю, что я должен уточнить пару вещей, на которые я наткнулся ...

1) Zend Framework для SMTP, очевидно, автоматически ищет в папке Zend / Mail / Protocol / Smtp / Auth имя файла .php, в данном случае «Xoauth.php», который обычно НЕ существует в Zend, если вы его не создадите. , Мне удалось сделать это успешно, скопировав существующий файл Login.php в Xoauth.php и слегка изменив его с помощью предложений, сделанных на этой веб-странице.

Это было очень полезно, но это только часть файла Xoauth.php (отредактируйте копию login.php, и вы увидите эквивалентную область):

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

2) Обратите внимание, что вы обязательно должны иметь Zend на PHP include_path, даже если вы ссылаетесь на него напрямую в PHP, потому что он может пытаться ссылаться на себя с помощью файла Loader.php без использования явного пути.

3) Помимо удаления очевидных функций IMAP и замены их эквивалентными функциями SMTP, мне не нужно было менять код из примеров Google OAuth для PHP. Мне пришлось включить файл Zend / Mail.php, чтобы отправить электронное письмо, и добавить код, необходимый для фактической отправки электронной почты, чтобы тест работал.

2 голосов
/ 26 апреля 2010

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

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

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

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

с

$consumer->redirect();

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

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

Ура, -Ryan

#

Повторное использование 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 () записывается там для загрузки только аутентификационные классы из пакета Zend_Mail_Protocol_Smtp_Auth_ * 'package'

...