2010-04-08 11 views
14

Ich entwickle eine Webanwendung, die E-Mails im Auftrag eines angemeldeten Benutzers sendet.Wie implementiert man die Google Mail-OAuth-API zum Senden von E-Mails (insbesondere über SMTP)?

Ich versuche, das neue Gmail OAuth-Protokoll wie beschrieben here zu verwenden, diese E-Mails über das Google Mail-Konto des Benutzers zu senden (vorzugsweise mit SMTP statt IMAP, aber ich bin einfach). Der PHP-Beispielcode gibt mir jedoch einige Probleme.

  1. Der gesamte Beispielcode basiert auf IMAP, nicht auf SMTP. Warum "unterstützt" man das SMTP-Protokoll, wenn man den Leuten nicht zeigt, wie man es benutzt?
  2. Der Beispielcode gibt mir einen schwerwiegenden Fehler von einer nicht abgefangenen Zend-Ausnahme - es kann den Ordner "INBOX" nicht finden.

Fatal error: Uncaught exception 'Zend_Mail_Storage_Exception' with message 'cannot change folder, maybe it does not exist' in path\to\xoauth-php-samples\Zend\Mail\Storage\Imap.php:467 Stack trace: #0 path\to\xoauth-php-samples\Zend\Mail\Storage\Imap.php(248): Zend_Mail_Storage_Imap->selectFolder('INBOX') #1 path\to\xoauth-php-samples\three-legged.php(184): Zend_Mail_Storage_Imap->__construct(Object(Zend_Mail_Protocol_Imap)) #2 {main} Next exception 'Zend_Mail_Storage_Exception' with message 'cannot select INBOX, is this a valid transport?' in path\to\xoauth-php-samples\Zend\Mail\Storage\Imap.php:254 Stack trace: #0 path\to\xoauth-php-samples\three-legged.php(184): Zend_Mail_Storage_Imap->__construct(Object(Zend_Mail_Protocol_Imap)) #1 {main} in path\to\xoauth-php-samples\Zend\Mail\Storage\Imap.php on line 254

ich überprüft habe, dass ich gute OAuth bin immer Token zurück, ich weiß nur nicht, wie die tatsächliche E-Mail-Transaktion geschieht. Dieses Protokoll ist immer noch ziemlich neu, daher gibt es nicht viel inoffizielle Community-Dokumentation darüber, und die offiziellen Dokumente sind wenig hilfreiche Dinge über den SMTP-RFC. Also, wenn jemand helfen kann, dies zu erreichen, würde ich es sehr schätzen.

Hinweis: Ich konnte bereits eine Verbindung mit dem SMTP-Server von Google Mail über SSL herstellen und erfolgreich eine E-Mail senden, sofern der Benutzer meiner Bewerbung seinen/ihren Google Mail-Nutzernamen und das Passwort gegeben hat. Ich möchte diese Methode vermeiden, da sie Phishing fördert und sicherheitsbewusste Benutzer sie nicht akzeptieren. In dieser Frage geht es nicht darum.

+0

Da ich neu bin, hat mich der Spamfilter von Stack Overflow dazu veranlasst, die Links zur Google Mail OAuth-Ankündigung zu entfernen (http://googlecode.blogspot.com/2010/03/oauth-access-to-imapsmtp-in-gmail) .html) und Beispielcode (http://code.google.com/p/google-mail-xoauth-tools/wiki/PhpSampleCode). –

+0

können Sie eine Webanwendung erstellen, die E-Mails über Google Mail über JavaScript sendet. Sagen Sie den Google Mail-Servern, dass sie diese für den Benutzer senden sollen. –

Antwort

2

Verwenden Sie ein Google Apps-Konto?

Beim Weiterleiten an die OAuthAuthorize-Token-URL habe ich fälschlicherweise hd = default angegeben. Dadurch wird der OAuth-Endpunkt angewiesen, ein Token für ein Standard-Google-Konto zu autorisieren, und es funktioniert nicht mit Google Apps, sondern mit NICHT.

also in drei legged.php, ersetzen Sie die Zeile, die sagt:

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

mit

$consumer->redirect(); 

Und alles sollte fine-- Sie zwischen Ihrem Verbraucher wählen gestellt werden sollten und Google Apps-Konto, wenn Sie mit beiden angemeldet sind.

Ich hoffe, das hilft - Ich werde den Code patchen, um dieses Problem zu beheben.

Cheers, -Ryan

#

Re mit SMTP-- Ich habe dies nicht vollständig zusammen noch in einer Art und Weise bekommen, dass well-- dokumentiert ist, aber hier ist die Grundlagen.

1) Erstellen Zend/Mail/Protokoll/Smtp/Auth/Xoauth.php, wo die Auth() Methode ist ziemlich einfach:

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

2) etwas anders $ initClientRequest generieren, da die URL Änderungen für SMTP im Vergleich zu IMAP 3) E-Mail wie folgt aus:

// 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); 

Ich werde versuchen, etwas besser dokumentiertes zu erstellen - das erfordert keine Klassen im Zend 'Namespace' zu erstellen, aber es würde wahrscheinlich auch Zend_Mail_Transport_Smtp erweitern müssen, weil _sendMail() dort geschrieben ist, um Auth-Klassen zu laden nur aus dem Zend_Mail_Protocol_Smtp_Auth_ * 'Paket'

+0

Ryan, danke für die Info. Ich werde versuchen, diesen Code auszuführen und zu sehen, was ich daraus mache. Ich schätze Ihre Bemühungen hier. Ich habe nicht versucht, die E-Mails über ein Google Apps-Konto zu senden, sondern einfach nur ein altes Gmail-Konto. –

+0

Ich versuche, das selbst zu arbeiten. Ich verstehe diese Zeile nicht: $ smtpInitClientRequestEncoded = getXoauthClientRequest ($ smtpUrl, $ accessToken); Woher bekomme ich oder wie mache ich getXoauthClientRequest? – PaulM

4

Ich verwende ein Google Apps-Konto und versuche, eine Anwendung zu erstellen, die es meinen Benutzern ermöglicht, über die neue Oauth-Autorisierung E-Mails über SMTP zu senden. Ich konnte es mit einigen Informationen über diese Diskussion zur Arbeit bringen. Allerdings denke ich, ich sollte ein paar Dinge klären, über die ich gestolpert bin ...

1) Das Zend Framework für SMTP sucht scheinbar automatisch im Zend/Mail/Protocol/Smtp/Auth Ordner nach einem Dateinamen .php in dieser Fall "Xoauth.php", der normalerweise nicht in Zend existiert, es sei denn, du erstellst ihn. Dies konnte ich erfolgreich durchführen, indem ich die existierende Datei Login.php nach Xoauth.php kopiere und mit den auf dieser Webseite gemachten Vorschlägen leicht modifiziere.

Das war sehr hilfreich, aber es ist nur ein Teil der Xoauth.php-Datei (eine Kopie von login.php bearbeiten und Sie erhalten eine äquivalente Fläche sehen):

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

2) Beachten Sie, dass Sie sollten auf jeden Fall Zend auf dem PHP include_path haben, auch wenn Sie es direkt in PHP referenzieren, weil es versuchen kann, sich mit seiner Loader.php-Datei zu referenzieren, ohne einen expliziten Pfad zu verwenden.

3) Neben dem Entfernen der offensichtlichen IMAP-Funktionen und dem Ersetzen durch die entsprechenden SMTP-Funktionen musste ich den Code aus den Google OAuth-Beispielen für PHP nicht ändern. Ich musste die Zend/Mail.php-Datei hinzufügen, um E-Mails zu senden und den Code hinzuzufügen, der notwendig ist, um E-Mails zu senden, damit der Test funktioniert.

+0

Das ist großartig. Ich bekam genau die gleichen Fehler wie Curtis und das, was du in Schritt 1 erwähnt hast, hat es funktioniert! –

Verwandte Themen