谷歌停用低安全应用设置后CodeIgniter配置Gmail发信问题排查
Easy!Appointments 对接Gmail SMTP发信问题解答
1. 发信报错的查看路径
- 最直接的方式是先打开配置文件里的SMTP调试开关:找到
application/config/email.php里被注释的$config['smtp_debug'] = '1';行,取消注释。开启后触发发信动作时,页面会直接打印SMTP全链路交互日志,包括连接失败、认证失败、拒信等所有具体错误,不需要翻其他日志就能定位问题。 - 程序运行错误日志默认存储在
application/logs/目录下,日志文件按日期命名。需要先把application/config/config.php中的$config['log_threshold']设置为2(记录错误级别日志)及以上,邮件类抛出的未直接输出的异常才会被写入文件。 - 如果是虚拟主机托管环境,也可以查看主机面板提供的PHP错误日志,部分托管环境会屏蔽程序层面的输出,把连接超时、类加载错误等问题记录在面板日志中。
2. useragent参数是否为必填项
不是必填。该参数仅用于标记发信客户端的标识,不会影响SMTP连接、认证、发信的核心逻辑,不配置时会自动使用框架Email类的默认值,不会导致发信失败。
3. 当前配置的错误与遗漏项
当前配置存在多处直接导致发信失败的问题,具体如下:
- 端口与加密方式不匹配:
smtp_port设置为587时,对应的加密方式必须是tls;如果要使用ssl加密,端口需要改为465,当前587端口配ssl加密根本无法完成SMTP握手。 - 密码参数配置错误:Easy!Appointments基于CodeIgniter框架开发,Email类读取SMTP密码的参数为
smtp_pass,额外添加的mail_password参数不会被程序识别;同时当前smtp_pass填写的是谷歌账号原始密码,开启两步验证后该密码无法用于SMTP认证,必须替换为谷歌账号生成的16位应用专用密码。 - SMTP认证开关未开启:
$config['smtp_auth'] = TRUE;被注释掉了,Gmail SMTP强制要求账号认证,不开启该参数程序会跳过认证步骤,直接被服务器拒绝连接。 - 参数拼写错误:配置中写的
smpt_timeout参数名拼写错误(正确应为smtp_timeout),该配置不会生效,虽然不会直接导致发信失败,但超时设置会使用框架默认值,网络波动时更容易出现连接中断。 - 可选补充参数:建议添加
$config['charset'] = 'utf-8';配置,避免邮件内容、主题出现中文乱码。
修正后的可参考配置
<?php defined('BASEPATH') or exit('No direct script access allowed'); $config['protocol'] = 'smtp'; $config['smtp_host'] = 'smtp.gmail.com'; $config['smtp_port'] = 587; $config['smtp_crypto'] = 'tls'; $config['smtp_auth'] = TRUE; $config['smtp_user'] = '完成验证的Gmail账号/别名地址'; $config['smtp_pass'] = '16位Gmail应用专用密码'; $config['smtp_timeout'] = 60; $config['mailtype'] = 'html'; $config['charset'] = 'utf-8'; $config['wordwrap'] = TRUE; // 调试阶段打开,测通后注释或设为0 // $config['smtp_debug'] = '1';
注意:使用自定义域名作为发件别名时,必须提前在Gmail账号的「账户和导入-用其他地址发送邮件」中完成该别名的SMTP所有权验证,否则即使账号密码正确,Gmail也会拒绝发信。如果多次调试失败,可以先把
smtp_user改为原生@gmail.com地址测试,测通后再切换为别名。
内容的提问来源于stack exchange,提问作者openSourcerer
相关产品推荐
相关产品推荐

