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!';
我想知道是否可以使用服务器 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!';