CodeIgniter无法使用PHP邮件发送电子邮件()

时间:2010-10-04 23:41:47

标签: email codeigniter

我正在尝试发送一封带有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呢?有什么想法吗?

感谢。

12 个答案:

答案 0 :(得分:15)

有类似的问题。

这是来自控制器的工作代码:

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

答案 1 :(得分:12)

显然,似乎没有一个明确的“一个尺寸适合所有人”'回答。对我有用的是改变

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

TO:

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

希望这会有所帮助......

答案 2 :(得分:8)

似乎没有人真正找到明确的答案,所以我做了一些挖掘并发现原因。

在system / libraries / 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;
}

在TRUE和FALSE之间翻转send_multipart将使邮件类工作或不工作。

通过Code Ignitor's email class docs看不透露任何东西。转到第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中的

似乎可以解决问题。

答案 3 :(得分:7)

您的配置文件夹中是否有email.php文件?也许你的配置存在问题。

答案 4 :(得分:4)

将协议变量添加到配置数组并为其分配值“sendmail”。 config文件夹中的email.php文件应如下所示。我的工作方式如下:

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

答案 5 :(得分:4)

确保

中的域名
$this->email->from("myemail@**email.com**");

与服务器域名匹配

答案 6 :(得分:1)

确保Apache可以发送电子邮件。

要检查您当前的sendmail状态: sestatus -b | grep httpd_can_sendmail

如果关闭,则将其更改为此: sudo setsebool -P httpd_can_sendmail on

答案 7 :(得分:0)

有同样的问题, 确保您的“发件人”地址是有效的电子邮件地址。

答案 8 :(得分:0)

我在文件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"国旗 - 这个问题!!!

答案 9 :(得分:0)

我遇到了同样的问题,虽然现在看起来很傻,但是当我们需要小写的时候,我有一些配置数组选项大写:

是:

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

这对我有用

答案 10 :(得分:0)

    $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.

答案 11 :(得分:0)

值得一提的是,如果您使用WAMP(Windows),则需要安装sendmail,否则没有默认的SMTP发送方法。我想使用Gmail但不能,因为根本就没有默认邮件机制。