Tytuł: Formularz kontaktowy nie wysyła wiadomości Wiadomość wysłana przez: Sandra 10.07.2010 21:23:16 Witam,
Zainstalowałam Advanced contact form (http://custom.simplemachines.org/mods/index.php?mod=1352) i mam perien problem: zgłasza błąd mimo poprawnie wpisanego adresu e-mail, nie umiem znaleźć błędu w skrypcie :( Code: [select] <?php /********************************************************************************** * Contact.php * *********************************************************************************** * * * Execution file for "Contact Form" modification. * * * * Copyright (c) 2008 by Deprecated (at) Earthlink (dot) net. All rights reserved. * * Redistribution prohibited except at SimpleMachines.org * * * **********************************************************************************/ if (!defined('SMF')) die('Hacking attempt...'); function Contact() { global $context, $settings, $options, $scripturl, $boarddir, $sourcedir, $modSettings, $user_info, $txt, $webmaster_email; if($user_info['is_guest'] && empty($modSettings['contact_form_enable_guest_access'])) redirectexit(); if(!$user_info['is_guest'] && empty($modSettings['contact_form_enable_member_access'])) redirectexit(); $global_error = false; if (!empty($modSettings['reg_verification']) && $context['user']['is_guest']) { require_once($sourcedir . '/Subs-Editor.php'); $verificationOptions = array( 'id' => 'register', ); if (isset($_POST['submit'])) { $context['visual_verification'] = create_control_verification($verificationOptions, true); if (is_array($context['visual_verification'])) { loadLanguage('Errors'); foreach ($context['visual_verification'] as $error) { $global_error = $context['contact_form_error_visual_verification'] = true; $context['visual_verification_error_dscr'] = $txt['error_' . $error]; } } } $context['visual_verification'] = create_control_verification($verificationOptions); $context['visual_verification_id'] = $verificationOptions['id']; } else $context['visual_verification'] = false; $content = ''; $sender_ip = $_SERVER['REMOTE_ADDR']; $sender_rdns = gethostbyaddr($sender_ip); if ($context['user']['is_guest']) $sender = $txt['contact_form_sender_is_guest']; else { $sender = $context['user']['name']; if ($context['user']['name'] != $context['user']['username']) $sender .= ' (' . $context['user']['username'] . ')'; } $message = isset($_POST['message']) ? trim($_POST['message']) : ''; if (!$message) $global_error = $context['contact_form_error_no_message'] = true; $sender_name = isset($_POST['name']) ? trim($_POST['name']) : ''; if (!$sender_name && !empty($modSettings['contact_form_require_name'])) $global_error = $context['contact_form_error_no_name'] = true; if (!$sender_name || !empty($modSettings['contact_form_sender_name_dont_use_form'])) { $name = empty($modSettings['contact_form_default_name']) ? $txt['contact_form_default_name_default'] : $modSettings['contact_form_default_name']; if ($sender_name) $content .= $txt['contact_form_label_status_name'] . $sender_name . ' '; } else $name = $sender_name; $sender_email = isset($_POST['email']) ? trim($_POST['email']) : ''; if (!$sender_email && !empty($modSettings['contact_form_require_email'])) $global_error = $context['contact_form_error_no_email'] = true; if ($sender_email && !valid_email($sender_email)) $global_error = $context['contact_form_error_invalid_email'] = true; if (!$sender_email || !empty($modSettings['contact_form_sender_email_dont_use_form'])) { $email = empty($modSettings['contact_form_default_email_sender']) ? $webmaster_email : $modSettings['contact_form_default_email_sender']; if ($sender_email) $content .= $txt['contact_form_label_status_email'] . $sender_email . ' '; } else $email = $sender_email; $headers = 'From: ' . $name . ' <' . $email . '>'; $sender_subject = isset($_POST['subject']) ? trim($_POST['subject']) : ''; if (!$sender_subject && !empty($modSettings['contact_form_require_subject'])) $global_error = $context['contact_form_error_no_subject'] = true; if (!$sender_subject || !empty($modSettings['contact_form_sender_subject_dont_use_form'])) { $subject = empty($modSettings['contact_form_default_subject']) ? $txt['contact_form_default_subject_default'] : $modSettings['contact_form_default_subject']; if ($sender_subject) $content .= $txt['contact_form_label_status_subject'] . $sender_subject . ' '; } else $subject = $sender_subject; if (!empty($modSettings['contact_form_subject_prefix'])) $subject = $modSettings['contact_form_subject_prefix'] . ' ' . $subject; if ($content) $content .= $txt['contact_form_label_status_separator']; $content .= stripslashes($message); $content .= $txt['contact_form_label_ip'] . $sender_ip . $txt['contact_form_label_rdns'] . $sender_rdns . $txt['contact_form_label_sender'] . $sender; $dest_email_addr = empty($modSettings['contact_form_dest_email_addr']) ? $webmaster_email : $modSettings['contact_form_dest_email_addr']; $context['page_title'] = empty($modSettings['contact_form_display_title']) ? $txt['contact_form_title'] : $modSettings['contact_form_display_title']; if (!$global_error && isset($_POST['submit'])) { require_once($sourcedir . '/Subs-Post.php'); $context['contact_form_sendmail_override_headers'] = true; if (sendmail($dest_email_addr, $subject, $content, $headers)) { $context['contact_form_message_sent'] = true; $context['page_title'] .= ' - ' . $txt['contact_form_result_message_sent']; } else { $context['contact_form_message_failed'] = true; $context['page_title'] .= ' - ' . $txt['contact_form_result_send_mail_failed']; } } else { if ($global_error && isset($_POST['submit'])) $context['page_title'] .= ' - ' . $txt['contact_form_result_error']; } $context['linktree'][] = array( 'url' => $scripturl.'?action=contact', 'name' => $context['page_title'], ); loadTemplate('Contact'); } function valid_email($email) { global $modSettings; $at_ptr = strrpos($email, "@"); if (is_bool($at_ptr) && !$at_ptr) return false; $domain = substr($email, $at_ptr+1); $local = substr($email, 0, $at_ptr); $local_len = strlen($local); $domain_len = strlen($domain); if ($local_len < 1 || $local_len > 64 || $domain_len < 1 || $domain_len > 255) return false; // local or domain part length invalid else if ($local[0] == '.' || $local[$local_len-1] == '.') return false; // local part cannot start or end with dot else if (preg_match('/\\.\\./', $local)) return false; // local part cannot have two consecutive dots else if (!preg_match('/^[A-Za-z0-9\\-\\.]+$/', $domain)) return false; // domain part has invalid character else if (preg_match('/\\.\\./', $domain)) return false; // domain part cannot have two consecutive dots else if (!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\", "", $local))) // exception for quoted if (!preg_match('/^"(\\\\"|[^"])+"$/', str_replace("\\\\", "", $local))) return false; // local part character invalid except when local part is quoted if (!empty($modSettings['contact_form_skip_dns_check'])) return true; // mod setting to skip the DNS A/MX record check if (function_exists('checkdnsrr')) if (!(checkdnsrr($domain, 'MX') || checkdnsrr($domain, 'A'))) return false; // domain does not have a valid A or MX record else if (!(win_checkdnsrr($domain, 'MX') || win_checkdnsrr($domain, 'A'))) return false; // domain does not have a valid A or MX record return true; } function win_checkdnsrr($host, $type) { if (!empty($host)) { exec('nslookup -type=' . $type . ' ' . escapeshellcmd($host), $result); foreach ($result as $line) if (eregi("^$hostName", $line)) return true; } return false; } ?> Czy ktoś mi może pomóc? Z góry dziękuję i pozdrawiam - Sandra Tytuł: Odp: Formularz kontaktowy nie wysyła wiadomości Wiadomość wysłana przez: roco 12.07.2010 11:23:03 Witaj Sandro :)
Bardzo przepraszam, teraz to już w ogóle są szkodliwe warunki pracy przy komie, a u mnie nie przybywa czasu na luzik i ostatnio w ogóle nie mogłem się tu pojawiać... sorka :) Na szybko to coś mi w podświetlaniu składni się nie podoba, konkretnie chodzi mi o funkcję sprawdzania maila: GeSHi -› Code: [select] Tu są różne warunki i nie podoba mi się ta linijka, ( z funkcji sprawdzajki), linia ~148: GeSHi -› Code: [select] else if (!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\", "", $local))) // exception for quoted hmm wygląda jakby co najmniej brakowało średnika na końcu --> ; Dlatego przetestuj 3 opcje: 1 - ze średnikiem na końcu --> ; GeSHi -› Code: [select] else if (!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\", "", $local))); // exception for quoted 2 - z return false; GeSHi -› Code: [select] else if (!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\", "", $local))) return false; // exception for quoted 3 - i z return true; GeSHi -› Code: [select] else if (!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\", "", $local))) return true; // exception for quoted Sprawdź, po kolei czy jest ok, czy są jakieś błędy? Funkcja sprawdza również rekordy DNS, więc mail powinien być prawdziwy, ponadto wpisałbym inny niż mail admina. Na stronie smf.org, tam gdzie ten mod to kliknąłem "parse" i nie podoba mi się w template tego moda wartość value="" w inpucie maila, ponieważ nie powinno tu być żadnych spacji, (w cudzysłowach value), a tym czasem widzę jedną na końcu.. To jest cały ten input do wpisywania maila + opis itd: //-------------------------------------------------------------------------------------------------- // Email address //-------------------------------------------------------------------------------------------------- echo' <div style="padding-bottom: 6px;"> <label for="email"><span class="normaltext">', $txt['contact_form_label_email'], '<span class="smalltext"', empty($modSettings['contact_form_require_email']) ? '> ' . $txt['contact_form_field_optional_email'] : ' style="color: red;"> ' . $txt['contact_form_field_required'], '</span></span><br /> <input '; if (isset($context['contact_form_message_sent'])) echo 'readonly="readonly" style="background-color: #F0F0F0;" '; if (isset($_POST['email'])) echo 'value="', trim($_POST['email']), '" '; echo 'type="text" size="24" name="email" id="email"'; if (isset($context['contact_form_error_no_email']) && isset($_POST['submit'])) { echo ' style="border-style: solid; border-color: red;" /> </label> <span class="smalltext" style="color: red;">', $txt['contact_form_error_no_email'], '</span>'; } else if (isset($context['contact_form_error_invalid_email']) && isset($_POST['submit'])) { echo ' style="border-style: solid; border-color: red;" /> </label> <span class="smalltext" style="color: red;">', $txt['contact_form_error_invalid_email'], '</span>'; } else echo ' /> </label>'; echo ' </div>'; //-------------------------------------------------------------------------------------------------- // Subject line //-------------------------------------------------------------------------------------------------- To w linii około ~60 zaczyna się sam input, czyli ten kawałek kodu: GeSHi -› Code: [select] <input '; if (isset($context['contact_form_message_sent'])) echo 'readonly="readonly" style="background-color: #F0F0F0;" '; if (isset($_POST['email'])) echo 'value="', trim($_POST['email']), '" '; echo 'type="text" size="24" name="email" id="email"'; if (isset($context['contact_form_error_no_email']) && isset($_POST['submit'])) { echo ' style="border-style: solid; border-color: red;" /> Jak widać w value= po ' ,trim($_POST['email']), ' -> właśnie tu jest spacja i dopiero cudzysłów " to wytnij ją, ale daj spację linijkę poniżej zaraz po echo i a'postofie, tam gdzie zaczyna się type="text" Czyli zapisałbym ten kawałek tak: GeSHi -› Code: [select] <input '; if (isset($context['contact_form_message_sent'])) echo 'readonly="readonly" style="background-color: #F0F0F0;" '; if (isset($_POST['email'])) echo 'value="', trim($_POST['email']), '"'; // wycięta spacja na końcu przed zamykającym cudzysłowem echo ' type="text" size="24" name="email" id="email"'; // dodana spacja na początku, zaraz po echo ' if (isset($context['contact_form_error_no_email']) && isset($_POST['submit'])) { echo ' style="border-style: solid; border-color: red;" /> Po za tym podejrzałbym kod, - jestem ciekaw jak wygląda ten input w przeglądarce w poglądzie źródła? Sandro, sorry, na szybko tylko to przychodzi mi do głowy.. W tym inpucie jest tak, że po przetworzeniu wpisanego emaila i tak zostaje tam spacja, przed zamykającym value cudzysłowem " I chyba od tego zacznij, (a dopiero grzebnij w silniku tego moda), czyli zacznij w ./Themes/default/Contact.template.php Dopiero później! dłubnij w silniku czyli w ./Sources/Contact.php Jest okrutnie gorąco, martwię się o kompy, a roboty i wydarzeń nie ubywa.., dlatego weź proszę na to poprawkę. Oczywiście w miarę możliwości postaram się tu zaglądać., częściej niż ostatnio, okay? Mam nadzieję, że to bzdet i to co tu powypisywałem, pomoże :) Pozdrawiam :) roco Tytuł: Odp: Formularz kontaktowy nie wysyła wiadomości Wiadomość wysłana przez: Sandra 12.07.2010 12:28:53 Cześć Roco :)
Upały faktycznie pioruńskie, ale lepsze (chyba) to niż plucha ;) Co do formularza... już trochę błędów wyeliminowałam, ten brak średnika też zauważyłam i wpisałam tam return false;... Pomału zaczęłam eliminować potencjalnie zła kawałki kodu (na razie analizuję tylko contact.php) i zostało mi, że źle działa jeszcze to: Code: [select] if (!preg_match('/^"(\\\\"|[^"])+"$/', str_replace("\\\\", "", $local))) return false; i to: Code: [select] if (!(checkdnsrr($domain, 'MX') || checkdnsrr($domain, 'A'))) return false; else if (!(win_checkdnsrr($domain, 'MX') || win_checkdnsrr($domain, 'A'))) return false; Po zakomentowaniu tych linii niby jest ok, ale przepuszcza wiadomość z takim adresem e-mail: a@a Nie bardzo profesjonalnie to jest :( Poprawki w pliku contact.template.php nie mają wpływu na działanie formularza (przynajmniej ja ich nie widzę) Pozdrawiam - Sandra Tytuł: Odp: Formularz kontaktowy nie wysyła wiadomości Wiadomość wysłana przez: Sandra 14.07.2010 10:33:08 Póki co zastąpiłam całą treść funkcji takim kodem:
Code: [select] if ( !preg_match("#^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$#", $email) ) return false; return true; Teraz sprawdza adres e-mail jak należy i nie przepuszcza postaci a@a jak poprzednio. Czyli w zasadzie problem jest rozwiązany, ale.... Chciałabym jednak, uruchomić tę funkcję, skoro autor się napracował, zeby wzbogacić formularz o dodatkowe sprawdzanie, to warto skorzystać (kolejne zabezpieczenie przed spamem :) )... generalnie podoba mi się ten formularz, więc będę wdzięczna za pomoc. Sandra Tytuł: Odp: Formularz kontaktowy nie wysyła wiadomości Wiadomość wysłana przez: roco 20.07.2010 05:36:21 Sandro :)
Podany przez Ciebie kod, jest jak najbardziej w porządku. :) To klasyczna sprawdzajka, można by rzec uniwersalna.. Gościu od moda, już go dalej nie rozwija.. A są jeszcze i inne mody do eMaili na smf.org To co zastosował autor w swoim modzie do wysyłania poczty, to po za normalnymi mechanizmami, "odsiewczyczymi", zastosował autentyczną sprawdzajkę samych adresów eMail w 2 bazach adresowych. To już poważniejszy "dings", jednak sorry nie chcę Cię martwić, ale nie na wszystkich hostingach w PL, można użyć zastosowanych w modzie narzędzi, po prostu nie wszędzie zadziała, nawet w hmm w "większej większości", rzekłbym.. Oczywiście można wyciąć w kodzie a i tak dostaniesz całkiem do rzeczy normalny mechanizm formularza. Moim zdaniem, powinnaś "odptaszkować" sprawdzanie rekordów DNS czy jak tam jest.. w PA, i w formularzu można wyciąć/wyłączyć to: GeSHi -› Code: [select] if (function_exists('checkdnsrr')) if (!(checkdnsrr($domain, 'MX') || checkdnsrr($domain, 'A'))) return false; // domain does not have a valid A or MX record else if (!(win_checkdnsrr($domain, 'MX') || win_checkdnsrr($domain, 'A'))) return false; // domain does not have a valid A or MX record Możesz po jednej lini // --> wyłączona linia lub: /* więcej włączonych linii */ Tylko, najlepiej to robić za pomocą edytora z podświetlaną składnią, a nawet zdecydowanie należy! Są formularze i do 1.1.11 i do 2.0 RC3, przetestuj inne ;) Pozdrawiam :) roco Tytuł: Odp: Formularz kontaktowy nie wysyła wiadomości Wiadomość wysłana przez: Sandra 20.07.2010 08:44:52 Quote: [select] Są formularze i do 1.1.11 i do 2.0 RC3, przetestuj inne Nie jestem za ulepszaniem dobrego :) Tak jak pisałam wcześniej, formularz mi się podoba, spełnia swoje zadanie - nie będę testować czegoś innego, przynajmniej na razie - dopóki nie ujawniły się inne błędy :) Bardzo dziękuję za pomoc :5: - Sandra |