2012-08-28 20 views
5

Estoy tratando de enviar un mensaje HTML mientras uso la autenticación SMTP a Gmail en PHP. Aquí está el script que estoy usando:Enviar un mensaje HTML a través de PEAR mientras utilizo la autenticación SMTP devuelve un error

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>"); 
} 

Nota: la $body es una tabla HTML con imágenes y otra información.

Cuando ejecuto el guión falla con el siguiente error:

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

Esto es lo que he tratado de ver lo que está mal: 1. Utilizando la misma secuencia de comandos con 'Correo' en lugar de 'smtp' es decir

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

Esto funciona bien. 2. Usando la misma secuencia de comandos sin mime.php, esto también funciona, pero no permite que uno envíe un correo electrónico HTML.

¿Alguien sabe cómo puedo combinar los dos para que todavía esté usando autenticación SMTP y envíe un mensaje HTML?

EDIT: Aquí está el vertedero de $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

¿Se puede volcar '$ mime-> headers()' por favor? –

+0

Agregué el volcado a la publicación. Gracias. –

Respuesta

0

Me di cuenta finalmente.

Gracias a Abid Hussain para proporcionar el enlace a este ejemplo: http://tonyvirelli.com/slider/php-html-email-using-smtp/

Solución:

  1. Retire la 'Return-Path' => $from de la matriz cabeceras.
  2. Añadir To => $to a la matriz cabeceras (sin esto, la a encabezado del correo electrónico recibido es recipientes sin revelar)
2

Consulte la siguiente página Creo que es muy ayudar completo a usted.

How to send an HTML email using SMTP in PHP

dirección del servidor SMTP de Gmail es El SMTP.GOOGLEMAIL.COM no SMTP.GMAIL.COM.

lo tanto, su configuración debe ser:

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

ver otro ejemplo: -

envíe un HTML & texto sin formato de correo electrónico utiliza un servidor SMTP Con PHP & PERA

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

+0

googlemail.com es un alias de gmail.com, ambos dominios se pueden usar indistintamente. El enlace que brindó al final fue muy útil, así que le di la recompensa. ¡Gracias! –

+0

El cuadro de información sugerida para la búsqueda de Google recomienda utilizar gmail.com no googlemail.com: googlear "configuración de smtp de gmail" se muestra en un cuadro en la parte superior "Si se conecta usando SMTP, solo puede enviar correos a usuarios de Gmail o Google Apps; se conecta usando SSL/TLS, puede enviar correos a cualquier persona. Si su dispositivo o aplicación admite SSL, conéctese a smtp.gmail.com en el puerto 465. Para conectarse con SSL, debe proporcionar un nombre de usuario y una contraseña de Google para la autenticación. " – Breezer

1

Trate abrazar los nombres entre comillas, así:

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

probarlo y nos dicen al respecto.

actualización:
Ok, anteriormente no funcionó, por lo que sólo habría dirá lo que está funcionando para mí en mis páginas php para enviar correos electrónicos a través de SMTP de Gmail.

por lo basa en que se podía tratar de cambiar su configuración para:

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

se puede ver here cómo enviar correo a través de gmail con phpmailer.

+0

Gracias por la respuesta, pero esto arroja otro error: Error al establecer el remitente: "Some Name" - esta vez tiene las comillas dobles:/ –

+0

He actualizado mi respuesta, espero que la encuentre útil. – Nelson

+0

Gracias por la actualización, ya encontré la solución. (Ver a continuación) –

0

tuve este problema ya través de la depuración gestionadas para obtener todo tipo de errores (abajo). Lo más extraño es que dejó de funcionar por completo el 11/2/2017. No hice ninguna actualización. Anteriormente funcionaría aleatoriamente, así que puse en reintentos y siempre tuvo éxito < 5 intentos, hasta el 2do. Extraño.

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 

(y así sucesivamente)

Otra utilizarse publicado este paso de solución de problemas que me ayudó a más errores por lo que pude Google más de lo que podría ser la causa:

$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'; 
} 

Mi solución era agregar un archivo de paquete de CA, ya que aparentemente PHP no pudo verificar el certificado de Google:

  • Descargar CA paquete https://curl.haxx.se/docs/caextract.html & extracto a C: \ Archivos de programa \ PHP \ ssl \ cacert.pem
  • especificar la ubicación en php.ini: openssl.cafile = C: \ Archivos de programa \ PHP \ ssl \ cacert.pem
Cuestiones relacionadas