Я разрабатываю веб-приложение, которое будет отправлять электронные письма от имени зарегистрированного пользователя.
Я пытаюсь использовать новый протокол Gmail OAuth, описанный здесь, для отправки этих писем через учетную запись пользователя Gmail (желательно с использованием SMTP, а не IMAP, но я прост). Однако пример кода PHP дает мне пару проблем.
Неустранимая ошибка: исключение для исключения «Zend_Mail_Storage_Exception» с сообщением «не может изменить папку, возможно, она не существует» в пути \ to \ xoauth–php-samples \ Zend \ Mail \ Storage \ Imap.php: 467 Трассировка стека: путь # 0 \ to \ xoauth-php-samples \ Zend \ Mail \ Storage \ Imap.php (248): Zend_Mail_Storage_Imap-> selectFolder ('INBOX') # 1 путь \ to \ 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 \ to \ xoauth-php-samples \ three-legged.php (184): Zend_Mail_Storage_Imap -> __ construct (Object (Zend_Mail_Protocol_Imap)) # 1 {main} в пути \ to \ xoauth-php-samples \ Zend \ Mail \ Storage \ Imap.php в строке 254
Я проверил, что я получаю хорошие токены OAuth, я просто не знаю, как сделать фактическую транзакцию электронной почты. Этот протокол по-прежнему довольно новый, поэтому там не так много неофициальной документации сообщества, и официальные документы являются бесполезными сухими материалами о SMTP RFC. Поэтому, если кто-то может помочь в этом, я бы очень признателен.
Примечание. Я уже смог подключиться к SMTP-серверу Gmail через SSL и успешно отправить электронное письмо при условии, что пользователь предоставил моему приложению свое имя пользователя и пароль Gmail. Я бы хотел избежать этого метода, потому что он поощряет пользователей фишинга и безопасности, которые не будут его принимать. Этот вопрос не об этом.
Я использую аккаунт Google Apps и пытаюсь создать приложение, которое позволяет моим пользователям отправлять почту через SMTP с помощью новой авторизации Oauth. Я смог заставить его работать, используя некоторую информацию об этом обсуждении. Однако, я думаю, я должен прояснить пару вещей, которые я наткнулся на …
1) Структура Zend для 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 файл для отправки электронной почты и добавить код, необходимый для фактического отправки электронной почты для проверки на работу.
Вы используете аккаунт Google Apps?
При перенаправлении на URL-адрес токена OAuthAuthorize я ошибочно указывал hd = default. Это указывает конечной точке OAuth разрешить токен стандартной учетной записи Google и НЕ работает с Google Apps.
Итак, в three-legged.php, замените строку, которая гласит:
$consumer->redirect(array('hd' => 'default'));
с
$consumer->redirect();
И все должно быть хорошо – вас попросят выбрать между вашим потребителем и аккаунтом Google Apps, если вы вошли в систему с обоими.
Надеюсь, это поможет … Я исправлю код, чтобы исправить эту проблему.
Приветствия, -Ryan
#
Re с помощью 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_ * '