SMF HELP!

SMF Help! - For Users SMF/TP => Mods - Problemy, Integracje, Funkcjonalność => Wątek zaczęty przez: Sandra 10.07.2010 21:23:16



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(&#39;SMF&#39;))
die(&#39;Hacking attempt...&#39;);

function Contact()
{
global $context$settings$options$scripturl$boarddir$sourcedir$modSettings$user_info$txt$webmaster_email;

if($user_info[&#39;is_guest&#39;] && empty($modSettings[&#39;contact_form_enable_guest_access&#39;])) redirectexit();
if(!$user_info[&#39;is_guest&#39;] && empty($modSettings[&#39;contact_form_enable_member_access&#39;])) redirectexit();

$global_error false;

if (!empty($modSettings[&#39;reg_verification&#39;]) && $context[&#39;user&#39;][&#39;is_guest&#39;])
{
require_once($sourcedir . &#39;/Subs-Editor.php&#39;);
$verificationOptions = array(
&#39;id&#39; => &#39;register&#39;,
);
if (isset($_POST[&#39;submit&#39;]))
{
$context[&#39;visual_verification&#39;] = create_control_verification($verificationOptions, true);
if (is_array($context[&#39;visual_verification&#39;]))
{
loadLanguage(&#39;Errors&#39;);
foreach ($context[&#39;visual_verification&#39;] as $error)
{
$global_error $context[&#39;contact_form_error_visual_verification&#39;] = true;
$context[&#39;visual_verification_error_dscr&#39;] = $txt[&#39;error_&#39; . $error];
}
}
}
$context[&#39;visual_verification&#39;] = create_control_verification($verificationOptions);
$context[&#39;visual_verification_id&#39;] = $verificationOptions[&#39;id&#39;];
}
else $context[&#39;visual_verification&#39;] = false;

$content = &#39;&#39;;
$sender_ip $_SERVER[&#39;REMOTE_ADDR&#39;];
$sender_rdns gethostbyaddr($sender_ip);
if ($context[&#39;user&#39;][&#39;is_guest&#39;]) $sender = $txt[&#39;contact_form_sender_is_guest&#39;];
else
{
$sender $context[&#39;user&#39;][&#39;name&#39;];
if ($context[&#39;user&#39;][&#39;name&#39;] != $context[&#39;user&#39;][&#39;username&#39;]) $sender .= &#39; (&#39; . $context[&#39;user&#39;][&#39;username&#39;] . &#39;)&#39;;
}

$message  = isset($_POST[&#39;message&#39;]) ? trim($_POST[&#39;message&#39;]) : &#39;&#39;;
if (!$message$global_error $context[&#39;contact_form_error_no_message&#39;] = true;

$sender_name = isset($_POST[&#39;name&#39;]) ? trim($_POST[&#39;name&#39;]) : &#39;&#39;;
if (!$sender_name && !empty($modSettings[&#39;contact_form_require_name&#39;])) $global_error = $context[&#39;contact_form_error_no_name&#39;] = true;
if (!$sender_name || !empty($modSettings[&#39;contact_form_sender_name_dont_use_form&#39;]))
{
$name = empty($modSettings[&#39;contact_form_default_name&#39;]) ? $txt[&#39;contact_form_default_name_default&#39;] : $modSettings[&#39;contact_form_default_name&#39;];
if ($sender_name$content .= $txt[&#39;contact_form_label_status_name&#39;] . $sender_name . &#39;
&#39;;
}
else $name $sender_name;

$sender_email = isset($_POST[&#39;email&#39;]) ? trim($_POST[&#39;email&#39;]) : &#39;&#39;;
if (!$sender_email && !empty($modSettings[&#39;contact_form_require_email&#39;])) $global_error = $context[&#39;contact_form_error_no_email&#39;] = true;
if ($sender_email && !valid_email($sender_email)) $global_error $context[&#39;contact_form_error_invalid_email&#39;] = true;
if (!$sender_email || !empty($modSettings[&#39;contact_form_sender_email_dont_use_form&#39;]))
{
$email = empty($modSettings[&#39;contact_form_default_email_sender&#39;]) ? $webmaster_email : $modSettings[&#39;contact_form_default_email_sender&#39;];
if ($sender_email$content .= $txt[&#39;contact_form_label_status_email&#39;] . $sender_email . &#39;
&#39;;
}
else $email $sender_email;
$headers = &#39;From: &#39; . $name . &#39; <&#39; . $email . &#39;>&#39;;

$sender_subject = isset($_POST[&#39;subject&#39;]) ? trim($_POST[&#39;subject&#39;]) : &#39;&#39;;
if (!$sender_subject && !empty($modSettings[&#39;contact_form_require_subject&#39;])) $global_error = $context[&#39;contact_form_error_no_subject&#39;] = true;
if (!$sender_subject || !empty($modSettings[&#39;contact_form_sender_subject_dont_use_form&#39;]))
{
$subject = empty($modSettings[&#39;contact_form_default_subject&#39;]) ? $txt[&#39;contact_form_default_subject_default&#39;] : $modSettings[&#39;contact_form_default_subject&#39;];
if ($sender_subject$content .= $txt[&#39;contact_form_label_status_subject&#39;]  . $sender_subject . &#39;
&#39;;
}
else $subject $sender_subject;
if (!empty($modSettings[&#39;contact_form_subject_prefix&#39;])) $subject = $modSettings[&#39;contact_form_subject_prefix&#39;] . &#39; &#39; . $subject;

if ($content$content .= $txt[&#39;contact_form_label_status_separator&#39;];

$content .= stripslashes($message);
$content .= $txt[&#39;contact_form_label_ip&#39;] . $sender_ip . $txt[&#39;contact_form_label_rdns&#39;] . $sender_rdns . $txt[&#39;contact_form_label_sender&#39;] . $sender;

$dest_email_addr = empty($modSettings[&#39;contact_form_dest_email_addr&#39;]) ? $webmaster_email : $modSettings[&#39;contact_form_dest_email_addr&#39;];

$context[&#39;page_title&#39;] = empty($modSettings[&#39;contact_form_display_title&#39;]) ? $txt[&#39;contact_form_title&#39;] : $modSettings[&#39;contact_form_display_title&#39;];

if (!$global_error && isset($_POST[&#39;submit&#39;]))
{
require_once($sourcedir . &#39;/Subs-Post.php&#39;);
$context[&#39;contact_form_sendmail_override_headers&#39;] = true;
if (sendmail($dest_email_addr$subject$content$headers))
{
$context[&#39;contact_form_message_sent&#39;] = true;
$context[&#39;page_title&#39;] .= &#39; - &#39; . $txt[&#39;contact_form_result_message_sent&#39;];
}
else
{
$context[&#39;contact_form_message_failed&#39;] = true;
$context[&#39;page_title&#39;] .= &#39; - &#39; . $txt[&#39;contact_form_result_send_mail_failed&#39;];
}
}
else
{
if ($global_error && isset($_POST[&#39;submit&#39;]))
$context[&#39;page_title&#39;] .= &#39; - &#39; . $txt[&#39;contact_form_result_error&#39;];
}

$context[&#39;linktree&#39;][] = array(
&#39;url&#39; => $scripturl.&#39;?action=contact&#39;,
&#39;name&#39; => $context[&#39;page_title&#39;],
);

loadTemplate(&#39;Contact&#39;);
}

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($email0$at_ptr);
$local_len strlen($local);
$domain_len strlen($domain);
if ($local_len || $local_len 64 || $domain_len || $domain_len 255) return false; // local or domain part length invalid
else if ($local[0] == &#39;.&#39; || $local[$local_len-1] == &#39;.&#39;) return false; // local part cannot start or end with dot
else if (preg_match(&#39;/\\.\\./&#39;, $local)) return false; // local part cannot have two consecutive dots
else if (!preg_match(&#39;/^[A-Za-z0-9\\-\\.]+$/&#39;, $domain)) return false; // domain part has invalid character
else if (preg_match(&#39;/\\.\\./&#39;, $domain)) return false; // domain part cannot have two consecutive dots
else if (!preg_match(&#39;/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\&#39;*+?^{}|~.-])+$/&#39;, str_replace("\\\\", "", $local))) // exception for quoted
if (!preg_match(&#39;/^"(\\\\"|[^"])+"$/&#39;, str_replace("\\\\", "", $local))) return false; // local part character invalid except when local part is quoted
if (!empty($modSettings[&#39;contact_form_skip_dns_check&#39;])) return true; // mod setting to skip the DNS A/MX record check
if (function_exists(&#39;checkdnsrr&#39;))
if (!(checkdnsrr($domain, &#39;MX&#39;) || checkdnsrr($domain, &#39;A&#39;))) return false; // domain does not have a valid A or MX record
else
if (!(win_checkdnsrr($domain, &#39;MX&#39;) || win_checkdnsrr($domain, &#39;A&#39;))) return false; // domain does not have a valid A or MX record
return true;
}

function 
win_checkdnsrr($host$type)
{
if (!empty($host))
{
exec(&#39;nslookup -type=&#39; . $type . &#39; &#39; . 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]
function valid_email($email)
{
    global $modSettings;
// Created by GeSHi 1.0.8.10 | code: -› [code=PHP] | load:0.028s | speed:1.84 KB/s



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
// Created by GeSHi 1.0.8.10 | code: -› [code=PHP] | load:0.027s | speed:4.68 KB/s



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
// Created by GeSHi 1.0.8.10 | code: -› [code=PHP] | load:0.027s | speed:4.77 KB/s





2 - z   return false;
 
GeSHi -› Code: [select]
    else if (!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\", "", $local))) return false; // exception for quoted
// Created by GeSHi 1.0.8.10 | code: -› [code=PHP] | load:0.029s | speed:4.79 KB/s





3 - i z  return true;

GeSHi -› Code: [select]
    else if (!preg_match('/^(\\\\.|[A-Za-z0-9!#%&`_=\\/$\'*+?^{}|~.-])+$/', str_replace("\\\\", "", $local))) return true;  // exception for quoted
// Created by GeSHi 1.0.8.10 | code: -› [code=PHP] | load:0.031s | speed:4.51 KB/s





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;" />
// Created by GeSHi 1.0.8.10 | code: -› [code=PHP] | load:0.031s | speed:12.41 KB/s



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;" />
// Created by GeSHi 1.0.8.10 | code: -› [code=PHP] | load:0.046s | speed:10.79 KB/s





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
 
// Created by GeSHi 1.0.8.10 | code: -› [code=PHP] | load:0.033s | speed:8.97 KB/s



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