CodeIgniter не может отправлять электронную почту с помощью PHP mail () - PullRequest
17 голосов
/ 05 октября 2010

Я пытаюсь отправить электронное письмо с Codeigniter следующим образом:

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

, и я получил это в отладчике электронной почты: Невозможно отправить электронную почту с помощью PHP mail ().Возможно, ваш сервер не настроен для отправки почты с использованием этого метода.

Если я выполняю простую функцию PHP mail () с теми же адресами, она работает, но когда я использую CodeIgniter, она выдает мне ошибку.Так почему бы это работать с простой mail (), а не с CodeIgniter?Есть идеи?

Спасибо.

Ответы [ 11 ]

15 голосов
/ 21 мая 2012

Была похожая проблема.

Это рабочий код с контроллера:

        $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();
12 голосов
/ 23 сентября 2015

Очевидно, что не существует однозначного ответа «один размер подходит всем».То, что работало для меня, менялось

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

TO:

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

Надеюсь, это поможет ...

8 голосов
/ 19 апреля 2013

Никто, похоже, действительно не нашел окончательного ответа, поэтому я немного покопался и выяснил, почему.

в system / library / Email.php, сначала посмотрим на строку 1552:

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

кажется, что все персиковое.У меня были точно такие же симптомы.Чтобы увидеть, сошел ли я с ума, я вставил непосредственно перед ...

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

, поэтому я удалил все заголовки и позволил PHP установить значения по умолчанию.Бинго!Без заголовков CI это работает.С заголовками CI это не так.Так что же это?

Еще покопавшись, я посмотрел, где инициализируется и используется html.Оказывается, он ничего не делает до 1046 года, когда он строит тело сообщения.

из строки 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;
}

Переключение send_multipart между TRUE и FALSE сделает класс почтыработает или не работает.

Просмотр документов класса Code Ignitor ничего не показывает.Переход к строке 52:

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

Итак, у вас это есть.Возможно ошибка в том, как CI делает составные сообщения?Скрытая настройка

$config['send_multipart'] = FALSE;

в email.php, похоже, помогает.

7 голосов
/ 05 октября 2010

У вас есть файл email.php в вашей папке конфигурации? Возможно, там проблема с вашей конфигурацией.

4 голосов
/ 25 мая 2013

Убедитесь, что имя домена в

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

соответствует имени домена сервера

4 голосов
/ 04 ноября 2011

Добавьте переменную протокола в массив конфигурации и присвойте ей значение «sendmail». Файл email.php в папке config должен выглядеть так, как показано ниже. Мой работает так:

$config['protocol'] = 'sendmail';
$config['mailtype'] = 'html';
$config['charset']  = 'utf-8';
$config['newline']  = "\r\n";
0 голосов
/ 30 августа 2017

Стоит сказать, что если вы работаете в WAMP (Windows), вам нужно будет установить sendmail, в противном случае SMTP-метод отправки по умолчанию отсутствует. Я хотел использовать Gmail, но не смог, потому что просто нет почтового механизма по умолчанию.

0 голосов
/ 09 февраля 2017
    $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 голосов
/ 05 июня 2016

У меня была та же проблема, и хотя сейчас она кажется мне глупой, некоторые параметры массива конфигурации были прописными, когда все они должны быть в нижнем регистре:

было:

$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);

Исправлено:

$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);

Это сработало для меня

0 голосов
/ 23 октября 2015

Прочитал комментарий в файле 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" - это проблема !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...