mail() в который раз...

Alex2003

Новичок
mail() в который раз...

SMTP server response: 550 Relaying is prohibited in....
Причем только при попытке отправить почту на внешний адрес. Внутренние адреса Exchange server обрабатывает без проблем. Не понял - почему?
 

Alex2003

Новичок
Сеньксь. Эт я уже догнал.
Вот как ему, родимому показать, что я авторизованый юзверь, если в пхп.ини есть только 2 строки (SMTP и sendmail_from), не считая номера порта??? В заголовках письма?
 

Alex2003

Новичок
Хм... где бы мне об этом почитать? Или напость строчку для примера, плиз.
 

Joker

Guest
Автор оригинала: Alex2003
Хм... где бы мне об этом почитать? Или напость строчку для примера, плиз.
function send($server, $to, $from, $subject="", $headers="") {

$headers="To: $to\nFrom: $from\nSubject: $subject\nX-Mailer: The Mouse!\n$headers";
$fp = fsockopen($server, 25, &$errno, &$errstr, 30);
if (!$fp)
die("Server $server. Connection failed: $errno, $errstr");
fputs($fp,"HELO $server\n");
fputs($fp,"MAIL FROM: $from\n");
fputs($fp,"RCPT TO: $to\n");
fputs($fp,"DATA\n");
fputs($fp,$this->headers);
if (strlen($headers))
fputs($fp,"$headers\n");
fputs($fp,$this->mime);
fputs($fp,"\n.\nQUIT\n");
while(!feof($fp))
$resp.=fgets($fp,1024);
fclose($fp);
}
 

RomikChef

Guest
оставить добавить авторизацию :)
чтобы ее добавить, надо всего лишь зайти телнетом на почтовый сервер и пообщаться с ним руками, а потом перенести это общение в вышеприведенный пример
 

Alex2003

Новичок
Ага, только чтобы пообщаться руками, надо знать хотя бы на каком языке разговаривать :) Сам-то я ни разу не общался. Ковыряюсь в длиннющем файле "RFC2821"... Надеюсь, ковыряюсь там, где нада.
 

Joker

Guest
Автор оригинала: Alex2003
Ага, только чтобы пообщаться руками, надо знать хотя бы на каком языке разговаривать :) Сам-то я ни разу не общался. Ковыряюсь в длиннющем файле "RFC2821"... Надеюсь, ковыряюсь там, где нада.
telnet www.mail.ru
HELO,если не катит то вводи
EHLO
mail from:<[email protected]>
rcpt to:<мне@site.ru>
data
тело письма
.
quit

то твои команды,ответы сервера опустил
 

Mammoth

Guest
Alex2003, а из "не ПХП" письма наружу выходят? Если да, то может проблема в том, что Exchange проверяет - авторизован ли юзер в домене?
 

Alex2003

Новичок
Mammoth

обычный оутглюк у меня работает без проблем. Я так понимаю, что пхп почему-то неавторизованый юзерь, хотя:

1 - я сижу под рутом;
2 - скрипт выполняю как "...php.exe -f skript.php";
3 - в параметре sendmail_from стоит моё внутренне мыло;
4 - прямо тут же могу принимать и отправлять почту куда и откуда угодно оутглюком;
5 - мыло "внутреннее" работает на ура;
6 - Exchange отрубает анонимных юзеров;
7 - Парюсь уже 4-ый час.

:)
 

BigDaddy

Guest
Есть такая фича у мейл серверов - pop аутентификация перед смтп сессией. Посмотри в настройках аутлука - мейл пропертис, установлена ли галочка "Outgoing mail server - Server requires authentication"
 

BigDaddy

Guest
Грандиозная идея - как насчет посмотреть лог сендмейла? ;)
 

Alex2003

Новичок
BigDaddy - да я бы с удовольствием посмотрел логи, но где их взять в NT? А то, что сервер требует авторизацию - я определился после 2-го поста. Но вот КАК её сделать - это вопрос.
 

Voxus

founder (Старожил PHPCluba)
самый крайний случай - глянь сниффером, как именно аутглюк общается с exchange сервером.

ну и - копи/пасте. ;)
 

Joker

Guest
Автор оригинала: Alex2003
BigDaddy - да я бы с удовольствием посмотрел логи, но где их взять в NT? А то, что сервер требует авторизацию - я определился после 2-го поста. Но вот КАК её сделать - это вопрос.
Разбери на запчасти и выстриги себе нужное, это из ВВ-форума
<?php

define('SMTP_INCLUDED', 1);
//
// This function has been modified as provided
// by SirSir to allow multiline responses when
// using SMTP Extensions
//
function server_parse($socket, $response)
{
while ( substr($server_response,3,1) != ' ' )
{
if( !( $server_response = fgets($socket, 256) ) )
{
message_die(GENERAL_ERROR, "Couldn't get mail server response codes", "", __LINE__, __FILE__);
}
}

if( !( substr($server_response, 0, 3) == $response ) )
{
message_die(GENERAL_ERROR, "Ran into problems sending Mail. Response: $server_response", "", __LINE__, __FILE__);
}
}

/****************************************************************************
* Function: smtpmail
* Description: This is a functional replacement for php's builtin mail
* function, that uses smtp.
* Usage: The usage for this function is identical to that of php's
* built in mail function.
****************************************************************************/
function smtpmail($mail_to, $subject, $message, $headers = "")
{
// For now I'm using an array based $smtp_vars to hold the smtp server
// info, but it should probably change to $board_config...
// then the relevant info would be $board_config['smtp_host'] and
// $board_config['smtp_port'].
global $board_config;

//
// Fix any bare linefeeds in the message to make it RFC821 Compliant.
//
$message = preg_replace("/(?<!\r)\n/si", "\r\n", $message);

if ($headers != "")
{
if(is_array($headers))
{
if(sizeof($headers) > 1)
{
$headers = join("\r\n", $headers);
}
else
{
$headers = $headers[0];
}
}
$headers = chop($headers);

//
// Make sure there are no bare linefeeds in the headers
//
$headers = preg_replace("/(?<!\r)\n/si", "\r\n", $headers);
//
// Ok this is rather confusing all things considered,
// but we have to grab bcc and cc headers and treat them differently
// Something we really didn't take into consideration originally
//
$header_array = explode("\r\n", $headers);
@reset($header_array);
$headers = "";
while( list(, $header) = each($header_array) )
{
if( preg_match("/^cc:/si", $header) )
{
$cc = preg_replace("/^cc:(.*)/si", "\\1", $header);
}
else if( preg_match("/^bcc:/si", $header ))
{
$bcc = preg_replace("/^bcc:(.*)/si", "\\1", $header);
$header = "";
}
$headers .= $header . "\r\n";
}
$headers = chop($headers);
$cc = explode(",", $cc);
$bcc = explode(",", $bcc);
}
if(trim($mail_to) == "")
{
message_die(GENERAL_ERROR, "No email address specified", "", __LINE__, __FILE__);
}
if(trim($subject) == "")
{
message_die(GENERAL_ERROR, "No email Subject specified", "", __LINE__, __FILE__);
}
if(trim($message) == "")
{
message_die(GENERAL_ERROR, "Email message was blank", "", __LINE__, __FILE__);
}
$mail_to_array = explode(",", $mail_to);

//
// Ok we have error checked as much as we can to this point let's get on
// it already.
//
if( !$socket = fsockopen($board_config['smtp_host'], 25, $errno, $errstr, 20) )
{
message_die(GENERAL_ERROR, "Could not connect to smtp host : $errno : $errstr", "", __LINE__, __FILE__);
}
server_parse($socket, "220");

if( !empty($board_config['smtp_username']) && !empty($board_config['smtp_password']) )
{
// Send the RFC2554 specified EHLO.
// This improved as provided by SirSir to accomodate
// both SMTP AND ESMTP capable servers
fputs($socket, "EHLO " . $board_config['smtp_host'] . "\r\n");
server_parse($socket, "250");

fputs($socket, "AUTH LOGIN\r\n");
server_parse($socket, "334");
fputs($socket, base64_encode($board_config['smtp_username']) . "\r\n");
server_parse($socket, "334");
fputs($socket, base64_encode($board_config['smtp_password']) . "\r\n");
server_parse($socket, "235");
}
else
{
// Send the RFC821 specified HELO.
fputs($socket, "HELO " . $board_config['smtp_host'] . "\r\n");
server_parse($socket, "250");
}

// From this point onward most server response codes should be 250
// Specify who the mail is from....
fputs($socket, "MAIL FROM: <" . $board_config['board_email'] . ">\r\n");
server_parse($socket, "250");

// Specify each user to send to and build to header.
$to_header = "To: ";
@reset( $mail_to_array );
while( list( , $mail_to_address ) = each( $mail_to_array ))
{
//
// Add an additional bit of error checking to the To field.
//
$mail_to_address = trim($mail_to_address);
if ( preg_match('/[^ ]+\@[^ ]+/', $mail_to_address) )
{
fputs( $socket, "RCPT TO: <$mail_to_address>\r\n" );
server_parse( $socket, "250" );
}
$to_header .= ( ( $mail_to_address != '' ) ? ', ' : '' ) . "<$mail_to_address>";
}
// Ok now do the CC and BCC fields...
@reset( $bcc );
while( list( , $bcc_address ) = each( $bcc ))
{
//
// Add an additional bit of error checking to bcc header...
//
$bcc_address = trim( $bcc_address );
if ( preg_match('/[^ ]+\@[^ ]+/', $bcc_address) )
{
fputs( $socket, "RCPT TO: <$bcc_address>\r\n" );
server_parse( $socket, "250" );
}
}
@reset( $cc );
while( list( , $cc_address ) = each( $cc ))
{
//
// Add an additional bit of error checking to cc header
//
$cc_address = trim( $cc_address );
if ( preg_match('/[^ ]+\@[^ ]+/', $cc_address) )
{
fputs($socket, "RCPT TO: <$cc_address>\r\n");
server_parse($socket, "250");
}
}
// Ok now we tell the server we are ready to start sending data
fputs($socket, "DATA\r\n");

// This is the last response code we look for until the end of the message.
server_parse($socket, "354");

// Send the Subject Line...
fputs($socket, "Subject: $subject\r\n");

// Now the To Header.
fputs($socket, "$to_header\r\n");

// Now any custom headers....
fputs($socket, "$headers\r\n\r\n");

// Ok now we are ready for the message...
fputs($socket, "$message\r\n");

// Ok the all the ingredients are mixed in let's cook this puppy...
fputs($socket, ".\r\n");
server_parse($socket, "250");

// Now tell the server we are done and close the socket...
fputs($socket, "QUIT\r\n");
fclose($socket);

return TRUE;
}

?>
 

-=Dok=-

Guest
ИМХО, просто smtp сервер не хочет на указанный адрес почту отправлять
 

Alex2003

Новичок
ЛОЛ!!! Я танцую на шкуре Шерхана!!!!

ЗАРАБОТАЛО!!!

Теперь не хочет заголовки понимать. Вставляет их в тело письма... :-( Ковыряюсь вот...
 

Alex2003

Новичок
Гы. Делаю так:
PHP:
  $headers="Subject: $subject\r\nFrom: $from\r\nContent-Type: text/plain;charset=\"windows-1251\"\r\n$headers\r\n";
  fputs($fp,"HELO $server\r\n");
  .
  .
  .
  fputs($fp,"MAIL FROM: $from\r\n");
  fputs($fp,"RCPT TO: $to\r\n");
  fputs($fp,"DATA\r\n");
  if (strlen($headers))
    fputs($fp,"$headers\r\n");
  fputs($fp,$body);
  fputs($fp,"\r\n.\r\n");
  fputs($fp,"QUIT\r\n");
Первый заголовок (subject) понимает как надо, остальные просто пишет в письме. Причем пофиг, который из них первый. Если поставить subj вторым - то он просто будет в теле. В какую сторону копать-то???
 
Сверху