You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Microsoft Graph将PHPMailer发送的邮件追加至已发送文件夹?

问题

我使用PHPMailer从应用程序发送邮件。对于基于IMAP的账户,我可以通过imap_append将刚发送的邮件追加到.Sent文件夹,让用户看起来像是自己发送了该邮件。我希望通过Microsoft Graph实现同样的操作:先通过PHPMailer发送邮件,再将该邮件追加至Office365/Microsoft365邮箱账户的已发送文件夹。这是否可行?查看相关文档后,发现其似乎仅支持创建草稿邮件或通过API发送完整邮件。

回答

可行。你可以通过Microsoft Graph的创建邮件接口,将PHPMailer发送后的完整MIME邮件内容直接写入Office 365的已发送文件夹,具体步骤如下:

  1. 获取PHPMailer发送后的MIME内容
    发送邮件后,通过PHPMailer的getSentMIMEMessage()方法获取完整的邮件MIME字符串:
$mail = new PHPMailer(true);
// ... 配置PHPMailer并完成邮件发送
$mimeContent = $mail->getSentMIMEMessage();
  1. 获取目标邮箱的已发送文件夹ID
    调用Microsoft Graph的GET /users/{user-id}/mailFolders接口,找到显示名称为「已发送邮件」(英文环境为Sent Items)的文件夹,记录其id值。

  2. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:05:22