WordPress中配置QQ邮箱SMTP发送邮件的标准方法
方法一:
把下面的代码,粘贴到主题的 functions.php 末尾:
/**
* QQ邮箱SMTP发送邮件配置(解决激活/重置邮件收不到、中文乱码)
*/
function mail_smtp( $phpmailer ){
$phpmailer->From = " @qq.com"; // 发件人邮箱地址(你的Foxmail/QQ邮箱)
$phpmailer->FromName = "浏展网"; // 发件人显示名称,收件人看到的发件名字
$phpmailer->Host = "smtp.qq.com"; // SMTP服务器地址,QQ邮箱固定 smtp.qq.com
$phpmailer->Port = 465; // SSL加密端口:465;TLS端口可用587
$phpmailer->SMTPSecure = "ssl"; // 加密方式 ssl,配合465端口使用
$phpmailer->Username = " @qq.com"; // SMTP登录账号,同上发件邮箱
$phpmailer->Password = ' '; // QQ邮箱SMTP授权码(不是邮箱登录密码,QQ安全中心生成)
$phpmailer->IsSMTP(); // 开启使用SMTP模式发送邮件
$phpmailer->SMTPAuth = true; // 开启SMTP身份验证
$phpmailer->CharSet = 'UTF-8'; // 设置邮件字符编码,解决中文标题、内容乱码
$phpmailer->Encoding = 'base64'; // 内容编码方式base64,进一步防止中文乱码
}
add_action('phpmailer_init','mail_smtp'); // 挂载WordPress邮件初始化钩子
这段代码是WordPress中配置QQ邮箱SMTP发送邮件的标准方法,整体逻辑正确。但有几个需要立即处理的安全问题和可优化的地方:
🚨 关键问题(必须修改)
1. 邮箱地址不完整
$phpmailer->From = " @qq.com"; // ❌ 缺少用户名
$phpmailer->Username = " @qq.com"; // ❌ 同上
应改为:
$phpmailer->From = "yourname@qq.com"; // 替换为完整邮箱
$phpmailer->Username = "yourname@qq.com";
2. 授权码明文硬编码(严重安全风险)
$phpmailer->Password = ' '; // 当前为空,如果填了明文密码会泄露
建议方案:
// 方案1:使用常量(在wp-config.php定义)
define('SMTP_PASSWORD', '你的授权码');
$phpmailer->Password = SMTP_PASSWORD;
// 方案2:从数据库读取(更安全)
$phpmailer->Password = get_option('smtp_password');
3. 缺少错误处理
邮件发送失败时没有任何日志记录,建议添加:
add_action('phpmailer_init', function($phpmailer) {
// ... 配置代码 ...
// 开启调试(仅开发环境)
if (defined('WP_DEBUG') && WP_DEBUG) {
$phpmailer->SMTPDebug = 2;
$phpmailer->Debugoutput = 'error_log';
}
});
✅ 优化后的完整代码
/**
* QQ邮箱SMTP配置(安全增强版)
*/
function mail_smtp_config($phpmailer) {
// 1. 基础配置
$phpmailer->IsSMTP();
$phpmailer->SMTPAuth = true;
$phpmailer->Host = 'smtp.qq.com';
$phpmailer->Port = 465;
$phpmailer->SMTPSecure = 'ssl';
// 2. 认证信息(从常量读取)
$phpmailer->Username = defined('SMTP_USER') ? SMTP_USER : 'yourname@qq.com';
$phpmailer->Password = defined('SMTP_PASS') ? SMTP_PASS : '';
$phpmailer->From = $phpmailer->Username;
$phpmailer->FromName = '浏展网'; // 可改为 get_bloginfo('name')
// 3. 编码设置
$phpmailer->CharSet = 'UTF-8';
$phpmailer->Encoding = 'base64';
// 4. 超时设置(避免卡死)
$phpmailer->Timeout = 30;
// 5. 错误日志(可选)
if (defined('WP_DEBUG') && WP_DEBUG) {
$phpmailer->SMTPDebug = 1; // 1=错误信息, 2=完整调试
$phpmailer->Debugoutput = function($str, $level) {
error_log("SMTP: $str");
};
}
}
add_action('phpmailer_init', 'mail_smtp_config');
📝 在wp-config.php中添加常量
// 放在 wp-config.php 的 define('WP_DEBUG', true); 之后
define('SMTP_USER', '你的QQ邮箱@qq.com');
define('SMTP_PASS', '你的16位授权码'); // 从QQ邮箱安全中心获取
🔧 获取QQ邮箱授权码步骤
- 登录QQ邮箱 → 设置 → 账户
- 找到 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务
- 开启 IMAP/SMTP服务
- 按提示发送短信,获取16位授权码(不是邮箱密码!)
⚠️ 注意事项
- 端口选择:SSL用465,TLS用587(二选一)
- FromName中文:如果乱码,可改为英文名测试
- 服务器要求:确保PHP已开启
openssl扩展 - 发送限制:QQ邮箱每日发送有限额(普通用户约100封/天)
🧪 测试方法
安装插件 WP Mail SMTP 或使用以下代码测试:
// 在主题functions.php添加测试函数
function test_smtp_mail() {
$result = wp_mail('your_test@email.com', '测试主题', '邮件内容');
var_dump($result); // true=成功
}
// 访问 http://你的域名/?test_mail 触发
if (isset($_GET['test_mail'])) {
add_action('init', 'test_smtp_mail');
}
方案三:优化增强版完整代码
/**
* QQ邮箱SMTP配置(安全增强版)
*/
function mail_smtp_config($phpmailer) {
// 检查常量是否定义
if (!defined('SMTP_USER') || !defined('SMTP_PASS')) {
if (defined('WP_DEBUG') && WP_DEBUG) {
error_log('SMTP错误:请定义 SMTP_USER 和 SMTP_PASS 常量');
}
return;
}
// 1. 基础配置
$phpmailer->IsSMTP();
$phpmailer->SMTPAuth = true;
$phpmailer->Host = 'smtp.qq.com';
$phpmailer->Port = 465;
$phpmailer->SMTPSecure = 'ssl';
// 2. 认证信息
$phpmailer->Username = SMTP_USER;
$phpmailer->Password = SMTP_PASS;
$phpmailer->From = SMTP_USER;
$phpmailer->FromName = get_bloginfo('name') ?: '网站通知';
// 3. 编码设置
$phpmailer->CharSet = 'UTF-8';
$phpmailer->Encoding = 'base64';
// 4. 超时设置
$phpmailer->Timeout = 30;
// 5. 错误调试
if (defined('WP_DEBUG') && WP_DEBUG) {
$phpmailer->SMTPDebug = 2; // 生产环境建议改为1
$phpmailer->Debugoutput = function($str, $level) {
error_log("SMTP [$level]: $str");
};
}
}
add_action('phpmailer_init', 'mail_smtp_config');
📝 wp-config.php 配置示例
// 在 wp-config.php 中
define('WP_DEBUG', true);
// QQ邮箱SMTP配置
define('SMTP_USER', 'yourname@qq.com'); // 你的QQ邮箱
define('SMTP_PASS', '你的16位授权码'); // 16位授权码(不是密码!)
// 可选:设置默认发件人名称
define('SMTP_FROM_NAME', '浏展网');
方案四:推荐版本(取两版之长 + 补掉三个坑)
add_action( 'phpmailer_init', function ( $phpmailer ) {
// 1. 凭据缺失:直接放弃 SMTP,绝不用占位值去试认证
if ( ! defined( 'SMTP_USER' ) || ! defined( 'SMTP_PASS' )
|| '' === SMTP_USER || '' === SMTP_PASS ) {
error_log( '[mail] SMTP 常量未配置,已回退到 PHP mail()' );
return;
}
// 2. 基础连接
$phpmailer->isSMTP();
$phpmailer->Host = 'smtp.qq.com';
$phpmailer->Port = 465;
$phpmailer->SMTPSecure = 'ssl'; // 465=ssl / 587=tls,不要混搭
$phpmailer->SMTPAuth = true;
$phpmailer->Timeout = 30;
// 3. 锁定 LOGIN:PHPMailer 只对 LOGIN/CRAM-MD5 的凭据做脱敏,
// 协商到 PLAIN 时 base64 凭据会原样进日志
$phpmailer->AuthType = 'LOGIN';
// 4. 认证与发件人(QQ 邮箱要求 From 与认证账号一致,否则 553)
$phpmailer->Username = SMTP_USER;
$phpmailer->Password = SMTP_PASS;
$phpmailer->From = SMTP_USER;
$phpmailer->FromName = ( defined( 'SMTP_FROM_NAME' ) && SMTP_FROM_NAME )
? SMTP_FROM_NAME
: ( get_bloginfo( 'name' ) ?: '网站通知' );
$phpmailer->CharSet = 'UTF-8';
$phpmailer->Encoding = 'base64';
// 5. 调试默认关闭;排障时临时在 wp-config.php 里 define('SMTP_DEBUG', 1)
$debug = defined( 'SMTP_DEBUG' ) ? (int) SMTP_DEBUG : 0;
if ( $debug > 0 ) {
$phpmailer->SMTPDebug = $debug;
$phpmailer->Debugoutput = function ( $str, $level ) {
error_log( "SMTP[$level]: " . trim( $str ) );
};
}
} );
// 兜住"静默降级到 mail()"的情况
add_action( 'wp_mail_failed', function ( $error ) {
error_log( '[mail] 发送失败: ' . $error->get_error_message() );
} );
wp-config.php:
define( 'WP_DEBUG', false ); // 生产环境必须 false
// 首选从服务器环境变量读,凭据不进代码库
define( 'SMTP_USER', getenv( 'SMTP_USER' ) ?: '你的邮箱@qq.com' );
define( 'SMTP_PASS', getenv( 'SMTP_PASS' ) ?: '你的16位授权码' );
define( 'SMTP_FROM_NAME', '浏展网' );
// define( 'SMTP_DEBUG', 1 ); // 仅排障时临时加,用完立刻删并清理日志
方案五:加固后的推荐版本(带注释)
/**
* QQ邮箱SMTP配置(安全增强版)
*/
function mail_smtp_config($phpmailer) {
// 优先从环境变量读取凭据(更安全),兼容原常量写法
$smtp_user = getenv('SMTP_USER') ?: (defined('SMTP_USER') ? SMTP_USER : '');
$smtp_pass = getenv('SMTP_PASS') ?: (defined('SMTP_PASS') ? SMTP_PASS : '');
if (empty($smtp_user) || empty($smtp_pass)) {
if (defined('WP_DEBUG') && WP_DEBUG) {
error_log('SMTP错误:请配置 SMTP_USER / SMTP_PASS');
}
return;
}
// 1. 基础配置
$phpmailer->isSMTP(); // 新版推荐写法
$phpmailer->SMTPAuth = true;
$phpmailer->Host = 'smtp.qq.com';
$phpmailer->Port = 465;
$phpmailer->SMTPSecure = 'ssl'; // 保持默认证书校验,不要关闭 verify_peer
// 2. 认证信息
$phpmailer->Username = $smtp_user;
$phpmailer->Password = $smtp_pass;
$phpmailer->From = $smtp_user;
$phpmailer->FromName = get_bloginfo('name') ?: '网站通知';
// 3. 编码设置
$phpmailer->CharSet = 'UTF-8';
$phpmailer->Encoding = 'base64';
// 4. 超时设置
$phpmailer->Timeout = 30;
// 5. 错误调试:仅开发环境开启,且级别降到 1(只记错误,不记完整会话)
if (defined('WP_DEBUG') && WP_DEBUG
&& function_exists('wp_get_environment_type')
&& wp_get_environment_type() === 'development') {
$phpmailer->SMTPDebug = 1;
$phpmailer->Debugoutput = function($str, $level) {
error_log("SMTP [$level]: $str");
};
}
}
add_action('phpmailer_init', 'mail_smtp_config');
额外检查清单
- 确认 wp-config.php 在
.gitignore里(如果网站用了 git) - 确认服务器日志目录权限收紧(
wp-content/debug.log只对管理员可读) - 如果担心硬编码,服务器上设环境变量:
# .htaccess 或虚拟主机配置里
SetEnv SMTP_USER "你的邮箱@qq.com"
SetEnv SMTP_PASS "16位授权码"
- 上线前跑一次真实发送测试,验证后把
WP_DEBUG关掉(或改成false),既提性能也防泄露