Levelezés a Gmail-en keresztül

2009. január 24., szombat | programozás, software

Végül csak sikerült megoldani a DarkRPG levelezését. Ugyebár az új honlaphoz azért nem készült privát üzenetküldési szolgáltatás, (és még pár dolog) mert a tárhelyen nem működik a levelezés. Eleinte próbáltuk kivárni, hogy csak megjavítják. Hát ez nem történt meg. Aztán pedig belekezdtünk egy saját program írásába, ami megkerüli a dolgot, de időhiány miatt nem igazán halad a dolog. Kezdett nagyon kínos lenni az ügy…

De mivel egyre több levél érkezik, hogy jó volna már pontot tenni az ügy végére, ma reggel nekiláttam egy külső (mások által írt) program felhasználásával megoldani a problémát. Ez pediglen Brent R. Matzelle PHPMailer-e. Már bevált más honlapjaimnál, de persze ennek ellenére csak nem ment oly egyszerűen a beüzemelése, mivel mi a Gmail smtp szolgáltatását szerettük volna igénybe venni leveleink elküldéséhez. Arra pedig ezen kód jelenlegi verziója nem alkalmas. Így kezdhettem átnézni magát a kódot, meg pár fórumot, hátha valakinek sikerült már átalakítania.

Végül kiderült, hogy egészen egyszerű a megoldás. A class.phpmailer.php forráskódjában úgy az 537. sornál található egy ilyen kód:

537
538
539
540
541
542
543
if(strstr($hosts[$index], ":"))
	list($host, $port) = explode(":", $hosts[$index]);
else
	{
	$host = $hosts[$index];
	$port = $this->Port;
	}

Nos ez okozza a fő zavart, mivel a gmail-nél ezt a hostot kell adni: sslv2://smtp.gmail.com. Amit a fenti kód szépen két részre bont a : mentén, aminek első felét host-ként értelmez, a második felét meg portnak. Ezen okból a fenti kódot le kell cserélni erre:

537
538
539
540
541
542
543
544
545
546
if (preg_match('#(([a-z]+://)?[^:]+):(\d+)#i', $hosts[$index], $match))
  {
  $host = $match[1];
  $port = $match[3];
  }
else
  {
  $host = $hosts[$index];
  $port = $this->Port;
  }

Illetve levélküldésnél portnak 465-öt kell adni. De itt egy példakód egy levél elküldésére:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$mail = new PHPMailer();
$mail->SetLanguage("en", "./phpmailer/language/");
$mail->IsSMTP();
$mail->Host = "sslv2://smtp.gmail.com";
$mail->Port = 465;
$mail->SMTPAuth = true;
$mail->Username = "******@gmail.com";
$mail->Password = "****";
 
$mail->From = "*******@gmail.com";
$mail->FromName = "DarkRPG infó";
$mail->AddAddress("*******@cimzett.hu", "Edward");
$mail->WordWrap = 60;
$mail->IsHTML(true);
 
$mail->Subject = "Teszt";
$mail->Body    = "Ez itt egy HTML-es teszt <b>szöveg</b>";
$mail->AltBody = "Ez itt egy szimpla HTML nélküli teszt szöveg";
 
if(!$mail->Send())
{
   echo "Üzenetet nem sikerült elküldeni. <p>";
   echo "Hiba oka: " . $mail->ErrorInfo;
   exit;
}

Természetesen még meg kell írnom hozzá egy külön osztályt, ami elfedi a PHPMailer logikáját. Így nem kell ahhoz igazodnom, küldhetem a leveleket a saját szokásaim szerint. Pl valahogy így:

1
2
3
4
$levelkuldes = new levelkuldes();
$levelkuldes->privatuzenet($cimzett_mail,$cimzett_nev,$targy,$tartalom_html,$tartalom_egyszeru);
$levelkuldes->ujjelszo($cimzett_mail,$cimzett_nev,$felhasznaloi_nev,$jelszo);
unset($levelkuldes);

Azért kicsit átláthatóbb és egyszerűbb. Csak azokat a paramétereket kell megadnom, ami annál a levéltípusnál változik, a többit beállítja a rendszer. (Persze lehetne pl. az összes paramétert egy tömbben is átadni mindig ugyanannak a metódusnak. Az első paraméter pedig tartalmazná, hogy milyen típusú levelet szeretnék küldeni. És innentől mindent lekezel az osztály. Nagy előnye, hogy csak egy metódus nevét kell megjegyezni, és azt hívogatni)

Ha valaki kíváncsi lenne erre az “elfedő” osztályra is, szóljon és közzéteszem.

Köszönet a prog.hu-nak és látogatóinak, mert sokat segített az oldal a megoldás megtalálásában!

Címkék: ,

Szerzô: ED

2 hozzászólás

Suszi
2009. január 26. hétfő

Nagyon örülök, hogy sikerült megoldani, és gratulálok hozzá :)

Edorn
2009. január 26. hétfő

Pár “belső” részen már használatban is van (pl ha érkezik új feltöltés, akkor kapok róla értesítő levelet). Ha minden jól megy, akkor hamarosan elkészül a privát üzenetküldő is, és akkor abba is be lesz építve.

Leave a comment