我有一个PHP网站,我从那里发送通知电子邮件给我们的客户。电子邮件是从html表单发送的,在该表单中,我们从数据库生成正文、接收者等。
目前,电子邮件是使用以下代码通过PHP邮件函数发送的:
function SEND_MAIL($RECIPIENT,$EMAILSUBJECT,$EMAILBODY){
$emailfrom = 'mail@blabla.com';
$fromname = 'From name';
$headers =
'Return-Path: ' . $emailfrom . "\r\n" .
'From: ' . $fromname . ' <' . $emailfrom . '>' . "\r\n" .
'X-Priority: 3' . "\r\n" .
'X-Mailer: PHP ' . phpversion() . "\r\n" .
'Reply-To: ' . $fromname . ' <' . $emailfrom . '>' . "\r\n" .
'MIME-Version: 1.0' . "\r\n" .
'Content-Transfer-Encoding: 8bit' . "\r\n" .
'Content-Type: text/html; charset=ISO-8859-1' . "\r\n";
$params = '-f ' . $emailfrom;
$sendit = mail($RECIPIENT, $EMAILSUBJECT, $EMAILBODY, $headers, $params);
}
SEND_MAIL($CONTACTS_EMAIL,$EMAILSUBJECT_PERSON_A,$EMAILBODY_PERSON_A);
我们希望使用GMAIL API替换此函数,因为我们希望跟踪GMAIL帐户中已发送的邮件。我们使用Bluehost作为提供商,因此无法使用到GMAIL服务器的SMTP。我们在很多地方都在使用这个函数,所以如果可能的话,我们倾向于只修改这段代码。我花了几天的时间试着让它工作,最终我得到了一些结果。
到目前为止,我已经在谷歌开发人员控制台中配置了一切,我能够运行quickstart.php (如上所述的in this tutorial)。在本教程中,我们上传了JSON文件,并在设置了从GMAIL复制/粘贴的令牌后,可以访问gmail帐户的文件夹(标签)。
然后我可以使用我在网上找到的代码样本发送一封电子邮件
session_start();
require __DIR__ . '/vendor/autoload.php';
// Replace this with your Google Client ID
$client_id = 'blabla.apps.googleusercontent.com';
$client_secret = 'secret';
$redirect_uri = 'https://www.redirecturl';
$client = new Google_Client();
$client->setClientId($client_id);
$client->setClientSecret($client_secret);
$client->setRedirectUri($redirect_uri);
// We only need permissions to compose and send emails
$client->addScope("https://www.googleapis.com/auth/gmail.compose");
$service = new Google_Service_Gmail($client);
// Redirect the URL after OAuth
if (isset($_GET['code'])) {
$client->authenticate($_GET['code']);
$_SESSION['access_token'] = $client->getAccessToken();
$redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
}
// If Access Toket is not set, show the OAuth URL
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
$client->setAccessToken($_SESSION['access_token']);
} else {
$authUrl = $client->createAuthUrl();
}
if ($client->getAccessToken() && isset($_POST['message'])) {
$_SESSION['access_token'] = $client->getAccessToken();
// Prepare the message in message/rfc822
try {
// The message needs to be encoded in Base64URL
$emailad=$_POST['emailad'];
$username=$_POST['username'];
$emailbody=$_POST['emailbody'];
$strSubject = $_POST['subject'];
$strRawMessage = "From: fromname <fromemail>\r\n";
$strRawMessage .= "To: $username <$emailad>\r\n";
$strRawMessage .= 'Subject: =?utf-8?B?' . base64_encode($strSubject) . "?=\r\n";
$strRawMessage .= "MIME-Version: 1.0\r\n";
$strRawMessage .= "Content-Type: text/html; charset=utf-8\r\n";
$strRawMessage .= 'Content-Transfer-Encoding: quoted-printable' . "\r\n\r\n";
$strRawMessage .= "$emailbody\r\n";
$mime = rtrim(strtr(base64_encode($strRawMessage), '+/', '-_'), '=');
$msg = new Google_Service_Gmail_Message();
$msg->setRaw($mime);
$service->users_messages->send("me", $msg);
} catch (Exception $e) {
print($e->getMessage());
unset($_SESSION['access_token']);
}
} ?>
<? if ( isset ( $authUrl ) ) { ?>
<a href="<?= $authUrl; ?>"><img src="google.png" title="Sign-in with Google" /></a>
<? } else { ?>
<form method="POST" action="">
<textarea name="emailbody" required></textarea>
<input type="email" required name="emailad">
<input type="text" required name="subject">
<input type="text" required name="username">
<input type="submit" value="submit">
</form>
<? } ?>
最后一种方法也需要来自google的令牌,并请求帐户访问。
因此,我们希望使用这两种方法中的一种来替换我们的SEND_MAIL函数。我还想知道是否有可能永远不会使访问令牌过期,这样如果我们允许访问一次,我们就永远不需要通过Gmail接受程序。
谢谢你的帮忙!
发布于 2018-08-12 13:43:28
没有办法获得不过期的访问令牌,但有一种方法可以获得所谓的刷新token。刷新令牌永远不会过期,直到您取消授权您的应用程序时才可用。
我使用了您提供的代码,经过一些小的调整和更改,我能够使用Google Gmail API发送一封电子邮件。唯一的缺点刷新令牌和原始访问令牌需要存储在数据库或文件中,以便Google PHP API可以查看令牌,但这限制了必须重新登录和重新授权您的应用程序的需要。
验证文件--此文件只能使用一次。它是在数据库中设置令牌。设置令牌后,您可以从服务器中删除此文件。
<?php
require '/var/www/html/vendor/autoload.php'; // For Google Client Composer
// Replace this with your Google Client ID
$client_id = 'blabla.apps.googleusercontent.com';
$client_secret = 'secret';
$redirect_uri = 'https://www.redirecturl';
$client = new Google_Client();
$client->setClientId($client_id);
$client->setClientSecret($client_secret);
$client->setRedirectUri($redirect_uri);
$client->setAccessType('offline'); //Added for Refresh Token
$client->setApprovalPrompt('force'); //Added for Refresh Token
// We only need permissions to compose and send emails
$client->addScope("https://www.googleapis.com/auth/gmail.compose");
// Redirect the URL after OAuth
if (isset($_GET['code'])) {
$client->authenticate($_GET['code']);
$_SESSION['access_token'] = $client->getAccessToken();
}
// If Access Token is not set, show the OAuth URL
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
$display = "display: none";
$client->setAccessToken($_SESSION['access_token']);
} else {
$authUrl = $client->createAuthUrl();
}
$access_token = $client->getAccessToken();
echo '<a href="'.$authUrl.'" style="'.$display.'">Authorize ME PLZ</a>';
if ($access_token != null) {
echo "You're In!";
}
// Saves Access Token Into Database to be Used In SEND_MAIL function
$mysqli = new mysqli('servername', 'username', 'password', 'database');
$stmt = $mysqli->prepare("INSERT INTO refresh_token (refresh, original) VALUES (?, ?)");
$stmt->bind_param("ss", json_encode($access_token), json_encode($access_token)); // Updated to remove warning
$stmt->execute();
$stmt->close();
?>
SEND_MAIL函数--从数据库获取用于验证Gmail API的值:
<?php
require '/var/www/html/vendor/autoload.php';
function SEND_MAIL($RECIPIENT,$EMAILSUBJECT,$EMAILBODY){
//Get Refresh Token From Database set when running Authentication File
$conn = new mysqli("servername", "username", "password", 'database');
$sql = "SELECT * FROM refresh_token";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$token = $row['original'];
$refresh_token = $row['refresh'];
}
}
$conn->close();
// Replace this with your Google Client ID
$client_id = 'blabla.apps.googleusercontent.com';
$client_secret = 'secret';
$redirect_uri = 'https://www.redirecturl';
$client = new Google_Client();
$client->setClientId($client_id);
$client->setClientSecret($client_secret);
$client->setRedirectUri($redirect_uri);
$client->addScope("https://www.googleapis.com/auth/gmail.compose");
$client->setAccessType('offline');
$client->setApprovalPrompt('force');
$client->setAccessToken($token);
if ($client->isAccessTokenExpired()) {
$client->refreshToken($refresh_token);
$newtoken = $client->getAccessToken();
$client->setAccessToken($newtoken);
}
$service = new Google_Service_Gmail($client);
$fromemail = "<the-email-you-want-to-send-from>@gmail.com";
$strRawMessage = "From: Email <$fromemail> \r\n";
$strRawMessage .= "To: <$RECIPIENT>\r\n";
$strRawMessage .= 'Subject: =?utf-8?B?' . base64_encode($EMAILSUBJECT) . "?=\r\n";
$strRawMessage .= "MIME-Version: 1.0\r\n";
$strRawMessage .= "Content-Type: text/html; charset=utf-8\r\n";
$strRawMessage .= 'Content-Transfer-Encoding: quoted-printable' . "\r\n\r\n";
$strRawMessage .= "$EMAILBODY\r\n";
$mime = rtrim(strtr(base64_encode($strRawMessage), '+/', '-_'), '=');
$msg = new Google_Service_Gmail_Message();
$msg->setRaw($mime);
$service->users_messages->send("me", $msg);
}
SEND_MAIL('test@me.com', 'Test', 'Hey!');
?>
https://stackoverflow.com/questions/51807161
复制