web-dev-qa-db-fra.com

CodeIgniter impossible d'envoyer un courrier électronique à l'aide de PHP courrier()

J'essaie d'envoyer un e-mail avec Codeigniter comme ceci:

$this->load->library('email');

$this->email->from("[email protected]");
$this->email->reply_to("[email protected]");
$this->email->to("[email protected]");
$this->email->subject("Test mail");
$this->email->message("Email body");
$this->email->set_alt_message("Email body txt");
$this->email->send();

et j'ai eu ceci sur le débogueur d'email: Impossible d'envoyer un email en utilisant PHP mail (). Votre serveur n'est peut-être pas configuré pour envoyer des messages à l'aide de cette méthode.

Si je fais simple PHP mail () fonction avec les mêmes adresses, cela fonctionne mais quand j'utilise CodeIgniter il me donne l'erreur. Alors, pourquoi cela fonctionnerait-il avec mail simple () mais pas avec CodeIgniter? Des idées ?

Merci.

17
Manny Calavera

Avez-vous un fichier email.php dans votre dossier de configuration? Peut-être y at-il un problème avec votre configuration ici.

7
mseo

Avait un problème similaire.

C'est le code de travail du contrôleur: 

        $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();
15
Fedir RYKHTIK

De toute évidence, il ne semble pas y avoir de réponse définitive «one size fits all». Ce qui a fonctionné pour moi était en train de changer

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

À:

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

J'espère que cela t'aides...

12
mc_kaiser

Personne ne semblait vraiment trouver une réponse définitive, alors j'ai fait des recherches et découvert pourquoi.

dans system/libraries/Email.php, commencez par regarder la ligne 1552:

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

il semble envoyer tout comme pêche. J'ai eu exactement les mêmes symptômes aussi. Pour voir si j'étais fou, j'ai inséré immédiatement avant ...

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

j'ai donc essentiellement supprimé tous les en-têtes et laissé PHP définir les valeurs par défaut. Bingo! Sans les en-têtes de CI, cela fonctionne. Avec les en-têtes CI, ça ne marche pas. Alors c'est quoi?

En cherchant un peu plus, j'ai cherché où le HTML était initialisé et utilisé. Il s'avère qu'il ne fait vraiment rien avant 10h46 environ, ce qui construit le corps du message.

à partir de la ligne 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;
}

En basculant send_multipart entre TRUE et FALSE, la classe mail fonctionnera ou ne fonctionnera pas.

Les documents de classe d'email de l'igniteur Code Ignitor ne révèlent rien. Aller à la ligne 52:

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

Donc là vous l'avez. Peut-être une erreur dans la façon dont CI communique les messages en plusieurs parties? La préférence de configuration cachée

$config['send_multipart'] = FALSE;

dans l'email.php semble faire l'affaire.

8
pxl

Ajoutez une variable de protocole au tableau de configuration et attribuez-lui la valeur "sendmail". Le fichier email.php du dossier config devrait se lire comme indiqué ci-dessous. Le mien fonctionne comme ceci:

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

Assurez-vous que le nom de domaine est dans

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

correspond au nom de domaine du serveur

4
Roma Dov

J'ai lu un commentaire dans le fichier 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 - ce problème !!!

0
MrM
    $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.
0
user7374090

Cela vaut la peine de dire que si vous utilisez WAMP (Windows), vous devez installer sendmail, sinon il n’existe pas de méthode d’envoi SMTP par défaut. Je voulais utiliser Gmail mais je ne pouvais pas le faire, car il n’existait tout simplement pas de mécanisme de messagerie par défaut.

0
Antony

J'ai eu le même problème et bien que cela me semble idiot maintenant, certaines des options du tableau de configuration ont été capitalisées lorsqu'elles doivent toutes être en minuscules:

était:

$mail_config['smtp_Host'] = 'mail.example.com';
$mail_config['smtp_port'] = '587';
$mail_config['smtp_user'] = '[email protected]';
$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);

Fixé:

$mail_config['smtp_Host'] = 'mail.example.com';
$mail_config['smtp_port'] = '587';
$mail_config['smtp_user'] = '[email protected]';
$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);

Cela a fonctionné pour moi

0
OGZStudio

Avait le même problème, Assurez-vous que votre adresse "de" est une adresse email valide.

0
Oren Yakobi