- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 Google 的 PHP 客户端库向 Gmail 的 API 发送调用。使用这些资源,我可以创建电子邮件草稿。但我终其一生都无法弄清楚如何使用客户端库来创建带附件的电子邮件草稿。两周以来,我一直在阅读我能在网上找到的所有内容,但我仍然没有找到答案。
这似乎很简单。有人知道答案吗?
谢谢!
编辑:感谢 johncorser 在正确方向上的插入。使用 zetacomponents,我能够正确地构建消息(在使用 PHPMailer 和 Mail_mime 失败两周后)。这是我的最终代码:
<?php
session_start();
require 'Google/autoload.php';
require 'Google/Client.php';
require 'Google/Service/Gmail.php';
require 'ezc/Base/base.php';
spl_autoload_register( array( 'ezcBase', 'autoload' ) );
//Get credential
$config = parse_ini_file('helpers/config.ini');
// Setup Google API Client
$client = new Google_Client();
$client->setClientId($config['client_id']);
$client->setClientSecret($config['client_secret']);
$client->setRedirectUri($config['redirect_url']);
$client->addScope('https://www.googleapis.com/auth/gmail.modify');
// Create GMail Service
$service = new Google_Service_Gmail($client);
// Check if user is logged out
if(isset($_REQUEST['logout'])){
unset($_SESSION['access_token']);
}
// Check if we have an authorization code; if so, use it
if(isset($_GET['code'])){
$code = $_GET['code'];
$client->authenticate($code);
$_SESSION['access_token'] = $client->getAccessToken();
$url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
header('Location: ' . filter_var($url,FILTER_VALIDATE_URL));
}
// Check if we have an access token in the session; if so, setup input form; if not, create auth URL
if(isset($_SESSION['access_token']) && $_SESSION['access_token']) {
$client->setAccessToken($_SESSION['access_token']);
echo "<form action='' method='post' enctype='multipart/form-data'>
<p>Your First Name: <input type='text' name='first' required></p>
<p>Your Last Name: <input type='text' name='last' required></p>
<p>Body (without any greeting):</p> <textarea rows='20' cols='100' name='body' required></textarea>
<p>Select headshot (JPG, JPEG, PNG, or GIF) to upload: <input type='file' name='headshotToUpload' id='headshotToUpload' required></p>
<p>Select resume PDF to upload: <input type='file' name='resumeToUpload' id='resumeToUpload' required></p>
<p><input type='submit' name='submit' value='Create Drafts'></p></form>";
} else {
$loginUrl = $client->createAuthUrl();
}
//If auth URL is set, create llink for user to login; otherwise, show logout link
if (isset($loginUrl)) {
echo "<a class='login' href='" . $loginUrl . "'>First Click Here to Connect Through Google!</a>";
} else {
echo "<a class='logout' href='?logout'>Logout</a>";
}
//Once submit button is pressed, begin file upload process
if(isset($_POST['submit'])) {
$target_dir = "uploads/";
$target_hsfile = $target_dir . basename($_FILES["headshotToUpload"]["name"]);
$target_cvfile = $target_dir . basename($_FILES["resumeToUpload"]["name"]);
$uploadOk = 1;
//Check if filenames already exist
if (file_exists($target_hsfile)) {
echo "Please rename your headshot before uploading.";
$uploadOk = 0;
}
if (file_exists($target_cvfile)) {
echo "Please rename your resume before uploading.";
$uploadOk = 0;
}
//Check that file types are permitted
$hsFileType = pathinfo($target_hsfile,PATHINFO_EXTENSION);
if($hsFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) {
echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed for headshots.";
$uploadOk = 0;
}
$cvFileType = pathinfo($target_cvfile,PATHINFO_EXTENSION);
if($cvFileType != "pdf") {
echo "Sorry, resumes must be in PDF format only.";
$uploadOk = 0;
}
//Report on success or failure of upload
if ($uploadOk == 0) {
echo "Sorry, your files were not uploaded. Please correct the noted error(s) and try again";
} else {
// If everything is ok, try to upload file
if ((move_uploaded_file($_FILES["headshotToUpload"]["tmp_name"], $target_hsfile)) && ((move_uploaded_file($_FILES["resumeToUpload"]["tmp_name"], $target_cvfile)))) {
echo "The files ". basename( $_FILES["headshotToUpload"]["name"]). " and ". basename( $_FILES["resumeToUpload"]["name"]). " have been uploaded.";
} else {
echo "Sorry, there was an error uploading your file.";
}
}
//Load data
$agent_data = parse_ini_file('helpers/agents.ini', true);
//Iterate through agencies
foreach ($agent_data as $agency) {
$mail = new ezcMail();
$mail->addTo( new ezcMailAddress($agency['agent_email'], $agency['agent_first']." ".$agency['agent_last'] ));
$mail->subject = "Submission of " . $_POST['first'] . " " . $_POST['last'] . " to " . $agency['agency_name'];
$textpart = new ezcMailText("Dear " . $agency['agent_salut'] . " " . $agency['agent_last'] . "," . "\r\n" . "\r\n" . $_POST['body'] . "\r\n" . "\r\n" . "Sincerely," . "\r\n" . "\r\n" . $_POST['first'] . " " . $_POST['last']);
$fileAttachment1 = new ezcMailFile($target_hsfile);
$fileAttachment2 = new ezcMailFile($target_cvfile);
$mail->body = new ezcMailMultipartMixed( $textpart, $fileAttachment1, $fileAttachment2 );
$message = $mail->generate();
$msgbody = new Google_Service_Gmail_Message();
$msgbody->setRaw(rtrim(strtr(base64_encode($message), '+/', '-_'), '='));
$draft = new Google_Service_Gmail_Draft();
$draft->setMessage($msgbody);
$service->users_drafts->create('me', $draft);
unset($mail);
unset($msgbody);
unset($draft);
}
}
?>
最佳答案
如果您有原始电子邮件消息,这很容易。我会尝试这样的事情:
public function save_draft(Google_Service_Gmail $gmail, $raw_message, $gmail_thread_id = null)
{
$postBody = new Google_Service_Gmail_Message();
$postBody->setRaw(rtrim(strtr(base64_encode($raw_message), '+/', '-_'), '=');
if ($gmail_thread_id)
$postBody->setThreadId($gmail_thread_id);
$draft = new Google_Service_Gmail_Draft();
$draft->setMessage($postBody);
return $gmail->users_drafts->create('me', $draft);
}
此函数应创建一个草稿,将该草稿添加到您传入的任何 gmail 线程,然后返回结果。这种奇怪的 base64_encode 业务的原因是因为 gmail api 需要一个相当具体的编码。您应该能够只在原始正文中包含附件。
关于php - Gmail API PHP 客户端库 - 如何使用 PHP 客户端库创建带有附件的电子邮件草稿?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29068417/
只是出于好奇,我想知道gmail是如何做到的。查看页面源代码后,您看不到任何链接、onclick 方法和 javascript。我知道他们隐藏了 javascript,但页面仍然知道有点击。是否有一个
最近谷歌宣布,出于安全目的,Gmail 将使用代理加载外部图像。这导致我的应用程序在 Gmail 中显示图像时出现问题。 Gmail图片元素检查: https://ci5.googleusercont
我想将节点脚本作为 cronjob 运行,它使用 Gmail 的 API 来轮询我拥有的 gmail 帐户。 我关注 these quickstart instructions : 我被困在第一步。在
如果您在 Gmail 上处于非事件状态,则通过一段时间不移动鼠标,您的聊天状态会更改为橙色,这意味着空闲。但是当您再次开始移动鼠标时,它会变回绿色,表示处于事件状态。它如何知道您何时移动鼠标? 最佳答
您知道,当您加载 GMail 时,左侧会显示“撰写邮件”、“收件箱”、“已发送邮件”等吗?我在页面源代码中搜索了“撰写邮件”,但一无所获。 最佳答案 Gmail 界面使用 JavaScript 动态加
我正在创建一个函数,使用 Google 的 API 从一个人的 gmail 帐户导入联系人。但是我知道许多企业注册 Google 是为了拥有更专业的域名(例如 some_name@bislr.com)
我可以通过桌面应用程序使用 Gmail API 成功读取我的收件箱内容。但是,当我尝试阅读其他人的 gmail 收件箱时,我收到 Delegation denied 异常? 所以我的问题是,Gmail
我已经读到我可以使用 gmail atom 提要从谷歌创建的“内置”标签中获取邮件。 但是当我尝试从“已读”标签获取邮件时,使用 https://mail.google.com/mail/feed/a
通过 Gmail API 发送到 Gmail 地址的邮件在 Gmail 中被标记为“小心处理此邮件。它包含通常用于窃取个人信息的内容。” 该消息基本上只是说测试。并且通过 Gmail SMTP 发送的
编辑 :解决下面的第一条评论,为清楚起见,这不是代码问题。问题很简单: 我应该在新 Gmail UI 的 URI 查询字符串中输入什么来查看 Gmail API 创建的草稿邮件? 尽管这并不是一个真正
我是谷歌产品的新手。我打算开始在 gmail 中添加一些东西。使用类似于 Add on 的 Add on 或 chrome Gmail Extension 更好吗?如果是add-on,我们不能直接在s
使用标准查询格式时,Gmail api 和 Gmail Web ui 的结果有所不同,如下所述 - https://support.google.com/mail/answer/7190 . 该问题专
我正在尝试创建一个 PHP 应用程序,它将自动设置用户的电子邮件签名。这部分有效,我可以为用户设置签名。 我的问题是我在 SendAs 设置中找不到任何选项,该选项将禁用 GMail 中签名前插入的两
我的电子邮件标记通过了电子邮件标记测试器,我尝试了 JSON-LD 和微数据,但无论如何 - 我只是看不到标记在 Gmail (iOS) 客户端中的任何效果。 即使是 Google 自己文档中的基本示
我目前正在使用 Gmail 实验室功能 - canned responses.我有很多这样的预设回复并使用 their menu找到合适的,证明是耗时的。通过以下方式找到预设响应会更容易: 将预设回复
请问是否可以在我的 Gmail 状态中发布倒计时? 像“01:44:15:23”及其不断递减。 最佳答案 发现一个好 article to share : Google Talk 使用 XMPP 那么
我开发了一个上下文小工具并将其安装在我的域中。它在我的域中运行良好,但在我的域之外无法正常工作。如何在我的域外访问我的小工具? 最佳答案 您指的是您的 Google Apps 域吗?根据 Google
我在 this guide 之后配置了推送通知并在调用 watch 时端点我得到大约一周的到期时间。 在此期间,我希望收到有关我已配置的 Pub/Sub 主题的通知,而无需调用 watch。在到期日期
是否有可以在 gmail 中捕获的 API 或事件,以便我可以启动工作流甚至触发 python 脚本。 我正在尝试自动化一项工作,该工作将从已到达 gmail 的电子邮件中提取 csv 附件。然后它会
为什么网络版的 Gmail 会在不使用 = 标记中断位置的情况下对邮件内容进行换行,这使得电子邮件处理变得非常困难: 查看gmail发送的原始邮件内容: 这封由 Mac OS X Mail 发送的邮件
我是一名优秀的程序员,十分优秀!