2012-08-28 18 views
5

Próbuję wysłać wiadomość HTML podczas korzystania z uwierzytelniania SMTP do Gmaila w PHP. Oto skrypt, który używam:Wysyłanie wiadomości HTML za pośrednictwem PEAR podczas korzystania z uwierzytelniania SMTP zwraca błąd

require_once "Mail.php"; 
require_once 'Mail/mime.php'; 

$from = "Some Name <[email protected]>"; 
$to = "Other Name <[email protected]>"; 
$subject = "This is a test"; 
$crlf = "\n"; 

$host = "ssl://smtp.gmail.com"; 
$port = "465"; 
$username = "[email protected]"; 
$password = "mypass"; 

$headers = array ('From' => $from, 
        'Return-Path' => $from, 
        'Subject' => $subject); 

$smtp = Mail::factory('smtp', 
    array ('host' => $host, 
    'port' => $port, 
    'auth' => true, 
    'username' => $username, 
    'password' => $password)); 

$mime = new Mail_mime($crlf); 
$mime->setTXTBody("This is a test email message"); 
$mime->setHTMLBody($body); 
$body = $mime->get(); 
$headers = $mime->headers($headers); 

$mail = $smtp->send($to, $headers, $body); 

if (PEAR::isError($mail)) { 
    echo("<p>" . $mail->getMessage() . "</p>"); 
} else { 
    echo("<p>Message successfully sent!</p>"); 
} 

Uwaga:$body jest tabela HTML z obrazami i innych informacji.

Kiedy wykonać skrypt nie powiedzie się z powodu następującego błędu:

Failed to set sender: Some name [SMTP: Invalid response code received from server (code: 555, response: 5.5.2 Syntax error. c6sm20541406obd.22)]

Oto, co starałem się zobaczyć, co się dzieje źle: 1. Stosując ten sam skrypt, używając „poczta” zamiast "smtp", tj.

$smtp = Mail::factory('Mail'); 

Działa to dobrze. 2. Korzystanie z tego samego skryptu bez/z mime.php, to również działa, ale nie pozwala na wysyłanie wiadomości e-mail w formacie HTML.

Czy ktoś wie, jak połączyć te dwa elementy, aby nadal korzystać z uwierzytelniania SMTP: i wysłać wiadomość HTML?

EDIT: Oto zrzut $mime->headers():

[MIME-Version] => 1.0 
[From] => Some Name 
[Return-Path] => Some Name 
[Subject] => This is a test 
[Content-Type] => multipart/alternative; 
boundary="=_8662996a1f586248545d9f01f48e916d" 
+0

Czy możesz zrzucić '$ mime-> nagłówki()' proszę? –

+0

Dodałem zrzut do posta. Dzięki. –

Odpowiedz

0

W końcu sam się o tym dowiedziałem.

Dzięki Abid Hussain za dostarczenie link do przykładu tutaj: http://tonyvirelli.com/slider/php-html-email-using-smtp/

rozwiązanie:

  1. Zdjąć 'Return-Path' => $from z tablicy nagłówków.
  2. Dodaj To => $to do tablicy nagłówków (bez tego, do nagłówka odebranej wiadomości e-mail jest nieujawnionego adresata)
2

Zobacz poniższy adres URL Myślę, że to bardzo pomaga w całości do ciebie.

How to send an HTML email using SMTP in PHP

adres serwera SMTP gmail jest SMTP.GOOGLEMAIL.COM nie SMTP.GMAIL.COM.

Dlatego Twoje ustawienia powinny być:

// ... 
$smtp=array(); 
$smtp['host']='ssl://smtp.googlemail.com'; 

Zobacz kolejny przykład: -

Wyślij HTML & zwykły tekst e-mail korzysta z serwera SMTP W PHP & PEAR

http://tonyvirelli.com/slider/php-html-email-using-smtp/

+0

googlemail.com to alias witryny gmail.com obie domeny mogą być używane zamiennie. Link, który podałeś pod koniec, był bardzo przydatny, więc dałem ci nagrodę. Dzięki! –

+0

Sugerowane pole wyszukiwania Google zaleca korzystanie z gmail.com, a nie z witryny googlemail.com: wyświetla się komunikat "Ustawienia Gmaila" w polu na górze "Jeśli łączysz się przy użyciu SMTP, możesz wysyłać pocztę tylko do użytkowników Gmaila lub Google Apps. łączysz się za pomocą SSL/TLS, możesz wysyłać pocztę do każdego .Jeśli twoje urządzenie lub aplikacja obsługuje SSL - połącz się z smtp.gmail.com na porcie 465. Aby połączyć się z SSL, musisz podać nazwę użytkownika i hasło do uwierzytelniania. " – Breezer

1

Spróbuj obejmując nazwy w cudzysłowach, jak w przykładzie:

$from = '"Some Name" <[email protected]>'; 
$to = '"Other Name" <[email protected]>'; 

spróbuj i powiedz nam o tym.

Aktualizacja:
Ok, powyżej nie działa, więc po prostu powie ci, co działa na mnie w moich stronach PHP do wysyłania wiadomości e-mail przez smtp gmail.

więc na tej podstawie można spróbować zmienić config:

$host = "tls://smtp.gmail.com"; 
$port = "587"; 

widać here jak wysyłać pocztę za pośrednictwem Gmaila z phpmailerem.

+0

Dzięki za odpowiedź, ale to zwraca inny błąd: Nie udało się ustawić nadawcy: "Some Name" - tym razem ma podwójne cytaty:/ –

+0

Zaktualizowałem swoją odpowiedź, mam nadzieję, że okaże się ona przydatna. – Nelson

+0

Dzięki za aktualizację, już znalazłem rozwiązanie (patrz poniżej) –

0

miałem ten problem i przez debugowania udało się uzyskać wszystkie rodzaje różnych błędów (poniżej). Najdziwniejsze jest to, że całkowicie przestał działać około 11/2/2017. Nie robiłem żadnych aktualizacji. Wcześniej losowo działał, więc wróciłem i zawsze udało się < 5 prób, aż do 2. Dziwne.

Failed to connect to ssl://smtp.gmail.com:465 [SMTP: Invalid response code received from server (code: -1, response:)] 
fsockopen(): Failed to enable crypto 
fsockopen(): unable to connect to ssl://smtp.gmail.com:465 (Unknown error) 
SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed 

(i tak dalej)

Innym wykorzystywane pisał ten krok rozwiązywania problemów, który pomógł mi dostać więcej błędów więc mogłem Google więcej, co może być przyczyną:

$result = fsockopen('ssl://smtp.gmail.com', 465, $error_no, 
$error_message, 5);  
if($result === false) {   
    echo "error no: 
$error_no error message: $error_message";  echo print_r($result,true);  
}else{  
    echo 'success\n\n'; 
} 

Moja poprawka było dodanie pliku pakunku CA, ponieważ apparantly PHP nie może zweryfikować certyfikatu Google:

  • Pobierz CA wiązka https://curl.haxx.se/docs/caextract.html & wyciąg do C: \ Program Files \ PHP \ ssl \ cacert.pem
  • Określ lokalizację w php.ini: openssl.cafile = C: \ Program Files \ PHP \ ssl \ cacert.pem
Powiązane problemy