如何让我的PHP发送邮件?


Answers:


51

从php的邮件手册中:

要求

为了使邮件功能可用,PHP需要已安装且可以运行的电子邮件系统。使用的程序由php.ini文件中的配置设置定义。

这意味着您必须安装某种邮件服务器并配置php才能使用它。通常,此邮件服务器在Ubuntu中是后缀。但是-如果您正在编码的php端最终将存储在托管服务端(例如xmission),则很可能已经在该位置安装了邮件服务器。在这种情况下,只需在线(而不是本地)测试您的网站即可。

如果您需要在自己的系统上对其进行测试,或者打算将其托管在自己的主服务器上,则可以继续进行以下操作:

Postfix安装

安装:postfix 安装后缀 / sudo apt-get install postfix 在此过程中,系统将询问您要哪种方式安装postfix。有四种可能的模式:

  • 互联网:您自己的邮件服务器。
  • 卫星:将使用外部邮件提供商(例如Google)来发送和接收邮件。服务器将不会收到任何邮件。
  • Smarthost:两者之间的混合物。邮件存储在本地,但通过外部邮件提供商发送。
  • 仅本地:不会关心您。那是系统实习邮件服务器。您只能在系统上的用户之间发送邮件。

其余的安装选项取决于您对此常规配置的选择。

您很可能会选择卫星安装。这意味着将使用外部提供程序发送邮件。然后,作为smtp服务器(外发邮件服务器),您必须指定您的提供商smtp。其余选项不言自明。

安装后配置

大多数smtp服务器需要密码验证才能发送邮件。因此,后缀将需要知道该密码。另外,还需要考虑加密等问题(您必须向Google询问)。这是您使用密码验证(sasl)配置后缀的方式:

  • 通过单击软件中心图标或使用以下命令从终端安装 libsasl2-modules 安装libsasl2-modulessasl2-bin 安装sasl2-bin

    sudo apt-get install libsasl2-2 libsasl2-modules sasl2-bin
    
  • 通过添加以下行来启用sasl-auth /etc/postfix/main.cf

     # add to /etc/postfix/main.cf
     smtp_sasl_auth_enable = yes
     smtp_sasl_security_options = noplaintext noanonymous
     smtp_sasl_password_maps = hash:/etc/postfix/sasl_password
    
  • /etc/postfix/sasl_password用以下行创建文件:

     smtp.gmail.com USERNAME@gmail.com:USERPASSWORD
    

    替换实际的密码,用户名和smtp地址。

  • 更新后缀:

     sudo chmod 600 /etc/postfix/sasl_password # for safety of your smtp password
     sudo postmap hash:/etc/postfix/sasl_password 
     sudo postmap /etc/postfix/sender_canonical
     sudo /etc/init.d/postfix restart   
    

    您可能需要规避“权限被拒绝”的错误chown postfix:postfix /etc/postfix事前。

在大多数情况下,应该这样做。但是,某些smtp提供程序需要特定的地址作为发送者或加密地址。

相关:PEAR :: Mail界面可能也对您感兴趣。

Gmail(可能还有其他服务)可能不喜欢您尝试以这种方式发送邮件,因为按照他们的标准,它可能被认为是不安全的,并且会阻止您的尝试,即在屏幕上什么也不会发生,或者整个过程的某处都会被阻止您的身份验证。另外,必须启用POP3。

要对此进行反击,请参见此处。(如果您出于安全考虑,请创建一个虚拟Gmail帐户)


从Ubuntu(本地)发送邮件有效。但是,如果我希望Windows使用此计算机发送邮件(也包括PHP)怎么办?我该如何配置?
JM在工作中

不知道我有这个问题。您可以在Ubuntu机器上打磨。现在,您要执行的操作是通过Windows PC通过php通过该Ubuntu计算机发送mal?那是对的吗?
con-f-use

2
现在,软件包libsasl2不存在。我正在使用11.04。根据更新的软件包,其libsasl2-2 ..
mythicalcoder

61

如前所述,如果您只需要在家用计算机上开发应用程序时从php发送电子邮件,则postfix会显得过大。

我个人使用非常简单轻便的软件包ssmtp。它将使用任何smtp服务器发送出站电子邮件。通过运行安装它:

sudo apt-get install ssmtp

然后编辑/etc/ssmtp/ssmtp.conf文件,注释掉现有的mailhub行并添加以下行(此示例适用于gmail smtp服务器):

mailhub=smtp.gmail.com:587
UseSTARTTLS=YES
AuthUser=<YOUR-EMAIL>@gmail.com
AuthPass=<YOUR-PASSWORD>

(提供您的gmail用户名和密码。您当然可以使用任何其他SMTP服务器)。

现在确保您的php.ini正确sendmail_path。它应显示为:

sendmail_path = /usr/sbin/sendmail -t

来自@ dima-l和@ omar-sabic的注释:您无需ssmtp在此处指定,因为安装本应为其创建一个符号链接/usr/sbin/sendmail,该链接正确指向ssmtp。否则,您必须指定sendmail_path = /usr/sbin/ssmtp -t

重新加载apache,您的php现在应该可以发送传出电子邮件了。


3
我想你的意思是sendmail_path = /usr/sbin/ssmtp -t。这很有用,谢谢
Omer Sabic

1
ssmtp应该为创建符号链接/usr/sbin/sendmail,该链接正确指向ssmtp。因此,使用也sendmail_path = /usr/sbin/sendmail -t应该有效
Dima L.

2
有关配置的更多信息ssmtp(找到了一些有用的注释):如何在Debian中设置PHP邮件 -这个问题+此链接有助于设置程序。
gskema

1
对于gmail,请考虑将您的Google帐户配置为允许“不安全的应用”运行。请参阅support.google.com/accounts/answer/6010255
2013年

1
我还必须添加以下行:FromLineOverride=YES为了避免出现以下错误:550 5.7.60 SMTP; Client does not have permissions to send as this sender
Caumons

29

PHP需要SMTP客户端发送邮件。您可以安装诸如Postfix之类的功能齐全的邮件传输代理(MTA)来实现此功能,但是如果只需要通过PHP发送邮件,那就太过分了。而是安装msmtp。它轻巧且易于配置。

安装msmtp

sudo apt-get install msmtp-mta ca-certificates

配置它

创建一个新的配置文件:

sudo vi /etc/msmtprc

...具有以下配置信息:

# Set defaults.
defaults

# Enable or disable TLS/SSL encryption.
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt

# Set up a default account's settings.
account default
host <smtp.example.net>
port 587
auth on
user <username@example.net>
password <password>
from <address-to-receive-bounces@example.net>
syslog LOG_MAIL

您需要替换“ <”和“>”中的所有内容所代表的配置数据(包括删除这些内容)。对于主机/用户名/密码,请使用常规凭据通过邮件提供商发送邮件。

告诉PHP使用它

sudo vi /etc/php5/apache2/php.ini

添加以下一行:

sendmail_path = /usr/bin/msmtp -t

当然,没有php.ini的'sudo vi /etc/php5/conf.d'将不起作用。以我的情况(Ubuntu),我必须编辑'/etc/php5/apache2/php.ini'并重新启动apache'sudo /etc/init.d/apache2 reload'才能正常工作。
Dejan 2012年

1
顺便说一句,您可以使用以下方法测试您的msmtprc配置:cat <<EOF | msmtp <receiver@test.com> Subject: test This is a test! EOF
Dejan

会很好,但是对我不起作用。它的日志中没有任何内容。似乎很好,但没有骰子。
詹姆斯·T·斯内尔

2
要使msmtp在系统范围内可用,请安装“ msmtp-mta”。
科兰

1
如果您在以下说明中像我一样太直白,则实际上并不会在配置文件中保留<>括号。我花了整整20分钟,以找出答案
德拉德

4

应该是一个简单的解决方法。您只需要安装执行实际电子邮件发送的Postfix。

sudo apt-get install postfix

您想要从终端(而不是软件中心)运行该程序,因为它需要询问一些设置问题。应该发现您只接受所有默认值(仅限本地等)。


2

这是一个古老的问题,上面还有一些有价值的答案,但是我需要exim我的环境。另外,请确认您首先安装了sendmail($ which sendmail-应该返回/ usr / sbin / sendmail之类的信息)。我在linode.com上找到了一个很好的指南,但是要点是:

apt-get install exim4-daemon-light mailutils

其次是:

dpkg-reconfigure exim4-config

这将带您进入交互式编辑器。


1

很好的答案,继续使用。

我要添加关于“虚拟gmail帐户”的一件事:

强烈建议您这样做,因为您必须将Gmail帐户配置为允许不太安全的应用程序:https : //www.google.com/settings/u/0/security/lesssecureapps 否则,您将获得“请使用网络浏览器登录”然后在/var/log/mail.log文件中重试”错误。

我也发现除非收到我的根证书gmail smtp服务器,否则我会收到超时错误。去做这个:

sudo nano /etc/postfix/main.cf

将以下内容添加到文件的底部

smtp_tls_CAfile = /etc/postfix/cacert.pem

然后将thawte根证书复制到cacert.pem文件中:

cat /etc/ssl/certs/thawte_Primary_Root_CA.pem | sudo tee -a /etc/postfix/cacert.pem

这是我使用的链接:将Postfix配置为在Ubuntu上使用Gmail SMTP | 易引擎

希望这可以节省一些毛囊。


0

我发现Dima L.提供的解决方案是最简单,最轻巧的系统解决方案。

只是一些补充,可以使设置更加清晰。您应该hostname/etc/ssmtp/ssmtp.conf文件中评论。示例ssmtp.conf文件如下:

#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=postmaster

# The place where the mail goes. The actual machine name is required no 
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=smtp.yourdomain.com
UseSTARTTLS=YES
AuthUser=mail@yourdomain.com
AuthPass=YOUREMAILPASSWORD

# Where will the mail seem to come from?
#rewriteDomain=

# The full hostname
#hostname=

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.