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

时间:2012-10-01 18:23:43

标签: php linux email

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

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

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

我想我感到困惑的部分是PHP mail()函数是否自动为服务器创建SMTP消息?或者我是否必须设置php.ini设置以查看localhost,然后配置sendmail / postfix以将邮件发送到邮件服务器。另外,如果我只指定LAMP服务器尝试连接邮件服务器,为什么还要费心去验证域控制器呢?

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

  

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上,该功能仅使用您需要自己设置以连接到SMTP服务器的本地sendmail安装。这种配置的替代方案是使用PHPMailer,Swiftmailer,Zend_Mail或类似的,它们自己提供SMTP功能。


  

如果我,为什么要打扰域控制器进行身份验证呢   仅指定LAMP服务器尝试连接邮件   服务器

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