3

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

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

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

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

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

4

2 回答 2

2

开始使用Swiftmailer文档)或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,但你选择你最好的选择 ;-)

于 2012-10-01T18:32:47.290 回答
2

PHP mail() 函数会自动向服务器创建 SMTP 消息吗?还是我必须设置 php.ini 设置来查看本地主机,然后配置 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 服务器尝试与邮件服务器连接,为什么还要麻烦与域控制器进行身份验证?

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

于 2012-10-01T18:52:38.943 回答