Настройка почты в Php

ZOND

Гость города
#1
Столкнулся с такой вот проблемой.

На сервере установлен php v4.4.4.
Нужно отправить письмо с помощью функции mail().
Но сервере php опции [mail function] настроены на localhost.

Как можно настройки php.ini переопределить в файле скрипта?
Делал для error_reporting. это можно сделать с помощью
Error_Reporting().

Возможно ли SMTP настроить в файле скрипта?
локально естественно все работает.
 

Aliens

Меня знают многие ;-)
#2
что значит SMTP настроить в файле скрипта?

почту ты можешь слать либо через стандартную функцию mail либо используя прямой доступ к SMTP.
Если использовать SMTP то там ты уже указываешь к какому серваку коннектиться и с какими параметрами.

Опиши подробнее задачу тогда можно будет точно сказать что тебе нужно...
 

ZOND

Гость города
#3
задача такая - нужно отправить почту с помощью php не используя никаких внешних утилит типа sendmail, потому как данные формв не используются в чистом виде.

локально почту отпраляет. в денвере с помощью заглушки все работает.

закачиваю на сервер и пытаюсь отправить письмо и оно просто не приходит.

запуская phpinfo пишет
SMTP localhost localhost
smtp_port 25 25

т.е нужно, я так понял настроить чтобы было типа в php.ini
SMTP=smtp.mail.ru например, но кто же мне даст его настраивать?
вот может в файле сценария указать эту настройку? или есть другой выход?
 

Aliens

Меня знают многие ;-)
#5
дык это же отправка почты через смтп тебе нужнo.
читай вот тут про это:
_http://ru2.php.net/manual/ru/function.fsockopen.php

Только смысл? спрятаться откуда рассылка шла? не спрячешься... Все равно будет написано откуда письмо шло... Так что эт зря... Такая отправка нужно только при том условии если сендмаил на серваке не пашет... А так у всех хостеров всегда работает функция mail.

а то как у тебя данные используются так то пофиг.. все равно ты их примешь чтоб в письмо засунуть...
 

ZOND

Гость города
#6
Делаю через сокет. вроде бы локально ошибок нету (оно и понятно), а закачивашь на сервер - валит ошибки
 

Aliens

Меня знают многие ;-)
#7
напиши какая ошибка...

И опять в чем причины отправки через смтп? и что за сервер?
 

ZOND

Гость города
#8
сервер на fatal.ru
http://www.group104.fatal.ru/feedback.htm

стандартная функция mail() не работает, потому что в php.ini
http://www.group104.fatal.ru/info.php
опция SMTP настроена на localhost.
вот я и подумал, можно ли в файле скрипта прописать настройки. как оказалось можно,
ini_set("SMTP","smtp.group104.fatal.ru");
но на форумах всех пишут, что обязательно нужно указывать заголовки.
так ли это обязательно?

как бы то ни было, mail( ) так и не заработал
вот и root посоветовал напрямую через сокет.

мне все равно как, лишь бы письмо отправить.
 

Aliens

Меня знают многие ;-)
#9
так а где ошибка то?
я зашел там нет никакой ошибки?

напиши что у тебя есть и на что ругается...
Функция маил должна работать.. проблема в другом...
я тут порылся в форуме на фатале и нашел там много всего интересного...

Вот цитата с форума тех поддержки:

Я пользуюсь Outlook для работы с почтовым ящиком на Fatal. Письма идут очень долго (от 6 часов до суток), а некоторые вообще не доходят (на приём). В чём может состоять проблема?


Ответа так и не дождался чел.

Что тут сказать халявный хостинг есть халявный хостинг...
 

ZOND

Гость города
#10
jtr, про почту сто пудово, мне только что пришло аж 4 сразу когда через mail() пробовал.
тогда такой вопрос. через сокет наверняка будет быстреею так ли это?
а насчет mail() я же говорю, у меня локально все работает, стал бы я нерабочий скрипт тестить на сервере :))

сейчас залью на сервак SMTP скрипт

а вот c SMTP ошибки отлавливает сам скрипт.
http://www.group104.fatal.ru/feedback.htm
пишет
echo("Couldn't get mail server response codes");

<?
$board_config['smtp_host']="smtp.mail.ru";
$board_config['smtp_username']="login";
$board_config['smtp_password']="pas";
$board_config['board_email']="zond85@mail.ru";

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, $line = __LINE__)
{
while (substr($server_response, 3, 1) != ' ')
{
if (!($server_response = fgets($socket, 256)))
{
echo("Couldn't get mail server response codes");
}
}

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


// Replacement or substitute for PHP's mail command
function smtpmail($mail_to, $subject, $message, $headers = '')
{
global $board_config;

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

if ($headers != '')
{
if (is_array($headers))
{
if (sizeof($headers) > 1)
{
$headers = join("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', "rn", $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("rn", $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 != '') ? $header . "rn" : '';
}

$headers = chop($headers);
$cc = explode(',', $cc);
$bcc = explode(',', $bcc);
}

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) )
{
print ("Could not connect to smtp host : $errno : $errstr");

}

// Wait for reply
server_parse($socket, "220", __LINE__);

// Do we want to use AUTH?, send RFC2554 EHLO, else send RFC821 HELO
// This improved as provided by SirSir to accomodate
if( !empty($board_config['smtp_username']) && !empty($board_config['smtp_password']) )
{
fputs($socket, "EHLO " . $board_config['smtp_host'] . "rn");
server_parse($socket, "250", __LINE__);

fputs($socket, "AUTH LOGINrn");
server_parse($socket, "334", __LINE__);

fputs($socket, base64_encode($board_config['smtp_username']) . "rn");
server_parse($socket, "334", __LINE__);

fputs($socket, base64_encode($board_config['smtp_password']) . "rn");
server_parse($socket, "235", __LINE__);
}
else
{
fputs($socket, "HELO " . $board_config['smtp_host'] . "rn");
server_parse($socket, "250", __LINE__);
}

// 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'] . ">rn");
server_parse($socket, "250", __LINE__);

// Specify each user to send to and build to header.
@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_addressrn");
server_parse($socket, "250", __LINE__);
}
$to_header .= (($to_header !='') ? ', ' : '') . "$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_addressrn");
server_parse($socket, "250", __LINE__);
}
}

@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_addressrn");
server_parse($socket, "250", __LINE__);
}
}

// Ok now we tell the server we are ready to start sending data
fputs($socket, "DATArn");

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

// Send the Subject Line...
fputs($socket, "Subject: $subjectrn");

// Now the To Header.
fputs($socket, "To: $to_headerrn");

// Now any custom headers....
fputs($socket, "$headersrnrn");

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

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

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

return TRUE;
}

?>
 

Aliens

Меня знают многие ;-)
#11
как то он не правильно у тебя читает ответы от сервера.
По сути можно вообще от них отказаться и просто пропихивать почту.. Тоже поможет.. Можешь попробовать...

вот попробуй если не хочешь разбираться...
http://phpmailer.sourceforge.net/
хороший класс... работает на ура...

Но опять же...
У тебя там форма без защиты от спама... Могут просто забанить потом почту если рассылки пойдут...
 

skif

Житель центра
#13
ZOND, отключать обработку ответов смтп не рекомендую - большинство почтовиков тебя просто пошлют с таким подходом.

на локалхосте скрипт работает? вроде бы разбор ответов описан правильно, добавь обработку исключений и смотри в чем дело.

или же можно использовать PEAR Mail package.
тогда почту слать нужно как:
Код:
&#60;?php
require_once "Mail.php";

$from = "Sandra Sender &#60;sender@example.com&#62;";
$to = "Ramona Recipient &#60;recipient@example.com&#62;";
$subject = "Hi!";
$body = "Hi,nnHow are you?";

$host = "mail.example.com";
$username = "smtp_username";
$password = "smtp_password";

$headers = array &#40;'From' =&#62; $from,
'To' =&#62; $to,
'Subject' =&#62; $subject&#41;;
$smtp = Mail&#58;&#58;factory&#40;'smtp',
array &#40;'host' =&#62; $host,
'auth' =&#62; true,
'username' =&#62; $username,
'password' =&#62; $password&#41;&#41;;

$mail = $smtp-&#62;send&#40;$to, $headers, $body&#41;;

if &#40;PEAR&#58;&#58;isError&#40;$mail&#41;&#41; {
echo&#40;"&#60;p&#62;" . $mail-&#62;getMessage&#40;&#41; . "&#60;/p&#62;"&#41;;
} else {
echo&#40;"&#60;p&#62;Message successfully sent!&#60;/p&#62;"&#41;;
}
?&#62;
 

ZOND

Гость города
#14
спасибо всем за помощь.
почта заработала, старая добрая ф-ция mail пашет ! только, как верно сказано, с запаздыванием!
почта все таки приходит, как черех сокет, так и через mail.

>>>а еще лучше взять хостинг и не извращаться..

оно и понятно, тока для частного проекта врятли это вариант. смысла нет отваливать деньги за одну страничку с формой :).