Ubuntu20中如何配置php.ini让mail()通过SendGrid发送邮件
配置说明
首先明确一个容易踩的坑:你php.ini里标注了For Win32 only的SMTP、smtp_port、sendmail_from配置项,在Ubuntu这类Linux系统上完全不生效。Linux环境下PHP的原生mail()函数不会直接发起外部SMTP连接,只会调用sendmail_path指定的本地邮件发送程序处理外发请求。
你有两种可行方案实现mail()函数走SendGrid发信,不需要修改现有PHP代码。
方案1:通过msmtp轻量转发(推荐,配置成本最低)
msmtp是专门的SMTP转发小工具,不需要复杂的MTA配置,直接替换sendmail路径即可。
- 安装依赖:
sudo apt update && sudo apt install -y msmtp ca-certificates - 创建全局msmtp配置文件
/etc/msmtprc,写入SendGrid参数:account default host smtp.sendgrid.net port 587 tls on tls_starttls on tls_trust_file /etc/ssl/certs/ca-certificates.crt auth on user apikey password 6fggd_long_key from info@example.com logfile /var/log/msmtp.log - 配置文件权限,保证PHP进程可以正常读取:
sudo chmod 644 /etc/msmtprc sudo touch /var/log/msmtp.log sudo chmod 666 /var/log/msmtp.log - 修改对应运行模式的php.ini配置(注意CLI和FPM/Apache模式的php.ini是分开的,两个都要改才能保证命令行和web访问都正常),找到
[mail function]段修改为如下内容:[mail function] ; Win32专属配置可以直接注释,Linux下不生效 ;SMTP = localhost ;smtp_port = 25 ;sendmail_from = me@example.com ; 核心配置:指定发送程序为msmtp sendmail_path = "/usr/bin/msmtp -t -i" mail.force_extra_parameters = mail.add_x_header = Off ; 开启PHP邮件日志方便排错 mail.log = /var/log/php_mail.log - 重启对应PHP服务加载配置:
# PHP-FPM模式,替换成你实际安装的PHP版本号 sudo systemctl restart php8.1-fpm # Apache mod_php模式执行这个 # sudo systemctl restart apache2
方案2:配置已安装的sendmail服务做SMTP中继
如果你不想额外安装工具,也可以直接把系统自带的sendmail配置为SendGrid的中继代理,php.ini保持默认的sendmail_path即可。
- 安装sendmail认证依赖:
sudo apt install -y sendmail-cf sasl2-bin - 编辑
/etc/mail/authinfo写入SendGrid认证信息:AuthInfo:smtp.sendgrid.net "U:apikey" "P:6fggd_long_key" "M:PLAIN" - 生成认证数据库并设置安全权限:
sudo makemap hash /etc/mail/authinfo < /etc/mail/authinfo sudo chmod 600 /etc/mail/authinfo /etc/mail/authinfo.db - 编辑sendmail主配置文件
/etc/mail/sendmail.mc,在文件末尾添加如下中继规则:define(`SMART_HOST',`smtp.sendgrid.net')dnl define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl define(`ESMTP_MAILER_ARGS', `TCP $h 587')dnl define(`confAUTH_OPTIONS', `A p')dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl FEATURE(`authinfo',`hash -o /etc/mail/authinfo.db')dnl注意:配置里的左引号是数字1键左侧的反引号,右引号是普通单引号,不要输错否则配置编译失败。
- 重新编译sendmail配置并重启服务:
sudo make -C /etc/mail sudo systemctl restart sendmail
验证配置
执行如下命令测试发信,返回bool(true)即表示调用成功:
php -r 'var_dump(mail("你的测试收件邮箱@example.com","测试邮件主题","这是通过SendGrid发送的测试正文"));'
如果发信失败,可以查看/var/log/php_mail.log、/var/log/msmtp.log或系统邮件日志/var/log/mail.log定位报错。
注意:你配置的发件人info@example.com必须提前在SendGrid后台完成域名或单邮箱验证,否则会被SendGrid拒绝发信。
内容的提问来源于stack exchange,提问作者Gandalf
相关产品推荐
相关产品推荐

