PHP-Nuke
  Strona głównaDownloadForumFAQ Zaloguj się  
Forum


 
Rules  Forum FAQ   Search   Usergroups   Register   Log in
 
 
Zadając pytanie dotyczące PHPNuke podaj jego wersje!!

View Single Post #107  Topic: Autoryzacja SMTP w Nuke'u (v. 1.02) 
Author Message
Suchy
~user



PostPosted: 24 Dec 2004 15:40:10    Post subject: Autoryzacja SMTP w Nuke'u (v. 1.02) Reply with quote

Jak wszyscy wiemy w Nuke'u są momenty gdy wysyłany jest mail do użytkowników (np: Newsletter, Feedback, Potwierdzenie rejestracji itp)

Wszystko pięknie o ile dysponujemy serwerem z skonfigurowanym sendmailem/postfixem (czyli dobrze skonfigurowany Linux) i nie zablokowaną funkcją mail()

Co jednak zrobić gdy nasz serwer jest postawiony na Windowsie, który nie ma sendmaila, lub gdy sendmail/postfix nie jest skonfigurowany, albo funkcja mail() jest zablokowana czy tż gdy poprostu nie chcemy kożystać z sendmaila?

Oczywiście wystarczy w php.ini podać adres serwera pocztowego SMTP i mail dowolnego założonego na nim konta. Jednakże nie zawsze mamy do takiego pliku dostęp, lub też samo podanie SMTP i maila nie wystarczy gdyż serwer wymaga autoryzacji do wysyłania maili (jest to zabezpieczenie przed robakami i przed spamowaniem - w dzisiejszych prawie każdy serwer wymaga autoryzacji)

W przypadku forum od Nuke'a możemy w jego konfiguracji (Panel Administracyjny->Forums->Konfiguracja->Ustawienia Email'i) ustawić dane potrzebne do autoryzacji:
Adres Email Admina: wpisujemy nasz email
Podpis pod email: tekst który ma być dołączony na koniec każdego maila
Używaj Serwera SMTP: oczywiście ustawiamy na TAK
Adres Serwera SMTP: wpisujmy adres serwera SMTP, który poznaliśmy przy zakładaniu konta, np: smtp.wp.pl
Nazwa Użytkownika SMTP: wpisujemy login (czasami trzeba wpisac pełny adres email zamiast loginu - zależy od tgo gdzie mamy konto)
Hasło SMTP: hasło do autoryzacji (zazwyczaj taki samo jak do całego konta)

Niestety pozostałe części Nuke'a korzystają już z tradycyjnej funkcji mail(). Funkcja ta nie obsługuje autoryzacji. Co więc zrobić?

I. Należy zainstalować jaknajnowsze paczki PEAR: Mail oraz Socket

a) Ściągamy ze strony http://pear.php.net wyżej wspomniane paczki i kopiujemy je do katalogu: PEAR\go-pear-bundle znajdującym się w miejscu gdzie zainstalowaliśmy PHP
b) Jeśli w tym katalogu istnieją już te paczki ale w starszych wersjach to je usuwamy
c) Odpalamy pliczek go-pear.bat który też jest tam gdzie mamy PHP i postępujmy zgodnie z instrukcjami instalacji (gdy będzie pytanie czy chcesz zmienić ścieżki dostępu sugeruję pozostawić je takie jaki są)
d) po zakończeniu instalacji zostanie wygenrowany plik PEAR_ENV.reg, dołączamy go do rejestru dwukrotnie na niego klikając.
e) restart serwera
f) Właśnie zainstalowałeś(aś) odpowiednie paczki PEAR.



II. Teraz trzeba zmodyfikować odpowiednie pliki nuke'a odpowidzialne za wysyłanie Newslettera, powiadmienia do przyjaciół i Feedbacku oraz YourAccount

1) przygotowujemy pliki:
a) w katalogu includes w wsoim Nuke'u utwórz plik o nazwie mailconfig.php i poniższej zawartości:

Code:
<?php
$headers["From"] = "ja@domena.pl"; //adres konta przez które jest wysyłana poczta
$params["host"] = "SMTP.serwer.pl"; // adres serwera SMTP (np: SMTP.wp.pl)
$params["port"] = "25"; // port serwera SMTP (zazwyczaj: 25)
$params["auth"] = true; // czy serwer wymaga autoryzacji (zazwyczaj: true)
$params["username"] = "login";    // login konta (ewentualnie adres e-mail konta)
$params["password"] = "hasło";    // hasło konta
?>


2) Zmieniamy Feedback
a) otwórz plik index.php znajdujący się w katalogu modules\feedback
b) zamień:

Code:
$form_block = "
    <center><font class=\"title\"><b>$sitename: "._FEEDBACKTITLE."</b></font>
    <br><br><font class=\"content\">"._FEEDBACKNOTE."</font>
    <FORM METHOD=\"post\" ACTION=\"modules.php?name=$module_name\">
    <P><strong>"._YOURNAME.":</strong><br>
    <INPUT type=\"text\" NAME=\"sender_name\" VALUE=\"$sender_name\" SIZE=30></p>
    <P><strong>"._YOUREMAIL.":</strong><br>
    <INPUT type=\"text\" NAME=\"sender_email\" VALUE=\"$sender_email\" SIZE=30></p>
    <P><strong>"._MESSAGE.":</strong><br>
    <TEXTAREA NAME=\"message\" COLS=30 ROWS=5 WRAP=virtual>$message</TEXTAREA></p>
    <INPUT type=\"hidden\" name=\"opi\" value=\"ds\">
    <P><INPUT TYPE=\"submit\" NAME=\"submit\" VALUE=\""._SEND."\"></p>
    </FORM></center>
";

OpenTable();
if ($opi != "ds") {
    echo "$form_block";
} elseif ($opi == "ds") {
    if ($sender_name == "") {
   $name_err = "<center><font class=\"option\"><b><i>"._FBENTERNAME."</i></b></font></center><br>";
   $send = "no";
    }
    if ($sender_email == "") {
   $email_err = "<center><font class=\"option\"><b><i>"._FBENTEREMAIL."</i></b></font></center><br>";
   $send = "no";
    }
    if ($message == "") {
       $message_err = "<center><font class=\"option\"><b><i>"._FBENTERMESSAGE."</i></b></font></center><br>";
   $send = "no";
    }
    if ($send != "no") {
   $sender_name = removecrlf($sender_name);
   $sender_email = removecrlf($sender_email);
   $msg = "$sitename\n\n";
   $msg .= ""._SENDERNAME.": $sender_name\n";
   $msg .= ""._SENDEREMAIL.": $sender_email\n";
   $msg .= ""._MESSAGE.": $message\n\n";
   $to = $adminmail;
   $mailheaders = "From: $sender_name <$sender_email>\n";
   $mailheaders .= "Reply-To: $sender_email\n\n";
   mail($to, $subject, $msg, $mailheaders);
   echo "<P><center>"._FBMAILSENT."</center></p>";
   echo "<P><center>"._FBTHANKSFORCONTACT."</center></p>";
    } elseif ($send == "no") {
   OpenTable2();
   echo "$name_err";
   echo "$email_err";
   echo "$message_err";
   CloseTable2();
   echo "<br><br>";
   echo "$form_block"; 
    }
}


na:

Code:
// wygląd formularza
$form_block = "<center><font class=\"title\"><b>$sitename: "._FEEDBACKTITLE."</b></font><br><br><font class=\"content\">"._FEEDBACKNOTE."</font><FORM METHOD=\"post\" ACTION=\"modules.php?name=$module_name\"><P><strong>"._YOURNAME.":</strong><br><INPUT type=\"text\" NAME=\"sender_name\" VALUE=\"$sender_name\" SIZE=30></p><P><strong>"._YOUREMAIL.":</strong><br><INPUT type=\"text\" NAME=\"sender_email\" VALUE=\"$sender_email\" SIZE=30></p><P><strong>"._MESSAGE.":</strong><br><TEXTAREA NAME=\"message\" COLS=30 ROWS=5 WRAP=virtual>$message</TEXTAREA></p><INPUT type=\"hidden\" name=\"wys\" value=\"tak\"><P><INPUT TYPE=\"submit\" NAME=\"submit\" VALUE=\""._SEND."\"></p></FORM></center>";

OpenTable();
if ($wys != "tak") {
    echo "$form_block";
} else {
$sender_name = removecrlf($sender_name);
$sender_email = removecrlf($sender_email);
include("Mail.php");

// w tym pliku ustaw parametry konta przez które ma wysłać maila
require_once("includes/mailconfig.php");

// do kogo ma dotrzeć mail
$recipients = $adminmail;

// definiowanie nagłówka
$headers["To"]      = $adminmail;
$headers["Subject"] = $subject;

// tworzenie treści maila
$body = "$sitename\n\n";
$body .= ""._SENDERNAME.": $sender_name ($sender_email)\n";
$body .= ""._MESSAGE.": $message\n\n";

// Tworzenie obiektu przy użyciu metody Mail::factory
$mail_object =& Mail::factory("smtp", $params);

// sru maila w net :D
$mail_object->send($recipients, $headers, $body);
echo "<P><center>"._FBMAILSENT."</center></p>";
echo "<P><center>"._FBTHANKSFORCONTACT."</center></p>";
}



3) Zmieniamy wysyłanie do przyjaciół
a) otwórz plik friend.php znajdujący się w modules\News
b) zamień:

Code:
function SendStory($sid, $yname, $ymail, $fname, $fmail) {
    global $sitename, $nukeurl, $prefix, $db, $module_name;

    $fname = stripslashes(removecrlf($fname));
    $fmail = stripslashes(removecrlf($fmail));
    $yname = stripslashes(removecrlf($yname));
    $ymail = stripslashes(removecrlf($ymail));   
    $sid = intval($sid);
    $row = $db->sql_fetchrow($db->sql_query("SELECT title, time, topic FROM ".$prefix."_stories WHERE sid='$sid'"));
    $title = stripslashes(check_html($row['title'], "nohtml"));
    $time = $row['time'];
    $topic = intval($row['topic']);
    $row2 = $db->sql_fetchrow($db->sql_query("SELECT topictext FROM ".$prefix."_topics WHERE topicid='$topic'"));
    $topictext = stripslashes(check_html($row2['topictext'], "nohtml"));
    $subject = ""._INTERESTING." $sitename";
    $message = ""._HELLO." $fname:\n\n"._YOURFRIEND." $yname "._CONSIDERED."\n\n\n$title\n("._FDATE." $time)\n"._FTOPIC." $topictext\n\n"._URL.": $nukeurl/modules.php?name=$module_name&file=article&sid=$sid\n\n"._YOUCANREAD." $sitename\n$nukeurl";
    mail($fmail, $subject, $message, "From: \"$yname\" <$ymail>\nX-Mailer: PHP/" . phpversion());
    update_points(6);
    $title = urlencode($title);
    $fname = urlencode($fname);
    Header("Location: modules.php?name=$module_name&file=friend&op=StorySent&title=$title&fname=$fname");
}


na:

Code:
function SendStory($sid, $yname, $ymail, $fname, $fmail) {
    global $sitename, $nukeurl, $prefix, $db, $module_name;

    $fname = removecrlf($fname);
    $fmail = removecrlf($fmail);
    $yname = removecrlf($yname);
    $ymail = removecrlf($ymail);

    $sql = "SELECT title, time, topic FROM ".$prefix."_stories WHERE sid='$sid'";
    $result = $db->sql_query($sql);
    $row = $db->sql_fetchrow($result);
    $title = $row[title];
    $time = $row[time];
    $topic = $row[topic];

    $sql = "SELECT topictext FROM ".$prefix."_topics WHERE topicid='$topic'";
    $result = $db->sql_query($sql);
    $row = $db->sql_fetchrow($result);
    $topictext = $row[topictext];

    $subject = ""._INTERESTING." $sitename";
    $message = ""._HELLO." $fname:\n\n"._YOURFRIEND." $yname "._CONSIDERED."\n\n\n$title\n("._FDATE." $time)\n"._FTOPIC." $topictext\n\n"._URL.": $nukeurl/modules.php?name=$module_name&file=article&sid=$sid\n\n"._YOUCANREAD." $sitename\n$nukeurl";


   include("Mail.php");

   // w tym pliku ustaw parametry konta przez które ma wysłać maila
   require_once("includes/mailconfig.php");

   // do kogo ma dotrzeć mail
   $recipients = $fmail;

   // definiowanie nagłówka
   $headers["To"] = $fmail;
   $headers["Subject"] = $subject;

   $body = $message;

   // Tworzenie obiektu przy użyciu metody Mail::factory
   $mail_object =& Mail::factory("smtp", $params);

   // sru maila w net :D
   $mail_object->send($recipients, $headers, $body);



    update_points(6);
    $title = urlencode($title);
    $fname = urlencode($fname);
    Header("Location: modules.php?name=$module_name&file=friend&op=StorySent&title=$title&fname=$fname");
}



4) Zmieniamy Newsletter
a) otwórz plik newsletter.php będący w admin\modules
b) zamień:

Code:
function newsletter_send($title, $content) {
    global $user_prefix, $sitename, $db, $nukeurl, $adminmail;
    $send_html_messages = "yes";
    $from = $adminmail;
    $subject = "[$sitename Newsletter]: " . stripslashes($title) . "";
    $content = stripslashes($content);
    $content = "$sitename " . _NEWSLETTER . "\n\n\n$content\n\n- $sitename " . _STAFF . "\n\n\n\n\n\n" . _NLUNSUBSCRIBE . "";
    $result = $db->sql_query("SELECT user_email from " . $user_prefix . "_users where newsletter='1'");
    while ($row = $db->sql_fetchrow($result)) {
   $user_email = $row['user_email'];
        $xheaders = "From: " . $sitename . " <" . $adminmail . ">\n";
        $xheaders .= "X-Sender: <" . $adminmail . ">\n";
        $xheaders .= "X-Mailer: PHP\n"; // mailer
        $xheaders .= "X-Priority: 6\n"; // Urgent message!
        if ($send_html_messages == "yes") {
                $xheaders .= "Content-Type: text/html; charset=iso-8859-1\n"; // Mime type
        }
        mail("$user_email","$subject","$content",$xheaders);
    }
    Header("Location: admin.php?op=newsletter_sent");
}


na:

Code:
function newsletter_send($title, $content) {
    global $user_prefix, $sitename, $dbi, $nukeurl, $adminmail;

    include("Mail.php");

   // w tym pliku ustaw parametry konta przez które ma wysłać maila
   include("includes/mailconfig.php");

    $subject = "[$sitename Newsletter]: ".stripslashes($title)."";
   $headers["Subject"] = $subject;

    $content = stripslashes($content);
    $content = "$sitename "._NEWSLETTER."\n\n\n$content\n\n- $sitename "._STAFF."\n\n\n\n\n\n"._NLUNSUBSCRIBE."";
    $body = $content;

    $result = sql_query("select user_email from ".$user_prefix."_users where newsletter='1'", $dbi);
    while(list($user_email) = sql_fetch_row($result, $dbi)) {

   // do kogo ma dotrzeć mail
   $recipients = $user_email;

   // definiowanie nagłówka
   $headers["To"] = $user_email;

   // Tworzenie obiektu przy użyciu metody Mail::factory
   $mail_object =& Mail::factory("smtp", $params);

   // sru maila w net :D
   $mail_object->send($recipients, $headers, $body);
    }
    Header("Location: admin.php?op=newsletter_sent");
}


3) zamień:

Code:
function massmail_send($title, $content) {
    global $user_prefix, $sitename, $db, $nukeurl, $adminmail;
    $send_html_messages = "yes";
    $from = $adminmail;
    $subject = "[$sitename]: $title";
    $content = stripslashes($content);
    $content = "" . _FROM . ": $sitename\n\n\n\n$content\n\n\n\n- $sitename " . _STAFF . "\n\n\n\n" . _MASSEMAILMSG . "";
    $result = $db->sql_query("SELECT user_email from " . $user_prefix . "_users where user_id != '1'");
    while ($row = $db->sql_fetchrow($result)) {
   $user_email = $row['user_email'];
        $xheaders = "From: " . $sitename . " <" . $adminmail . ">\n";
        $xheaders .= "X-Sender: <" . $adminmail . ">\n";
        $xheaders .= "X-Mailer: PHP\n"; // mailer
        $xheaders .= "X-Priority: 6\n"; // Urgent message!
        if ($send_html_messages == "yes") {
                $xheaders .= "Content-Type: text/html; charset=iso-8859-1\n"; // Mime type
        }
        mail("$user_email","$subject","$content",$xheaders);
    }
    Header("Location: admin.php?op=massmail_sent");
}


na:

Code:
function massmail_send($title, $content) {
    global $user_prefix, $sitename, $dbi, $nukeurl, $adminmail;

    include_once("Mail.php");

   // w tym pliku ustaw parametry konta przez które ma wysłać maila
   include_once("includes/mailconfig.php");

    $subject = "[$sitename]: $title";
   $headers["Subject"] = $subject;

    $content = stripslashes($content);
    $content = ""._FROM.": $sitename\n\n\n\n$content\n\n\n\n- $sitename "._STAFF."\n\n\n\n"._MASSEMAILMSG."";
    $body = $content;

    $result = sql_query("select user_email from ".$user_prefix."_users where user_id != '1'", $dbi);
    while(list($user_email) = sql_fetch_row($result, $dbi)) {

   // do kogo ma dotrzeć mail
   $recipients = $user_email;

   // definiowanie nagłówka
   $headers["To"] = $user_email;

   // Tworzenie obiektu przy użyciu metody Mail::factory
   $mail_object =& Mail::factory("smtp", $params);

   // sru maila w net :D
   $mail_object->send($recipients, $headers, $body);
    }
    Header("Location: admin.php?op=massmail_sent");
}



5) Zmieniamy Your_Account
a) otwórz plik index.php będący w modules\Your_Account
b) zamień każdy wystpujący w tym pliku kod:

Code:
mail($user_email, $subject, $message, "From: $adminmail\nX-Mailer: PHP/" . phpversion());


na:

Code:
include("Mail.php");

// w tym pliku ustaw parametry konta przez które ma wysłać maila
require_once("includes/mailconfig.php");

// do kogo ma dotrzeć mail
$recipients = $user_email;

// definiowanie nagłówka
$headers["To"] = $user_email;
$headers["Subject"] = $subject;

$body = $message;

// Tworzenie obiektu przy użyciu metody Mail::factory
$mail_object =& Mail::factory("smtp", $params);

// sru maila w net :D
$mail_object->send($recipients, $headers, $body);



i to na tyle...

P.S.
Oczywiście można zmieniać ustawinia nagłówków czy zmiennych zawierających treść maila, lub odrobinę zoptymalizowac kod usuwając niektóre zmienne jeśli ktoś chce..

P.S.S.
kody modyfikacji opisałem komentarzami jeśli ktoś jest ciekawy co która linijka robi..

Tutorial and modifications by Suchy
_________________
Suchy the Master
www.gtw.avx.pl

www.scarlet.ivy.prv.pl
View user's profile Send private message Send e-mail Visit poster's website
 


Powered by phpBB [CR] © 2001, 2006 phpBB Group.
   
 

Copyright © 2004-2009 by phpnuke.org.pl :: PHP-Nuke Copyright © 2004 by Francisco Burzi.
Zdjęcia ślubne
Tworzenie strony: 0.34 sekund
Zapytań: 10