Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wysyłanie emaila + obsługa SSL
Forum PHP.pl > Forum > PHP
Jarod
Napisałem sobie klasę do wysyłania emaili tekstowych. Wszystko pięknie działa, problem w tym, że jeśli serwer wymaga SSL (np. gmail) to nie działa. Przegrzebałem forum, google i nigdzie nie mogę znaleźć info, w którym miejscu popełniam błąd.
Może ktoś coś będzie mógł doradzić.

Metoda nawiązująca połączenie z serwerem i wysyłająca maila.
  1. <?php
  2. /**
  3.  * Metoda wysyłająca wiadomość email.
  4.  * 
  5.  * @return bool
  6.  */
  7. public function sendEmail()
  8. {
  9. if (!empty($this->sSmtpServer))
  10. {
  11. if ($rSmtpConnect = @fsockopen($this->sSmtpServer, $this->iPort, $iErrNo, $sErrStr, self::TimeOut))
  12. {
  13. $this->aSmtpResponse[] = @fgets($rSmtpConnect, 4096);
  14.  
  15. @fputs($rSmtpConnect, "HELO " . self::Host . self::NewLine);
  16. $this->aSmtpResponse[] = @fgets($rSmtpConnect, 4096);
  17.  
  18. if ($this->bTLSSession)
  19. {
  20. @fputs($rSmtpConnect, "STARTTLS" . self::NewLine);
  21. $this->aSmtpResponse[] = @fgets($rSmtpConnect, 4096);
  22.  
  23. @fputs($rSmtpConnect, "HELO " . self::Host . self::NewLine);
  24. $this->aSmtpResponse[] = @fgets($rSmtpConnect, 4096);
  25. }
  26.  
  27. @fputs($rSmtpConnect, "AUTH LOGIN" . self::NewLine);
  28. $this->aSmtpResponse[] = @fgets($rSmtpConnect, 4096);
  29.  
  30. @fputs($rSmtpConnect, base64_encode($this->sUsername) . self::NewLine);
  31. $this->aSmtpResponse[] = @fgets($rSmtpConnect, 4096);
  32.  
  33. @fputs($rSmtpConnect, base64_encode($this->sPassword) . self::NewLine);
  34. $this->aSmtpResponse[] = @fgets($rSmtpConnect, 4096);
  35.  
  36. @fputs($rSmtpConnect, "MAIL FROM: " . $this->sFrom . self::NewLine);
  37. $this->aSmtpResponse[] = @fgets($rSmtpConnect, 4096);
  38.  
  39. @fputs($rSmtpConnect, "RCPT TO: " . $this->sTo . self::NewLine);
  40. $this->aSmtpResponse[] = @fgets($rSmtpConnect, 4096);
  41.  
  42. @fputs($rSmtpConnect, "DATA" . self::NewLine);
  43. $this->aSmtpResponse[] = @fgets($rSmtpConnect, 4096);
  44.  
  45. @fputs($rSmtpConnect, $this->sHeaders . self::NewLine);
  46. @fputs($rSmtpConnect, $this->sBody . self::NewLine);
  47. @fputs($rSmtpConnect, "." . self::NewLine);
  48. $this->aSmtpResponse[] = @fgets($rSmtpConnect, 4096);
  49.  
  50. @fputs($rSmtpConnect, "QUIT" . self::NewLine);
  51. $this->aSmtpResponse[] = @fgets($rSmtpConnect, 4096);
  52. $bResult = substr($this->aSmtpResponse[9], 0, 3) == '221';
  53. @fclose($rSmtpConnect);
  54.  
  55. return $bResult;
  56. }
  57.  
  58. return false;
  59. }
  60. else throw new MailerException('Nie ustawiono parametrów połączeniowych z serwerem !');
  61. }
  62. ?>
Kocurro
Hmm ... a proszę powiedz mi w którym miejscu w swoim kodzie obsługujesz komunikację poprzez SSL ? W którym miejscu wysyłasz certyfikat ? Może tam masz błąd ?
Jarod
Cała komunikacja od nawiązania połączenia z serwerem do zamknięcia połączenia to ta metoda. Opierałem się na info, które znalazłem na jednej z kilku stron. Serwer zwraca komunikat, że można nawiązać połączenie TLS, po tym jak przejdę przez STARTTLS i na tym się zatrzymuje....

Niestety z rfc nic pożytecznego nie wyczytałem albo źle czytam..
Kocurro
Oki już mówię smile.gif

Po podaniu STARTTLS komunikacja dalej opiera się na skomunikowaniu bezpiecznego kanału i dopiero potem tym bezpiecznym kanałem wysyłasz resztę poleceń. Musisz poszukać w sieci jak z tego skorzystać - ja niestety nie potrafię Ci pomóc sad.gif nigdy nie starałem się ręcznie obsłużyć komunikacji SSL i TLS ... pewnie gdzieś są jakieś gotowe komponenty itp. ale nie mam pojęcia.

Jak coś znajdę to dam znać - w każdym bądź razie nie jest to łatwa robota.

EDIT:

Looknij tutaj:

http://forums.powweb.com/showthread.php?t=73406

Chyba mają gotowe rozwiązanie - nie mogę teraz doczytać w pełni bo muszę wracać do pracy.

pozdr.
Jarod
Cytat(Kocurro @ 20.02.2008, 14:33:12 ) *
Oki już mówię smile.gif

Po podaniu STARTTLS komunikacja dalej opiera się na skomunikowaniu bezpiecznego kanału i dopiero potem tym bezpiecznym kanałem wysyłasz resztę poleceń. Musisz poszukać w sieci jak z tego skorzystać - ja niestety nie potrafię Ci pomóc sad.gif nigdy nie starałem się ręcznie obsłużyć komunikacji SSL i TLS ... pewnie gdzieś są jakieś gotowe komponenty itp. ale nie mam pojęcia.

Jak coś znajdę to dam znać - w każdym bądź razie nie jest to łatwa robota.

Będę bardzo wdzięczny...

Cytat(Kocurro @ 20.02.2008, 14:33:12 ) *
EDIT:

Looknij tutaj:

http://forums.powweb.com/showthread.php?t=73406

Chyba mają gotowe rozwiązanie - nie mogę teraz doczytać w pełni bo muszę wracać do pracy.

pozdr.

Sprawdzę wieczorem. Obsługa zwykłego TLS nie jest trudna bo kod, który podałem działa. Problem tylko z SSL.
Odezwę się. Thx

Niestety sprawdziłem ten kod. Nie działa. W sumie to koleś nie napisał niczego czego ja nie napisałem.

Jedyna różnica to używa fwrite zamiast fputs a
  1. <?php
  2. stream_socket_enable_crypto( $smtp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT );
  3. ?>

zgłasza błąd.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.