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

PHP通过IMAP获取Gmail已发送邮件到自定义页面无返回问题

Gmail已发送邮件拉取失败问题解决

核心问题原因

代码无法拉取到已发送邮件,主要由3个关键错误导致:

  1. IMAP连接目标错误:代码中连接的是INBOX收件箱文件夹,根本没有访问已发送邮件目录
  2. Gmail IMAP认证配置不符合当前谷歌安全规则,直接使用账号密码无法正常通过认证
  3. 邮件正文抓取逻辑写死了段落序号,多数情况下无法正确获取邮件内容

分步修复方案

  • 修正IMAP连接路径
    Gmail IMAP的已发送邮件默认路径为[Gmail]/Sent Mail,将原代码中的$hostname变量替换为以下值:

    $hostname = '{imap.gmail.com:993/imap/ssl}[Gmail]/Sent Mail';
    

    注意:如果你的Gmail界面设置为中文,部分账号的已发送文件夹名称为[Gmail]/已发送邮件,如果连接时提示文件夹不存在,可以临时运行以下代码打印账号下所有文件夹的准确名称:

    $test_conn = imap_open('{imap.gmail.com:993/imap/ssl}', $username, $password);
    print_r(imap_list($test_conn, '{imap.gmail.com:993/imap/ssl}', '*'));
    imap_close($test_conn);
    
  • 配置Gmail侧的IMAP访问权限

    1. 登录Gmail网页端,进入「设置-转发和POP/IMAP」,启用IMAP访问权限后保存设置
    2. 为你的Gmail账号开启两步验证,之后在谷歌账户「安全」设置页生成16位的应用专用密码,将这个密码填入代码的$password变量中。目前谷歌已全面下线低安全性应用访问入口,直接使用账号原密码无法通过IMAP认证。
  • 补全连接错误判断、修正正文抓取逻辑
    原代码没有做连接失败、搜索结果为空的判断,且写死抓取第2段邮件内容,无法兼容不同结构的邮件。修复后的完整可运行代码如下:

    <?php
    /* 连接Gmail已发送文件夹 */
    $hostname = '{imap.gmail.com:993/imap/ssl}[Gmail]/Sent Mail';
    $username = '替换为你的Gmail地址';
    $password = '替换为你生成的16位应用专用密码';
    
    /* 连接并捕获错误 */
    $inbox = imap_open($hostname, $username, $password) or die('IMAP连接失败: ' . imap_last_error());
    
    /* 拉取所有邮件 */
    $emails = imap_search($inbox,'ALL');
    
    if($emails) {
      $output = '';
      // 最新邮件排在最前
      rsort($emails);
      
      foreach($emails as $email_number) {
        $overview = imap_fetch_overview($inbox,$email_number,0);
        // 兼容不同结构的邮件正文抓取,优先取纯文本内容
        $message = imap_fetchbody($inbox,$email_number,1);
        if(empty($message)){
          $message = imap_fetchbody($inbox,$email_number,2);
        }
        // 解码邮件内容,避免乱码
        $message = imap_qprint($message);
    
        $output.= '<div class="toggler '.($overview[0]->seen ? 'read' : 'unread').'">';
        $output.= '<span class="subject">'.$overview[0]->subject.'</span> ';
        $output.= '<span class="from">'.$overview[0]->from.'</span>';
        $output.= '<span class="date">on '.$overview[0]->date.'</span>';
        $output.= '</div>';
        $output.= '<div class="body">'.$message.'</div>';
      }
      echo $output;
    } else {
      echo "已发送文件夹中未查询到邮件,错误信息:".imap_last_error();
    }
    
    imap_close($inbox);
    ?>
    

内容的提问来源于stack exchange,提问作者Dev AWS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:39:16