550 5.7.1 中继被拒绝

550 5.7.1 relaying denied

我想知道是否可以使用服务器 B 的 ip 地址从服务器 A 发送电子邮件 我尝试使用波纹管代码从我的应用程序发送电子邮件,但它 returns“550 5.7.1 中继被拒绝”。

function    sendmail($p_subject,$p_message)
{
    $ip         = 'ipServerB';
    $domain     = 'domain';
    $returnPath = 'contact@domain';     
    $to         = 'to';
    $subject    = 'New Ticket : '.$subject;
    $message    = $message;
    $header     = "from:support@domain\nto:$to\nsubject:$subject\n$message\n.\n";

    $fp = fsockopen($ip, 25);


    $telnet    = array();
    $telnet[0] = "telnet $ip\r\n";
    $telnet[1] = "HELO $domain\r\n";
    $telnet[2] = "MAIL FROM:$returnPath\r\n";
    $telnet[3] = "RCPT TO:$to\r\n";
    $telnet[4] = "DATA\r\n";
    $telnet[5] = $header;


    foreach ($telnet as $current) 
    {         
                fwrite($fp, $current);
                $smtpOutput=fgets($fp);
                echo $smtpOutput.'               ';
    }
}

不要使用自己的邮件程序。使用 class,例如 PHPMailer。手动发送电子邮件通常会导致 "unclean" 邮件数据被视为垃圾邮件的风险非常高,and/or 处理错误和重试时出现问题。

例如,在这种情况下,您正在发送无意义的数据,例如 telnet 命令(应该让您 502 5.5.2 Error: command not recognized),SMTP 对话完全是盲目的,并且会话被截断比正确关闭。如果您以这种方式成功发送电子邮件,那主要是纯粹的运气,您不应该指望能够可靠地重复这一壮举。

也就是说,"relaying denied" 表示您发送邮件的地址既不是 来自 ,也不是您发送邮件的地址 to,在您使用的服务器的控制之下。因此,服务器需要"relay"将电子邮件发送给其他人;由于您不是授权用户,它拒绝这样做。

尝试使用 SMTP AUTH 命令向服务器发送一组有效的凭据。

为了比较,这是使用 PHPMailer 的方式:

$mail = new PHPMailer();

$mail->IsSMTP();
$mail->Host = $AddressB;
$mail->Port = 25;
$mail->SMTPAuth = true;
$mail->Username = $UserNameOnServerB;
$mail->Password = $PasswordOnServerB;

$mail->From     = 'yourfrom@example.com';
$mail->FromName = 'Ticket System';
$mail->AddAddress('joe@example.com', 'Joe Bloggs');
$mail->AddAddress('bob@example.com', 'Bob Smith');

$mail->IsHTML(true);                         

$mail->Subject = 'Ticket no. ....';
$mail->Body    = '<h1>It works!</h1><hr /><p>This is the email</p>';
$mail->AltBody = strip_tags($mail->Body);

if (!$mail->Send()) {
   die('Boo hoo: ' . $mail->ErrorInfo);
}
echo 'OK!';