Я разрабатываю веб-приложение, которое пошлет электронные письма от имени зарегистрированного пользователя.
Я пытаюсь использовать новый Gmail протокол OAuth, о котором объявляют описанный здесь для отправки этих электронных писем через учетную запись Gmail пользователя (предпочтительно использующий SMTP, а не IMAP, но я легок). Однако демонстрационный код PHP дает мне несколько проблем.
Фатальная ошибка: Неперехваченное исключение '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 и пароль. Я хотел бы избежать этого метода, потому что он поощряет фишинг, и настроенные на безопасность пользователи не примут его. Этот вопрос не об этом.
Вы используете аккаунт 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_*
.