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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:39:14