Ответ 1
У вас есть файл email.php в папке конфигурации? Возможно, там есть проблема с вашей конфигурацией.
Я пытаюсь отправить электронное письмо с помощью Codeigniter следующим образом:
$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();
и я получил это на отладчике электронной почты: Не удалось отправить электронное письмо с помощью PHP mail(). Возможно, ваш сервер не настроен на отправку почты с помощью этого метода.
Если я делаю простую функцию PHP mail() с теми же адресами, она работает, но когда я использую CodeIgniter, она дает мне ошибку. Итак, почему он будет работать с простой почтой(), но не с CodeIgniter? Любые идеи?
Спасибо.
У вас есть файл email.php в папке конфигурации? Возможно, там есть проблема с вашей конфигурацией.
Имел подобную проблему.
Этот рабочий код контроллера:
$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();
Ясно, что не существует окончательного ответа "один размер подходит всем". То, что сработало для меня, менялось
$config['protocol'] = 'smtp';
TO:
$config['protocol'] = 'mail';
Надеюсь, что это поможет...
Никто, казалось, действительно не нашел окончательного ответа, поэтому я немного погубил и узнал, почему.
в системе /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 приведет к тому, что почтовый класс будет работать или не работать.
Посмотрел Документ класса электронной почты с кодом 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, похоже, делает трюк.
Убедитесь, что имя домена в
$this->email->from("[email protected]**email.com**");
соответствует доменному имени сервера
Добавить переменную протокола в массив конфигурации и присвоить ей значение "sendmail". Файл email.php в папке config должен читаться, как показано ниже. Шахта работает следующим образом:
$config['protocol'] = 'sendmail';
$config['mailtype'] = 'html';
$config['charset'] = 'utf-8';
$config['newline'] = "\r\n";
Если бы та же проблема, Убедитесь, что ваш адрес "от" является допустимым адресом электронной почты.
Я прочитал комментарий в файле 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 - эта проблема!!!
У меня была такая же проблема, и, хотя мне сейчас кажется глупым, у меня были некоторые параметры конфигурационного массива, заглавные буквы, когда все они должны быть строчными:
было:
$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);
Fixed
$mail_config['smtp_host'] = 'mail.example.com';
$mail_config['smtp_port'] = '587';
$mail_config['smtp_user'] = '[email protected]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);
Это сработало для меня
$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.
Стоит сказать, что если вы находитесь в WAMP (Windows), вам нужно будет установить sendmail, иначе нет способа отправки SMTP по умолчанию. Я хотел использовать Gmail, но не мог, потому что механизм почтовых сообщений по умолчанию просто отсутствует.