Come implementare Gmail OAuth API per l’invio di e-mail (in particolare tramite SMTP)?

Sto sviluppando un’applicazione web che invia messaggi di posta elettronica per conto di un utente connesso.

Sto cercando di utilizzare il nuovo Gmail protocollo OAuth annunciato descritto qui inviare le e-mail tramite l’account Gmail dell’utente (preferibilmente utilizzando il protocollo SMTP, piuttosto che IMAP, ma io sono facile). Tuttavia, nell’esempio di codice PHP mi dà un paio di problemi.

  1. Tutto il codice di esempio è basato su IMAP, SMTP non. Perché “sostenere” il protocollo SMTP se non avete intenzione di mostrare alla gente come si usa?
  2. Il codice di esempio mi dà un errore fatale da un uncaught Zend eccezione — non si può trovare la “posta in ARRIVO” cartella.

Fatal error: Uncaught exception ‘Zend_Mail_Storage_Exception’ con il messaggio “impossibile modificare la cartella, forse non esiste’ nel percorso\a\xoauth-php-campioni\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 (“posta in ARRIVO”) #1 path\to\xoauth-php-samples\three-legged.php(184): Zend_Mail_Storage_Imap->__construct(Object(Zend_Mail_Protocol_Imap)) #2 {main} Prossima eccezione ‘Zend_Mail_Storage_Exception’ con il messaggio ” impossibile selezionare posta in ARRIVO, è questo un valido documento di trasporto?’ nel percorso\a\xoauth-php-campioni\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 ottenendo buoni OAuth gettoni, solo che non so come effettuare la transazione elettronica accadere. Questo protocollo è ancora piuttosto nuovo, quindi non c’è molto non ufficiale di documentazione della comunità su di esso là fuori, e la documentazione ufficiale sono unhelpfully lavaggio roba su SMTP RFC. Quindi, se qualcuno può aiutare a far si che questo avvenga, sarei molto grato.

Nota: sono già stato in grado di collegare il server SMTP di Gmail tramite SSL e inviare una e-mail, a condizione che l’utente ha dato la mia domanda la sua/il suo nome utente Gmail e la password. Vorrei evitare questo metodo, perché incoraggia il phishing e protezione di mentalità utenti non lo accetta. A questa domanda non è su questo.

 

2 Replies
  1. 4

    Sto utilizzando un account Google Apps e cercando di creare un’applicazione che permette di mia utenti di inviare posta tramite SMTP via la nuova autorizzazione Oauth. Sono stato in grado di farlo funzionare utilizzando alcune delle informazioni contenute in questa discussione. Tuttavia, penso che dovrebbe chiarire un paio di cose che mi sono imbattuto sul…

    1) Zend framework per SMTP apparentemente cerca automaticamente nella Zend/Posta/Protocollo/Smtp/Auth cartella un nome di file .php in questo caso “Xoauth.php” che NON è in genere presente in Zend a meno che non lo si crea. Sono stato in grado di fare questo con successo da copia esistente Login.php file Xoauth.php e modificando leggermente con i suggerimenti su questa pagina web.

    Questo è stato molto utile, ma è solo una parte del Xoauth.php file (Modifica copia di login.php e vedrete un’area 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 avere su Zend PHP include_path anche se si fa riferimento direttamente in PHP perché potrebbe provare a fare riferimento a se stessa con la sua Loader.php file senza l’utilizzo di un percorso esplicito.

    3) Oltre a rimuovere le ovvie funzioni IMAP e la loro sostituzione con l’equivalente SMTP funzioni, non ho avuto bisogno di modificare il codice di Google OAuth campioni per PHP. Ho fatto includere l’Zend/Mail.php file per l’Invio di email e aggiungere il codice necessario per inviare e-mail per la prova di lavoro.

    • Questo è impressionante. Mi è stato sempre esattamente gli stessi errori che Curtis è stato sempre, e facendo ciò che è indicato nel passaggio 1 di farlo funzionare!
  2. 2

    Stai utilizzando un account Google Apps?

    Quando il reindirizzamento alla OAuthAuthorize URL di token, mi è stato erroneamente specificando hd=default. Questo dice il OAuth endpoint per autorizzare un token per un normale account Google e non NON lavoro con Google Apps.

    Così, in three-legged.php sostituire la riga che dice:

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

    con

    $consumer->redirect();

    E dovrebbe essere tutto a posto, si dovrebbe essere chiesto di scegliere tra il consumatore e l’account di Google Apps se registrato con entrambi.

    Spero che questo aiuti-cercherò di essere patching il codice per risolvere questo problema.

    Applausi,
    -Ryan

    #

    Re utilizzando il protocollo SMTP– non ho ottenuto questo completamente insieme, ma in un modo che è documentato bene, ma ecco le basi.

    1) Creare Zend/Mail/Protocol/Smtp/Auth/Xoauth.php dove l’auth() il metodo è 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, in quanto l’URL cambia per SMTP contro IMAP
    3) Invia messaggi come il 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);

    Cercherò di creare qualcosa di meglio documentate, che non richiede la creazione di classi in Zend ‘namespace’, ma si sarebbe probabilmente richiedere di estendere Zend_Mail_Transport_Smtp troppo a causa del modo in _sendMail() è scritto lì a carico auth classi solo dal Zend_Mail_Protocol_Smtp_Auth_* ‘pacchetto’

    • Ryan, grazie per le info. Cercherò di eseguire il codice e vedere cosa ne verrà fuori. Apprezzo I vostri sforzi qui. Non stavo cercando di inviare i messaggi di posta elettronica attraverso un account Google Apps, semplicemente un vecchio vaniglia Gmail.
    • Sto cercando di ottenere questo lavoro me stesso. Non capisco questa riga: $smtpInitClientRequestEncoded = getXoauthClientRequest($smtpUrl, $accessToken); Dove posso trovare o come posso fare getXoauthClientRequest?

Lascia un commento