2010-04-08 21 views
14

Estoy desarrollando una aplicación web que enviará correos electrónicos en nombre de un usuario que ha iniciado sesión.¿Cómo implementar Gmail OAuth API para enviar correos electrónicos (especialmente a través de SMTP)?

Estoy tratando de usar el nuevo protocolo de Gmail OAuth anunciado here para enviar estos correos electrónicos a través de la cuenta de Gmail del usuario (preferiblemente usando SMTP en lugar de IMAP, pero soy fácil). Sin embargo, el código PHP de muestra me da un par de problemas.

  1. Todo el código de muestra se basa en IMAP, no en SMTP. ¿Por qué "apoyar" el protocolo SMTP si no le vas a mostrar a las personas cómo usarlo?
  2. El código de ejemplo me da un error fatal de una excepción Zend no capturada, no puede encontrar la carpeta "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

He verificado que estoy recibiendo buena OAuth tokens atrás, yo no sé cómo hacer la transacción de correo electrónico real ocurra. Este protocolo todavía es bastante nuevo, por lo que no hay mucha documentación comunitaria no oficial al respecto, y los documentos oficiales son algo inútilmente seco sobre el SMTP RFC. Entonces, si alguien puede ayudar a poner esto en marcha, lo agradecería enormemente.

Nota: Ya he podido conectarme al servidor SMTP de Gmail a través de SSL y enviar correctamente un correo electrónico, siempre que el usuario haya proporcionado a mi aplicación su nombre de usuario y contraseña de Gmail. Me gustaría evitar este método, ya que fomenta el phishing y los usuarios preocupados por la seguridad no lo aceptarán. Esta pregunta no es sobre eso.

+0

Como soy nuevo, el filtro de spam de Stack Overflow me hizo eliminar los enlaces al anuncio de Gmail OAuth (http://googlecode.blogspot.com/2010/03/oauth-access-to-imapsmtp-in-gmail .html) y código de ejemplo (http://code.google.com/p/google-mail-xoauth-tools/wiki/PhpSampleCode). –

+0

puede hacer una aplicación web que envíe correos electrónicos usando gmail a través de javascript solo. Como decirles a los servidores de gmail que se lo envíen al usuario. –

Respuesta

2

¿Está usando una cuenta de Google Apps?

Al redireccionar a la URL del token OAuthAuthorize, estaba especificando por error hd = default. Esto le dice al punto final OAuth que autorice un token para una cuenta estándar de Google y lo hace NOT que funciona con Google Apps.

Así, en tres legged.php, reemplace la línea que dice:

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

con

$consumer->redirect(); 

y todo debería ser bien-- se le debería pedir a elegir entre su consumidor y cuenta de Google Apps si inició sesión con ambos.

Espero que esto ayude-- Estaré parcheando el código para solucionar este problema.

Saludos, -Ryan

#

Re usando SMTP-- no he conseguido esta totalmente juntos pero de una manera que está documentada bien-- pero aquí es lo básico.

1) Crear Zend/Mail/Protocol/Smtp/Auth/Xoauth.php, donde el método de autenticación() es bastante simple:

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

2) Generar $ initClientRequest de forma ligeramente diferente, ya que los cambios de URL para SMTP frente IMAP 3) Enviar correo electrónico como el siguiente:

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

Trataré de crear algo mejor documentado, que no requiera crear clases en el 'espacio de nombres' de Zend, pero probablemente también necesite extender Zend_Mail_Transport_Smtp debido a la forma en que _sendMail() está escrito allí para cargar clases de autenticación. solo del Zend_Mail_Protocol_Smtp_Auth_ * 'paquete'

+0

Ryan, gracias por la información. Intentaré ejecutar este código y veré qué me ocurre. Aprecio tus esfuerzos aquí. No estaba tratando de enviar los correos electrónicos a través de una cuenta de Google Apps, simplemente una vieja y simple versión de Gmail. –

+0

Estoy tratando de hacer esto yo mismo. No entiendo esta línea: $ smtpInitClientRequestEncoded = getXoauthClientRequest ($ smtpUrl, $ accessToken); ¿Dónde obtengo o cómo hago getXoauthClientRequest? – PaulM

4

Estoy usando una cuenta de Google Apps e intento crear una aplicación que permita a mis usuarios enviar correo a través de SMTP a través de la nueva autorización de Oauth. Pude hacerlo funcionar usando parte de la información de esta discusión. Sin embargo, creo que debería aclarar un par de cosas con las que tropecé ...

1) El marco de Zend para SMTP parece buscar automáticamente en la carpeta Zend/Mail/Protocol/Smtp/Auth un nombre de archivo .php en este caso "Xoauth.php" que normalmente NO existe en Zend a menos que lo crees. Pude hacerlo con éxito copiando el archivo existente Login.php en Xoauth.php y modificándolo ligeramente con las sugerencias hechas en esta página web.

Esto fue muy útil, pero es sólo una parte del archivo de Xoauth.php (Editar una copia de login.php y verá un área equivalente):

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

2) Tenga en cuenta que usted debería tenga Zend en PHP include_path incluso si lo referencia directamente en PHP porque puede tratar de hacer referencia a sí mismo con su archivo Loader.php sin usar una ruta explícita.

3) Además de eliminar las funciones IMAP obvias y reemplazarlas con las funciones SMTP equivalentes, no tuve que cambiar el código de las muestras de Google OAuth para PHP. Tuve que incluir el archivo Zend/Mail.php para enviar correos electrónicos y agregar el código necesario para enviar correos electrónicos para que la prueba funcione.

+0

Esto es increíble. Obtuve exactamente los mismos errores que Curtis, y hacer lo que mencionaste en el paso 1 lo hizo funcionar. –

Cuestiones relacionadas