Since I couldn't find a complete solution anywhere else, I thought I'd make a post about how to send mail using Gmail SMTP, Zend Mail and Xoauth2.
First, you need to put a file called Xoauth.php in Zend/Mail/Protocol/Smtp/Auth. The contents of the file are as follows:
require_once 'Zend/Mail/Protocol/Smtp.php';
class Zend_Mail_Protocol_Smtp_Auth_Xoauth extends Zend_Mail_Protocol_Smtp
{
protected $_xoauth_request;
public function __construct($host = '127.0.0.1', $port = null, $config = null)
{
if (isset($config['xoauth_request'])) {
$this->_xoauth_request = $config['xoauth_request'];
}
parent::__construct($host, $port, $config);
}
public function auth()
{
parent::auth();
$this->_send('AUTH XOAUTH2 ' . $this->_xoauth_request);
$this->_expect(235);
$this->_auth = true;
}
}
If you're curious about how this file gets called, look in Transport/Smtp.php for the _sendMail function. The variable connectionClass is what defines the file location.
Now to actually send the email you need the following code:
require_once 'Zend/Mail/Transport/Smtp.php';
require_once 'Zend/Mail.php';
function constructAuthString($email,$accessToken) {
return base64_encode("user=$email\1auth=Bearer $accessToken\1\1");
}
function sendEmail($email,$accessToken){
$smtpInitClientRequestEncoded = constructAuthString($email, $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('some body text');
$mail->setFrom($email, 'Some Sender');
$mail->addTo("email of recipient", 'Some Recipient');
$mail->setSubject('Test sending by smtp');
$mail->send($transport);
}
Call sendEmail() with the arguments email and accessToken and you'll be sending an email with Gmail SMTP and XOauth!
Note: I'll put this stuff on Github in a bit.