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.015s | speed:3.49 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.014s | speed:8.98 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.015s | speed:8.32 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.021s | speed:6.69 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.019s | speed:7.39 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.022s | speed:17.44 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.020s | speed:24.69 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.019s | speed:15.46 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