【问题标题】:PHP mail() relay to mail serverPHP mail() 中继到邮件服务器
【发布时间】:2012-09-22 15:06:35
【问题描述】:

我注意到其他一些与我的问题相似的帖子,但发现它们不是针对我的场景,或者我只是不太了解事情。

我的情况:我正在尝试使用 PHP mail() 函数从 LAMP 服务器发送邮件。我想将邮件中继到另一个专用邮件服务器。

问题:我似乎无法发送邮件……有时。有时它似乎能够向域外的帐户发送邮件,但它无法向域/网络内的帐户发送任何邮件。我经常看到日志抱怨它无法向域控制器进行身份验证......但它应该不必担心吗?

我想我感到困惑的部分是 PHP mail() 函数是否会自动向服务器创建 SMTP 消息?还是我必须设置 php.ini 设置来查看本地主机,然后配置 sendmail/postfix 以将消息发送到邮件服务器。另外,如果我只指定 LAMP 服务器尝试与邮件服务器连接,为什么还要麻烦与域控制器进行身份验证?

希望有人能帮我解决这个问题。这一直困扰着我一段时间,一直无法找到解决方案。 谢谢,

【问题讨论】:

  • 你有没有考虑过使用phpmailer 使用SMTP 发送邮件? Mail() 有点过时了。也可以在php.ini中设置一些邮件参数
  • 不幸的是,我认为我无法使用 mail()。我正在尝试使用由另一家公司开发的应用程序,并且在我们购买该软件之前,它们的源代码是加密的(也许这是错误的词) - 但他们确实透露他们使用 mail() 函数发送邮件。我们想在购买之前解决问题。我得看看 phpmailer 以防万一它作为一个选项出现。

标签: php linux email


【解决方案1】:

PHP mail() 函数是否会自动创建一个 SMTP 消息来发送 服务器?还是我必须设置 php.ini 设置才能查看 localhost 然后配置 sendmail/postfix 将消息发送到 邮件服务器

PHP 的 mail() 函数本身并不能做那么多。在 linux 上,它通常会使用 php.ini 中定义的设置连接到 sendmail 或类似的本地实例。从示例 php.ini 中查看此部分:

[mail function]
; For Win32 only.
; SMTP = localhost
; smtp_port = 25

; For Win32 only.
;sendmail_from = me@example.com

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = /usr/sbin/sendmail -t -i

对于 Windows,mail() 使用配置端口的 SMTP 服务器。对于 linux,使用定义的 sendmail 路径。

换句话说,Windows 上的 PHP mail() 函数连接到一个 SMTP 服务器,无论是本地的还是远程的。 Linux 上的 PHP mail() 不能做同样的事情。在 Linux 上,该功能将仅使用本地 sendmail 安装,您需要自行设置以连接到 SMTP 服务器。这种配置的替代方法是使用 PHPMailer、Swiftmailer、Zend_Mail 或类似的,它们自己提供 SMTP 功能。


如果我要通过域控制器进行身份验证,为什么还要麻烦? 仅指定 LAMP 服务器尝试连接邮件 服务器?

我远不是这方面的专家,但据我了解,您需要成为网络中经过身份验证的用户才能访问邮件所需的外部资源。域控制器会发出这种权限。

【讨论】:

  • 我有点想可能是因为我遇到了这些错误,所以它需要一些身份验证。我感到困惑的部分是我已经用 Perl 完成了一些简单的邮件处理,它不需要我对服务器进行身份验证......除非 Perl 只是在做向导魔术并从本地 LAMP 服务器发送它。我有点假设 mail() 需要 sendmail 或其他,但我想我对设置 php.ini 文件以查看远程服务器...或本地服务器的语义感到困惑?感谢您的帮助
  • @StephenR PHP mail() 在Windows 上可以与本地或远程的SMTP 服务器通信。 Linux 上的 PHP mail() 不能;它只会使用您需要自己设置以连接到 SMTP 服务器的本地 sendmail 安装。或使用提供此功能的 PHPMailer、Swiftmailer、Zend_Mail 或类似工具。
  • 这实际上有助于我理清思路。我想这意味着我必须弄清楚如何配置一些邮件中继应用程序才能让它工作。再次感谢!
  • 没有问题。也有关于同一主题的longer thread
  • 也将其添加到答案中,因此可以将其标记为已接受(如果您认为这是答案)。
【解决方案2】:

开始使用Swiftmailer (documentation) 或PhpMailer,你的生活会更轻松...

Swiftmailer 示例:

require_once 'lib/swift_required.php';
$transport = Swift_MailTransport::newInstance();
$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance('Wonderful Subject')
    ->setFrom(array('john@doe.com' => 'John Doe'))
    ->setTo(array('receiver@domain.org', 'other@domain.org' => 'A name'))
    ->setBody('Here is the message itself');
$mailer->send($message);

PhpMailer 示例:

$mail             = new PHPMailer(); // defaults to using php "mail()"
$mail->SetFrom('name@yourdomain.com', 'First Last');
$mail->AddReplyTo("name@yourdomain.com","First Last");
$mail->AddAddress("whoto@otherdomain.com", "John Doe");
$mail->Subject    = "PHPMailer Test Subject via mail(), basic";
$mail->AltBody    = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
$mail->MsgHTML($body);
$mail->AddAttachment("images/phpmailer.gif");      // attachment
$mail->AddAttachment("images/phpmailer_mini.gif"); // attachment
if(!$mail->Send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
} else {
    echo "Message sent!";
}

我更喜欢 Swiftmailer,但你选择你最好的选择 ;-)

【讨论】:

  • 虽然在这种情况下我不能使用其中任何一个,因为它不是我正在使用的代码的一部分......我很想知道其中任何一个是否需要使用邮件中继系统还是邮件服务器?它可以直接从 LAMP 服务器本身发送吗?我的印象是我需要一个邮件服务器来处理任何 SMTP,在我的情况下,我想转发我希望发送到邮件服务器的邮件。
  • swift 和 phpmailer 都具有支持 SMTP 和 mail() 的发送功能。你选择你需要的。是的,如果您希望通过 SMTP 发送,那么您将需要自己的邮件服务器,或连接到其他服务器(如您的 ISP 等)。
猜你喜欢
  • 2014-05-28
  • 2020-05-15
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
相关资源
最近更新 更多