Войти

Показать полную графическую версию : Обработка формы


][alter
06-12-2007, 03:01
Доброе время суток.

У меня возникла небольшая проблемка при обработке письма и отправке нужному адресату. Дело в том что, для корректной обработке письма требуется указать поле «recipient» (получатель) их числа администраторы, пользователи и т.д. После удаления данного поля из шаблона формы(а оно не как не вписывается в общий дизайн сайта), возникает ошибка «E-Mail: <> not valid». Как я понимаю, не указан адрес получателя. Вот кусок кода отвечающий за данную операцию:




if (isset($_POST['send'])) {
$stop = "";

if ($is_logged)
{
$name = $member_id['name'];
$email = $member_id['email'];
} else {

$name = $db->safesql(strip_tags($_POST['name']));
$email = $db->safesql(strip_tags($_POST['email']));
$db->query("SELECT name from " . USERPREFIX . "_users where LOWER(name) = '".strtolower($name)."' OR LOWER(email) = '".strtolower($email)."'");

if ($db->num_rows() > 0) {
$stop = $lang['news_err_7'];
}

$name = strip_tags(stripslashes($_POST['name']));
$email = strip_tags(stripslashes($_POST['email']));


}

$subject = strip_tags(stripslashes($_POST['subject']));
$message = strip_tags(stripslashes($_POST['message']));
$recip = intval($_POST['recip']);


function check_email($value) {
return eregi("^([0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-wyz][a-z](fo|g|l|m|mes|o|op|pa|ro|seum|t|u|v|z)?)$", $value);
}

if (empty($name)) {
$stop .= $lang['feed_err_1'];
}

if (empty($email)) {
$stop .= $lang['feed_err_2'];
}
elseif (!check_email($email)) {
$stop .= $lang['feed_err_3'];
}

if (empty($subject)) {
$stop .= $lang['feed_err_4'];
}

if (empty($message)) {
$stop .= $lang['feed_err_5'];
}

if ( $_POST['sec_code'] != $_SESSION['sec_code_session'] OR !$_SESSION['sec_code_session']) {
$stop .= $lang['reg_err_19'];
}
$_SESSION['sec_code_session'] = false;

if ($stop) {

msgbox ($lang['all_err_1'], "$stop<br><br><a href=\"javascript:history.go(-1)\">$lang[all_prev]</a>");

} else {

include_once ENGINE_DIR.'/inc/mail.class.php';
$mail = new dle_mail ($config);

$recipient = $db->super_query("SELECT name, email, fullname FROM " . USERPREFIX . "_users WHERE user_id='".$recip."'");

if (empty($recipient['fullname'])) $recipient['fullname'] = $recipient['name'];

$row = $db->super_query("SELECT template FROM " . PREFIX . "_email where name='feed_mail' LIMIT 0,1");

$row['template'] = stripslashes($row['template']);
$row['template'] = str_replace("{%username_to%}",$recipient['fullname'], $row['template']);
$row['template'] = str_replace("{%username_from%}",$name, $row['template']);
$row['template'] = str_replace("{%text%}",$message, $row['template']);
$row['template'] = str_replace("{%ip%}",$_SERVER['REMOTE_ADDR'], $row['template']);

$mail->from = $email;

$mail->send ($recipient['email'], $subject, $row['template']);

if ($mail->send_error) msgbox ($lang['all_info'], $mail->smtp_msg);
else msgbox($lang['feed_ok_1'], "$lang[feed_ok_2] ".$recipient['name']." $lang[feed_ok_3] <a href=\"{$config['http_home_url']}\">$lang[feed_ok_4]</a>");

}

} else {


$user = intval($_GET['user']);

if (!$user)
$db->query("SELECT name, user_group, user_id FROM " . USERPREFIX . "_users where user_group < '4' AND allow_mail = '1' ORDER BY user_group");
else
$db->query("SELECT name, user_group, user_id FROM " . USERPREFIX . "_users where user_id = '$user' AND allow_mail = '1' ORDER BY user_group");

if ($db->num_rows())
{
$empf = "<select name=\"recip\">";
$i = 1;
while ($row = $db->get_array()) {
$str = $row['name']." (".stripslashes($user_group[$row['user_group']]['group_name']).")";

if ($i == 1) {
$empf .= "<option selected=\"selected\" value=\"".$row["user_id"]."\">".$str."</option>\n";
} else {
$empf .= "<option value=\"".$row["user_id"]."\">".$str."</option>\n";
}
$i++;
}
$empf .="</select>";





Как мне задать отправку письма, лишь на один почтовый адрес или просто скрыть это поле? Сам я лих начинающий программист, вот и решил попросить помощи у более квалифицированных лиц.

Prisoner
06-12-2007, 12:44
Подровняйте код, плиз. Разбираться в такой кашке мало кому будет интересно. Думаю, кстати, что после этого Вы и сами решите проблему.

][alter
06-12-2007, 23:38
Подровняйте код, плиз. Разбираться в такой кашке мало кому будет интересно. Думаю, кстати, что после этого Вы и сами решите проблему. »
Подправил код. Но все же проблему не решил самостоятельно :(

Arrest
07-12-2007, 22:53
Разгадка в функции
function check_email($value) {
return eregi("^([0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-wyz][a-z](fo|g|l|m|mes|o|op|pa|ro|seum|t|u|v|z)?)$", $value);
}
Поменяйте, например, на
function check_email($value) {
return eregi("^[a-z0-9_\+-]+(\.[a-z0-9_\+-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*\.([a-z]{2,4})$", $value);
}

][alter
10-12-2007, 17:39
Результат после замены : E-Mail: <> not valid


А нельзя ли, просто прописать в коде, email администратора?

Arrest
10-12-2007, 22:32
а! точно! извините, я не полностью прочитал сообщение :)
да, можно:
function check_email($value) {
return $value == 'admin@email';
}

][alter
12-12-2007, 00:52
Извините. Я наверное не правильно описал суть проблемы. Дело в том, как я понял, эта функция проверяет на корректность данные,переданные в переменные с формы?
Но в действительности, адрес получателя (как я понял), запрашивается с базы, зарегистрированных пользователей, администраторов, модераторов и т.д.

Можно ли попробовать, подсунуть Email на стадии отправки письма?

Arrest
12-12-2007, 06:25
тогда можно удалить
if (empty($email)) {
$stop .= $lang['feed_err_2'];
}
elseif (!check_email($email)) {
$stop .= $lang['feed_err_3'];
}

][alter
13-12-2007, 02:00
Это ошибки выводящиеся, если не указан Email отправителя, да?
f (empty($email)) {
$stop .= $lang['feed_err_2'];
}
elseif (!check_email($email)) {
$stop .= $lang['feed_err_3']; }

Но после удаления этих условий, проблема не исчезает :(

Вот нашел, в классах функцию отправки письма и то условие:
function send($to, $subject, $message) {
$this->to = preg_replace( "/[ \t]+/" , "" , $to );$this->from = preg_replace( "/[ \t]+/" , "" , $this->from );

$this->to = preg_replace( "/,,/" , "," , $this->to );

$this->from = preg_replace( "/,,/" , "," , $this->from );

$this->to = '<'.preg_replace( "#\#\[\]'\"\(\):;/\$!Ј%\^&\*\{\}#" , "", $this->to ).'>';

$this->from = preg_replace( "#\#\[\]'\"\(\):;/\$!Ј%\^&\*\{\}#" , "", $this->from);

$this->subject = $subject;
$this->message = $message;
$this->message = str_replace( "\r" , "", $this->message);


$this->compile_headers();

if ( !preg_match( "/^<.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,4})(\]?)>$/", $this->to ) )
{
$this->smtp_msg = "E-Mail: {$this->to} not valid";
$this->send_error = true;
$this->to = false;
}

if ( ($this->to) and ($this->from) and ($this->subject) )
{
if ($this->mail_method != 'smtp')
{
if (!@mail( $this->to, $this->subject, $this->message, $this->mail_headers ))
{
$this->smtp_msg = "PHP Mail Error";
$this->send_error = true;
}

} else {
$this->smtp_send();
}

}

$this->mail_headers = "";

}


Пожалуйста помогите, где здесь задать адрес единственного получателя?

Sham
13-12-2007, 02:32
!@mail( $this->to, $this->subject, $this->message, $this->mail_headers )
ну вот же функция, перед носом... вместо $this->to адрес "mail@mail.ma"
а в первом коде (первый пост) видимо вот это
$mail->send ($recipient['email'], $subject, $row['template']);
вместо $recipient['email']

][alter
18-12-2007, 00:18
Все всем огромное спасибо, все заработало, заменил:


$this->subject = $subject;

на $this->subject = "User";

убрал, это условие

if ( !preg_match( "/^<.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,4}|[0-9]{1,4})(\]?)>$/", $this->to ) )

{ $this->smtp_msg = "E-Mail: {$this->to} not valid";
$this->send_error = true;
$this->to = false;
}

И в место вместо $this->to адрес "mail@mail.ma"




© OSzone.net 2001-2012