PHP中的Mail()函数

4
我希望能用PHP编写一个脚本,自动向我的客户发送电子邮件。
如何实现自动发送呢?例如,如果他们输入了邮箱并点击提交按钮。
我想要自动发送这封电子邮件。
另外,我需要在我的主机上安装SMTP服务器吗?还是可以在任何免费的托管服务中使用?
谢谢大家,对于我的语言问题,我深感抱歉。
Nikky

1
小心。一旦有些有企图心的垃圾邮件发送者发现你的网站上有一个邮件脚本,他们会毫不犹豫地试图劫持它用于垃圾邮件(然后所有的垃圾邮件都将来自你的服务器!) - Jeremy Powell
3个回答

6

PHP没有实现SMTP协议(RFC 5321)或IMF(RFC 5322),也没有像Python一样实现MIME。相反,PHP只有一个简单的C封装器,用于sendmail MTA。

然而,尽管存在所有这些缺点,人们仍然可以使用默认的PHP mail()函数创建mime消息(multipart/alternative、multipart/mixed等),发送HTML和文本消息,并附加文件。问题在于 - 这不是直观的。您将使用“headers”邮件()参数手工制作整个消息,同时将“message”参数设置为''。此外,通过PHP的mail()循环发送电子邮件将是性能浪费,因为mail()为每个新电子邮件打开新的smtp连接。

/**sending email via PHP's Mail() example:**/
$to      = 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: webmaster@example.com' . "\r\n" .
    'Reply-To: webmaster@example.com' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);

由于这些限制,大多数人最终使用第三方库,例如:

  1. PHPmailer (下载)
  2. Swiftmailer
  3. Zend_Mail

使用这些库可以轻松构建文本或HTML消息。添加文件也变得很容易。

/*Sending email using PHPmailer example:*/
require("class.phpmailer.php");
$mail = new PHPMailer();

$mail->From = "from@example.com";
$mail->FromName = "Your Name";
$mail->AddAddress("myfriend@example.net"); // This is the adress to witch the email has to be send. 
$mail->Subject = "An HTML Message";
$mail->IsHTML(true); // This tell's the PhPMailer that the messages uses HTML.
$mail->Body = "Hello, <b>my friend</b>! \n\n This message uses HTML !";
$mail->AltBody = "Hello, my friend! \n\n This message uses HTML, but your email client did not support it !";

if(!$mail->Send()) // Now we send the email and check if it was send or not.
{
   echo 'Message was not sent.';
   echo 'Mailer error: ' . $mail->ErrorInfo;
}
else
{
   echo 'Message has been sent.';
}

此外: 问:我需要在我的主机上安装SMTP服务器吗?我可以在任何免费的托管服务中使用它吗? 答:现在任何共享托管服务都有SMTP服务器(sendmail/postfix)。

6
我建议您不要直接使用mail函数:需要考虑的因素太多了...
相反,我建议使用一些邮件相关的库,它们将为您处理很多事情。
其中之一 (现在似乎取得了一些成功 -- 例如,在Symfony框架中被集成)Swift Mailer
当然,如果只是简单的邮件可能会有点大材小用...但投资一些时间学习如何使用这样的库总是值得的 ;-)

1
撰写和发送有效的电子邮件比起初看来要困难得多。当然,也许这不是火箭科学。但在几乎所有情况下,它都属于“已经解决了,没有必要在第五/六/七次尝试中重复造轮子”的范畴。而Swiftmailer确实是一个非常棒的库。 - VolkerK
不仅格式化和正确编写电子邮件位元素(如字符集)很困难,而且仅仅使用邮件函数就很难防止“邮件头注入”。因此,我强烈建议至少使用SwiftMailer(如果要使其更简洁,在常见情况下,只需为简单情况创建自定义函数包装器)。 - Kzqai

2
在大多数情况下,使用内置的mail()函数并不是一个好主意。因此,要么使用SwiftMailer,要么使用PhpMailer,它在很多方面都是类似的实现。请注意保留HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接