send email using gmail-api and google-api-php-client

感情迁移 提交于 2019-12-01 10:03:37

问题


I am using https://github.com/google/google-api-php-client and I want to send a test email with a user's authorized gmail account.

This is what I have so far:

$msg = new Google_Service_Gmail_Message();  
$msg->setRaw('gp1');  
$service->users_messages->send('me', $msg);  

This results in a bounce email because I have no clue how to set the raw message. I see the bounce in the inbox of my authenticated user. I want to learn how to set values for 'To', 'Cc', 'Bcc', 'Subject', and 'Body' of the email. I believe I will need to do a 64 encoding on that raw data as well. And I might want to use some html in the body of my email.

Please help to provide a working example of sending an email using the gmail-api and the google-api-php-client.

Here is the bounced email in the inbox:

Bounce -nobody@gmail.com- 12:58 PM (7 minutes ago)
to me
An error occurred. Your message was not sent.

‚ Date: Thu, 24 Jul 2014 10:58:30 -0700 Message-Id: CABbXiyXhRBzzuaY82i9iODEiwxEJWO1=jCcDM_TH-


回答1:


I asked a more specific question which has led me to an answer. I am now using PHPMailer to build the message. I then extract the raw message from the PHPMailer object. Example:

require_once 'class.phpmailer.php';
$mail = new PHPMailer();
$mail->CharSet = "UTF-8";
$subject = "my subject";
$msg = "hey there!";
$from = "myemail@gmail.com";
$fname = "my name";
$mail->From = $from;
$mail->FromName = $fname;
$mail->AddAddress("tosomeone@somedomain.com");
$mail->AddReplyTo($from,$fname);
$mail->Subject = $subject;
$mail->Body    = $msg;
$mail->preSend();
$mime = $mail->getSentMIMEMessage();
$m = new Google_Service_Gmail_Message();
$data = base64_encode($mime);
$data = str_replace(array('+','/','='),array('-','_',''),$data); // url safe
$m->setRaw($data);
$service->users_messages->send('me', $m);



回答2:


I've used this solution as well, worked fine with a few tweaks:

When creating the PHPMailer object, the default encoding is set to '8bit'. So I had to overrule that with:

$mail->Encoding = 'base64';

The other thing i had to do was tweaking the MIME a little to make it POST ready for the Google API, I've used the solution by ewein:

Invalid value for ByteString error when calling gmail send API with base64 encoded < or >

Anyway, this is how I've solved your problem:

//prepare the mail with PHPMailer
$mail = new PHPMailer();
$mail->CharSet = "UTF-8";
$mail->Encoding = "base64";

//supply with your header info, body etc...
$mail->Subject = "You've got mail!";
...

//create the MIME Message
$mail->preSend();
$mime = $mail->getSentMIMEMessage();
$mime = rtrim(strtr(base64_encode($mime), '+/', '-_'), '=');

//create the Gmail Message
$message = new Google_Service_Gmail_Message();
$message->setRaw($mime);
$message = $service->users_messages->send('me',$message);



回答3:


Create the mail with phpmailer works fine for me in a local enviroment. On production I get this error:

Invalid value for ByteString

To solve this, remove the line:

$mail->Encoding = 'base64';

because the mail is two times encoded.

Also, on other questions/issues I found the next:

use

strtr(base64_encode($val), '+/=', '-_*')

instead of

strtr(base64_encode($val), '+/=', '-_,')



回答4:


I Used https://developers.google.com/gmail/api/v1/reference/users/messages/send

and able to send email successfully.



来源:https://stackoverflow.com/questions/24940984/send-email-using-gmail-api-and-google-api-php-client

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!