CodeIgniter no puede enviar correo electrónico usando PHP mail ()

Estoy intentando enviar un correo electrónico con Codeigniter así:

$this->load->library('email'); $this->email->from("myemail@email.com"); $this->email->reply_to("myemail@email.com"); $this->email->to("myemail@email.com"); $this->email->subject("Test mail"); $this->email->message("Email body"); $this->email->set_alt_message("Email body txt"); $this->email->send(); 

y obtuve esto en el depurador de correo electrónico: no se puede enviar correo electrónico usando PHP mail (). Es posible que su servidor no esté configurado para enviar correo utilizando este método.

Si hago una simple función PHP mail () con las mismas direcciones, funciona pero cuando uso CodeIgniter me da el error. Entonces, ¿por qué funciona con simple mail () pero no con CodeIgniter? Algunas ideas ?

Gracias.

¿Tienes un archivo email.php en tu carpeta config? Tal vez haya un problema con tu configuración allí.

Tenía un problema similar.

Eso es código de trabajo del controlador:

  $config = array(); $config['useragent'] = "CodeIgniter"; $config['mailpath'] = "/usr/bin/sendmail"; // or "/usr/sbin/sendmail" $config['protocol'] = "smtp"; $config['smtp_host'] = "localhost"; $config['smtp_port'] = "25"; $config['mailtype'] = 'html'; $config['charset'] = 'utf-8'; $config['newline'] = "\r\n"; $config['wordwrap'] = TRUE; $this->load->library('email'); $this->email->initialize($config); $this->email->from($fromEmail, $fromName); $this->email->to($email); $this->email->subject('Тест Email'); $this->email->message($this->load->view('email/'.$type.'-html', $data, TRUE)); $this->email->send(); 

Claramente, no parece haber una respuesta definitiva de “talla única”. Lo que funcionó para mí fue cambiar

 $config['protocol'] = 'smtp'; 

A:

 $config['protocol'] = 'mail'; 

Espero que esto ayude…

Nadie parecía realmente encontrar una respuesta definitiva, así que investigué un poco y descubrí por qué.

en system / libraries / Email.php, primero mira la línea 1552:

 if ( ! mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str, "-f ".$this->clean_email($this->_headers['From']))) 

parece enviar todo como peachy. Yo también tenía exactamente los mismos síntomas. Para ver si estaba loco, me inserté inmediatamente antes …

 mail($this->_recipients, $this->_subject, $this->_finalbody) 

así que básicamente eliminé todos los encabezados y dejé PHP poner los valores predeterminados. ¡Bingo! Sin los encabezados de CI, funciona. Con los encabezados de CI, no es así. ¿Así que qué es lo?

Investigando un poco más, miré hacia arriba donde html se inicializa y se usa. Resulta que realmente no hace nada hasta alrededor de 1046, donde construye el cuerpo del mensaje.

de la línea 1048:

 if ($this->send_multipart === FALSE) { $hdr .= "Content-Type: text/html; charset=" . $this->charset . $this->newline; $hdr .= "Content-Transfer-Encoding: quoted-printable"; } else { $hdr .= "Content-Type: multipart/alternative; boundary=\"" . $this->_alt_boundary . "\"" . $this->newline . $this->newline; $body .= $this->_get_mime_message() . $this->newline . $this->newline; $body .= "--" . $this->_alt_boundary . $this->newline; $body .= "Content-Type: text/plain; charset=" . $this->charset . $this->newline; $body .= "Content-Transfer-Encoding: " . $this->_get_encoding() . $this->newline . $this->newline; $body .= $this->_get_alt_message() . $this->newline . $this->newline . "--" . $this->_alt_boundary . $this->newline; $body .= "Content-Type: text/html; charset=" . $this->charset . $this->newline; $body .= "Content-Transfer-Encoding: quoted-printable" . $this->newline . $this->newline; } 

Al pasar send_multipart entre TRUE y FALSE, la clase de correo funcionará o no funcionará.

Revisó los documentos de la clase de correo electrónico de Code Ignitor y no revela nada. Ir a la línea 52:

 var $send_multipart = TRUE; // TRUE/FALSE - Yahoo does not like multipart alternative, so this is an override. Set to FALSE for Yahoo. 

Entonces ahí lo tienes. ¿Posiblemente un error en la forma en que CI hace mensajes multiparte? La preferencia de configuración oculta

 $config['send_multipart'] = FALSE; 

en el correo electrónico.php parece hacer el truco.

Agregue una variable de protocolo a la matriz de configuración y asígnele el valor “sendmail”. El archivo email.php en la carpeta config debe leer como se muestra a continuación. El mío funciona así:

 $config['protocol'] = 'sendmail'; $config['mailtype'] = 'html'; $config['charset'] = 'utf-8'; $config['newline'] = "\r\n"; 

Asegúrate de que el nombre de dominio esté

 $this->email->from("myemail@**email.com**"); 

coincidencia con el nombre de dominio del servidor

Tuvo el mismo problema: asegúrese de que su dirección “de” sea válida.

Leí un comentario en el archivo email.php:

 // most documentation of sendmail using the "-f" flag lacks a space after it, however // we've encountered servers that seem to require it to be in place. return mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str, '-f '.$this->clean_email($this->_headers['Return-Path'])); 

“-f” flag – ¡este problema!

Tuve el mismo problema y aunque ahora me parece tonto, tenía algunas de las opciones de arreglo de configuración en mayúsculas cuando todas tienen que estar en minúscula:

estaba:

 $mail_config['smtp_host'] = 'mail.example.com'; $mail_config['smtp_port'] = '587'; $mail_config['smtp_user'] = 'email@example.com'; $mail_config['smtp_pass'] = 'password'; $mail_config['smtp_crypto'] = 'TLS'; //ERROR $mail_config['protocol'] = 'SMTP'; //ERROR $mail_config['mailtype'] = 'HTML'; //ERROR $mail_config['send_multipart'] = FALSE; $this->email->initialize($mail_config); 

Fijo:

 $mail_config['smtp_host'] = 'mail.example.com'; $mail_config['smtp_port'] = '587'; $mail_config['smtp_user'] = 'email@example.com'; $mail_config['smtp_pass'] = 'password'; $mail_config['smtp_crypto'] = 'tls'; //FIXED $mail_config['protocol'] = 'smtp'; //FIXED $mail_config['mailtype'] = 'html'; //FIXED $mail_config['send_multipart'] = FALSE; $this->email->initialize($mail_config); 

Eso funcionó para mí

  $config = Array( 'protocol' => 'smtp', 'smtp_host' => 'ssl://smtp.googlemail.com', 'smtp_port' => 465, 'smtp_user' => 'email', 'smtp_pass' => 'pass', 'mailtype' => 'html', 'charset' => 'iso-8859-1' ); $this->load->library('email',$config); **$this->email->set_newline("\r\n");** < - add this line this code worked for me. 

Vale la pena decir que si estás en WAMP (Windows) necesitarás tener instalado sendmail, de lo contrario no hay un método de envío SMTP predeterminado. Quería usar Gmail pero no pude porque simplemente no hay un mecanismo de correo predeterminado.