2010-04-08 18 views
14

Sto sviluppando un'applicazione web che invierà e-mail per conto di un utente che ha effettuato l'accesso.Come implementare l'API OAuth di Gmail per inviare email (soprattutto via SMTP)?

Sto cercando di utilizzare il nuovo protocollo OAuth di Gmail annunciato descritto here per inviare queste e-mail tramite l'account Gmail dell'utente (preferibilmente utilizzando SMTP anziché IMAP, ma sono semplice). Tuttavia, il codice PHP di esempio mi dà un paio di problemi.

  1. Tutto il codice di esempio è basato su IMAP, non SMTP. Perché "supportare" il protocollo SMTP se non hai intenzione di mostrare alle persone come usarlo?
  2. Il codice di esempio mi dà un errore irreversibile da un'eccezione Zend non rilevata: non riesce a trovare la cartella "INBOX".

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

Ho verificato che sto diventando buono OAuth gettoni di nuovo, solo che non so come fare accadere la transazione e-mail vera e propria. Questo protocollo è ancora piuttosto nuovo, quindi non c'è molta documentazione della comunità non ufficiale su di esso là fuori, e i documenti ufficiali sono roba inutilmente secca sulla RFC SMTP. Quindi, se qualcuno può aiutare a farlo funzionare, lo apprezzerei molto.

Nota: Sono già stato in grado di connettersi al server SMTP di Gmail tramite SSL e inviare correttamente un'e-mail, a condizione che l'utente abbia fornito alla mia applicazione il nome utente e la password di Gmail. Mi piacerebbe evitare questo metodo, perché incoraggia gli utenti di phishing e di sicurezza a non accettarlo. Questa domanda non riguarda questo.

+0

Poiché sono nuovo, il filtro antispam di Stack Overflow mi ha fatto rimuovere i collegamenti all'annuncio OAuth di Gmail (http://googlecode.blogspot.com/2010/03/oauth-access-to-imapsmtp-in-gmail .html) e codice di esempio (http://code.google.com/p/google-mail-xoauth-tools/wiki/PhpSampleCode). –

+0

puoi realizzare un'applicazione web che manda email usando tramite gmail tramite javascript da solo. Come dire ai server di Gmail di inviarlo per l'utente. –

risposta

2

Stai utilizzando un account Google Apps?

Durante il reindirizzamento all'URL token OAuthAuthorize, stavo erroneamente specificando hd = default. Ciò indica all'endpoint di OAuth di autorizzare un token per un account Google standard e lo fa NON funziona con Google Apps.

Così, in tre legged.php, sostituire la linea che dice:

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

con

$consumer->redirect(); 

e tutto dovrebbe essere fine-- si dovrebbe essere chiesto di selezionare tra il consumatore e account Google Apps se sei loggato con entrambi.

Spero che questo aiuti-- Sarò patching del codice per risolvere questo problema.

Cheers, -Ryan

#

Re utilizzando SMTP-- non ho ancora ottenuto questo completamente insieme in un modo che è documentato well-- ma ecco le basi.

1) Creare Zend/Mail/Protocollo/Smtp/Auth/Xoauth.php, in cui il metodo di autenticazione() è abbastanza semplice:

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

2) Generare $ initClientRequest in modo leggermente diverso, come i cambiamenti di URL per SMTP contro IMAP 3) Invia mail come la seguente:

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

Proverò a creare qualcosa di meglio documentato, che non richiede la creazione di classi nello spazio dei nomi di Zend, ma probabilmente richiederebbe l'estensione di Zend_Mail_Transport_Smtp anche a causa del modo in cui _sendMail() viene scritto lì per caricare le classi di autenticazione solo da Zend_Mail_Protocol_Smtp_Auth_ * 'pacchetto'

+0

Ryan, grazie per le informazioni. Proverò a eseguire questo codice e vedere cosa mi viene in mente. Apprezzo i tuoi sforzi qui. Non stavo cercando di inviare le e-mail attraverso un account Google Apps, solo una semplice vecchia versione di Gmail. –

+0

Sto cercando di farlo funzionare da solo. Non capisco questa riga: $ smtpInitClientRequestEncoded = getXoauthClientRequest ($ smtpUrl, $ accessToken); Dove prendo o come faccio a ottenere getXoauthClientRequest? – PaulM

4

Sto utilizzando un account Google Apps e sto provando a creare un'applicazione che consenta ai miei utenti di inviare posta tramite SMTP tramite la nuova autorizzazione Oauth. Sono stato in grado di farlo funzionare utilizzando alcune delle informazioni su questa discussione. Tuttavia, penso che vorrei chiarire un paio di cose che mi sono imbattuto nel corso ...

1) Il quadro Zend per SMTP a quanto pare cerca automaticamente nella cartella Zend/Mail/Protocollo/SMTP/Auth per un nome di file .php in questo caso "Xoauth.php" che normalmente NON esiste in Zend a meno che non lo crei. Sono riuscito a farlo correttamente copiando il file Login.php esistente su Xoauth.php e modificandolo leggermente con i suggerimenti fatti su questa pagina web.

Questo è stato molto utile, ma è solo una parte del file di Xoauth.php (Modifica di una copia di login.php e vedrete una superficie equivalente):

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

2) Si noti che si dovrebbe assolutamente hai Zend sul PHP include_path anche se lo fai riferimento direttamente in PHP perché potrebbe provare a fare riferimento con il suo file Loader.php senza usare un percorso esplicito.

3) Oltre a rimuovere le ovvie funzioni IMAP e sostituirle con le funzioni SMTP equivalenti, non avevo bisogno di cambiare il codice dagli esempi di Google OAuth per PHP. Dovevo includere il file Zend/Mail.php per inviare e-mail e aggiungere il codice necessario per inviare effettivamente e-mail affinché il test funzioni.

+0

Questo è fantastico. Stavo ottenendo esattamente gli stessi errori che Curtis stava ottenendo, e fare ciò che hai menzionato nel passaggio 1 ha funzionato! –

Problemi correlati