PHP邮件()中继到邮件服务器

4
我注意到有几篇帖子与我的问题类似,但发现它们并不适用于我的情况,或者我只是没有很好地理解事情。
我的情况是:我正在尝试使用PHP mail()函数从LAMP服务器发送邮件。我想将邮件中继到另一个专用邮件服务器。
问题是:似乎我无法发送邮件...有时候可以发送邮件到域外的帐户,但无法发送任何邮件到域/网络内的帐户。我经常看到日志抱怨无法验证域控制器...但它不应该担心这个吧?
我猜我困惑的部分是,PHP mail()函数是否会自动创建SMTP消息发送到服务器?还是我必须设置php.ini设置来查看本地主机,然后配置sendmail/postfix将消息发送到邮件服务器。此外,如果我只指定LAMP服务器尝试连接邮件服务器,为什么要验证域控制器呢?
希望有人能帮我解决这个问题。这一直困扰着我,但一直没有找到解决办法。 谢谢,

你有没有考虑使用PHPMailer来通过SMTP或其他方式发送电子邮件?Mail()函数有些过时了。你也可以在php.ini中设置一些邮件参数。 - Green Black
不幸的是,我认为我只能使用mail()。我正在尝试使用另一家公司开发的应用程序,并且他们的源代码被加密(也许这是错误的词),直到我们购买该软件-但他们确实透露他们使用mail()函数发送邮件。我们想在购买之前解决问题。我必须查看phpmailer,以防它成为一个选项。 - Stephen R
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,但你可以选择最适合你的工具 ;-)


尽管在这种情况下我不能使用其中任何一个,因为它们不是我正在处理的代码的一部分...但我很想知道是否需要使用邮件中继系统或邮件服务器? 它能直接从 LAMP 服务器发送吗? 我的印象是,我需要一个邮件服务器来处理任何 SMTP,在我的情况下,我希望将要发送的邮件转发到邮件服务器。 - Stephen R
无论是Swift还是PHPMailer,都支持SMTP和mail()发送。你可以根据需要进行选择。另外,如果你想通过SMTP发送邮件,则需要自己拥有邮件服务器或连接到其他服务器(比如你的ISP等)。 - Glavić

2
PHP的mail()函数本身并不会自动创建SMTP消息发送到服务器,需要通过设置php.ini来让它连接到本地的sendmail或类似程序,并配置sendmail/postfix将消息发送到邮件服务器。以下是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上,该函数只能使用本地的sendmail程序,并且需要自己设置才能连接到SMTP服务器。如果需要这种类型的配置,可以使用PHPMailer、Swiftmailer、Zend_Mail或类似的工具,它们可以提供自身的SMTP功能。

如果我只指定LAMP服务器尝试连接邮件服务器,为什么还需要与域控制器进行身份验证呢?

我并不是专家,但据我所知,您需要成为网络中经过身份验证的用户,才能访问外部资源,包括发送邮件等操作。域控制器可以授予此类权限。

我有点想到这种情况可能需要一些身份验证,因为我一直在收到那些错误。让我困惑的是,我用Perl做了一些简单的邮件处理,它并不需要我对服务器进行身份验证...除非Perl只是使用巫术魔法,并从本地LAMP服务器发送它。我有点认为mail()需要sendmail或其他东西,但我想我对设置php.ini文件的语义感到困惑...是设置远程服务器还是本地服务器?谢谢你的帮助。 - Stephen R
@StephenR 在 Windows 上,PHP 的 mail() 函数可以与 SMTP 服务器通信,无论是本地还是远程的。但在 Linux 上,PHP 的 mail() 函数不能这样做;它只能使用本地的 sendmail 安装,并且你需要自己设置才能连接到 SMTP 服务器。或者你可以使用 PHPMailer、Swiftmailer、Zend_Mail 或类似的工具来提供此功能。 - eis
这实际上帮助我理清了思路。我想这意味着我必须去弄清楚如何配置一些邮件中继应用程序才能使其工作。再次感谢! - Stephen R
没问题。这个同样的主题有一个更长的线程,链接在这里:https://dev59.com/oGfWa4cB1Zd3GeqPfDxE - eis
我已将此添加到答案中,这样它就可以被标记为已接受(如果您认为它是答案)。 - eis

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