如何使用Microsoft Graph将PHPMailer发送的邮件追加至已发送文件夹?
问题
我使用PHPMailer从应用程序发送邮件。对于基于IMAP的账户,我可以通过imap_append将刚发送的邮件追加到.Sent文件夹,让用户看起来像是自己发送了该邮件。我希望通过Microsoft Graph实现同样的操作:先通过PHPMailer发送邮件,再将该邮件追加至Office365/Microsoft365邮箱账户的已发送文件夹。这是否可行?查看相关文档后,发现其似乎仅支持创建草稿邮件或通过API发送完整邮件。
回答
可行。你可以通过Microsoft Graph的创建邮件接口,将PHPMailer发送后的完整MIME邮件内容直接写入Office 365的已发送文件夹,具体步骤如下:
- 获取PHPMailer发送后的MIME内容
发送邮件后,通过PHPMailer的getSentMIMEMessage()方法获取完整的邮件MIME字符串:
$mail = new PHPMailer(true); // ... 配置PHPMailer并完成邮件发送 $mimeContent = $mail->getSentMIMEMessage();
获取目标邮箱的已发送文件夹ID
调用Microsoft Graph的GET /users/{user-id}/mailFolders接口,找到显示名称为「已发送邮件」(英文环境为Sent Items)的文件夹,记录其id值。调用Graph接口将邮件写入已发送文件夹
使用POST /users/{user-id}/messages接口,将MIME内容编码为base64后传入请求体,同时指定邮件为非草稿状态,并指向已发送文件夹:
// 示例PHP请求(需先通过OAuth获取Graph访问令牌) $accessToken = '你的Graph访问令牌'; $userId = '目标用户的邮箱或ID'; $sentFolderId = '已发送文件夹的ID'; $base64Mime = base64_encode($mimeContent); $payload = json_encode([ 'internetMessageRaw' => $base64Mime, 'isDraft' => false, 'parentFolderId' => $sentFolderId ]); $ch = curl_init("https://graph.microsoft.com/v1.0/users/$userId/messages"); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: Bearer $accessToken", "Content-Type: application/json" ]); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch);
关键说明
internetMessageRaw字段用于传入完整的base64编码MIME内容,确保邮件的内容、格式、附件等与PHPMailer发送的完全一致。isDraft: false会将邮件标记为已发送状态,而非草稿。- 应用需拥有
Mail.ReadWrite权限(通过Azure AD配置),才能创建并写入邮件到用户的邮箱文件夹。
内容的提问来源于stack exchange,提问作者Guido Goluke
相关产品推荐
相关产品推荐

