今天上个项目,需要用到php的mail()函数。由于没有架设邮件服务器,也限制不能使用phpmail(),于是使用exim4。方法如下,但还是遇到了好多坑。最坑的当属一个分号——;。

服务器环境:Debian

步骤:

  1. 安装
    1. apt-get remove sendmail-* #卸载 Sendmail
    2. apt-get install exim4 #安装exim4
  2. 配置
    1. dpkg-reconfigure exim4-config #配置exim4
    2. echo "邮件正文" | mail -s 邮件主题 [email protected] #测试邮件发送
    3. vim php.ini,sendmail_path = /usr/sbin/sendmail -t -i #在php里添加sendmail参数 ——坑就在这里!
    4. systemctl restart apache2 & systemctl restart php-fpm #重启apache2和php-fpm
  3. 测试
    1. 新建php文件,输入以下代码:
       <?php
           $txt = "First line of text\nSecond line of text";
           // 如果一行大于 70 个字符,请使用 wordwrap()。
           $txt = wordwrap($txt,70);
           // 发送邮件
           mail("[email protected]","My subject",$txt);
       ?>
      
    2. 然后并没有收到邮件。
  4. 修复
    1. sendmail_path = "/usr/sbin/sendmail -t" -i #双引号,测试失败
    2. sendmail_path = '/usr/sbin/sendmail -t -i' #单引号,测试失败
    3. sendmail_path = /usr/sbin/sendmail -t -i; #分号,成功。
  5. 结论
    1. 在php配置文件中,前面的分号代表注释当前行,后面的分号代表一行完整结尾。
    2. systemctl和service都可以控制服务状态。