【问题标题】:Mail() with php邮件()与PHP
【发布时间】:2013-11-06 11:43:59
【问题描述】:

我想编写一个脚本,使用 php 自动向我的客户发送电子邮件

我如何自动发送它,例如,如果他们输入他们的电子邮件。然后点击提交

我想自动发送这封电子邮件

其次,我需要在我的主机上安装 smtp 服务器吗?我可以在任何免费托管中这样做吗?

谢谢你们,我为我的语言感到抱歉

尼基

【问题讨论】:

  • 小心。一旦一些有进取心的垃圾邮件发送者发现您的网站上有一个邮件脚本,他们就会毫不犹豫地试图劫持它以将其用于垃圾邮件(然后他们的所有垃圾邮件都将来自您的服务器!)

标签: php


【解决方案1】:

我可能不会直接使用mail 函数:你需要关心的事情太多...

相反,我建议使用一些与邮件相关的库,它会为你处理很多事情。

其中一个(现在似乎取得了一些成功——例如,它正在被集成到 Symfony 框架中)Swift Mailer

当然,对于一封简单的邮件来说,这可能有点矫枉过正......但是花一些时间来学习如何使用这样的库总是值得的 ;-)

【讨论】:

  • 撰写和发送有效的电子邮件比乍看之下更难。当然,也许这不是火箭科学。但在几乎所有情况下,它都属于“已经解决,无需在前五/六/七次重新发明轮子的尝试中失败”的类别。 Swiftmailer 确实是一个漂亮的库。
  • 不仅很难正确格式化和编写像字符集这样的电子邮件位,而且仅使用邮件功能很难防止“邮件标头注入”,因此我强烈推荐 swiftmailer 作为裸机最小值(如果你想让它不那么冗长,对于常见的情况,只需为简单的情况创建一个自定义函数包装器。
【解决方案2】:

PHP 不实现 SMTP 协议 (RFC 5321) 或 IMF (RFC 5322) 或 MIME,例如 Python。取而代之的是——所有 PHP 都是一个简单的围绕 sendmail MTA 的 C 包装器。

但是 - 尽管有所有缺点 - 仍然可以创建 mime 消息(多部分/替代、多部分/混合等)并发送 html 和文本消息,还可以使用默认的 PHP 的 mail() 函数附加文件。问题是 - 这并不简单。您最终将使用“headers”mail() 参数手工制作整个消息,同时将“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 (download)
  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 服务器吗?我可以在任何免费托管中这样做吗? A: 现在任何共享主机都有 SMTP 服务器(sendmail/postfix)。

【讨论】:

    【解决方案3】:

    在大多数情况下,使用内置的 mail() 函数并不是一个好主意。所以是的,要么使用 SwiftMailer,要么:

    http://phpmailer.worxware.com/ - PhpMailer 在许多意义上是一个类似的实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多