【问题标题】:Send email codeigniter function returns "Recipient address rejected: Domain not found" instead of false发送电子邮件 codeigniter 函数返回“收件人地址被拒绝:未找到域”而不是 false
【发布时间】:2012-05-31 15:15:43
【问题描述】:

我正在使用 codeigniter。我测试将电子邮件发送到错误的不存在地址,例如 t@t.com。

我的代码只是控制器的一种方法:

function test() {
    $this->email->from('mymail@gmail.com');
    $this->email->to(htmlentities("t@t.com"));
    $this->email->subject('test');
    $this->email->message("Just a test !");     

    $r = $this->email->send();      
    if (!$r)
        echo "not sent, wrong email";
    else
        echo "sent";
}

基本上,send() 函数返回 true 或 false。但它不起作用!我得到的错误信息如下:

    A PHP Error was encountered

    Severity: Warning

    Message: mail() [function.mail]: SMTP server response: 550 5.1.2 <t@t.com>: Recipient address rejected: Domain not found

    Filename: libraries/Email.php

    Line Number: 1540

not sent, wrong email

我有消息,所以 send() 函数回复 false,但我也有错误消息,这是我不想要的!

这是一个阻塞点。任何人都知道为什么 send() 函数不返回 true 或 false 回复?

提前致谢!

【问题讨论】:

    标签: email codeigniter error-handling


    【解决方案1】:

    摆脱错误的快速而肮脏的技巧是在邮件功能前加上'@':

    $r = @$this->email->send();   
    

    【讨论】:

    • 在函数调用前添加“@”可禁用可能显示的任何错误。这被认为是不好的做法,因为它可以隐藏重要的错误 + 从性能的角度来看它很慢
    • 好的。谢谢。我只会将它用于本地开发,不会在 preprod 和 prod 环境中使用它。
    • 我在我的 preprod 上测试了它(没有@),即使收件人邮件不存在,send() 函数的答案也总是正确的。有没有办法知道电子邮件无效?
    • 使用 smtp 当电子邮件地址不存在时,您不会收到错误消息。如果电子邮件具有有效的语法 xxx@xxx.xxx 并且代码设法通过套接字推送邮件而没有错误,则认为它是成功的。发送代码只负责将消息发送到 smtp 服务器,仅此而已。
    • 如果您想在电子邮件发送到 smtp 服务器后检查其状态,您需要创建一个脚本,连接到与您拥有的帐户相关的 imap 或 pop3 服务器发送电子邮件(例如:noreply@email.com)并检查发送失败通知
    【解决方案2】:

    我已经尝试过了,它可以正常工作,我收到:未发送,错误的电子邮件。

    您使用的是哪个版本的 CI?确保它是最后一个。

    以防万一,请检查 CI 文件夹中 system/libraries 下的 Email.php

    protected function _send_with_mail()
    {
        if ($this->_safe_mode == TRUE)
        {
            if ( ! mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str))
            {
                return FALSE;
            }
            else
            {
                return TRUE;
            }
        }
        else
        {
            // 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.
    
            if ( ! mail($this->_recipients, $this->_subject, $this->_finalbody, $this->_header_str, "-f ".$this->clean_email($this->_headers['From'])))
            {
                return FALSE;
            }
            else
            {
                return TRUE;
            }
        }
    }
    

    检查里面的函数_send_with_mail()和上面的一模一样

    【讨论】:

    • 感谢您的回复。我检查了这个功能,它完全一样。我使用的是 CI 2.0.3,所以不是最后一个,目前是 2.1.0。我不明白为什么它对你有用,而不是对我......
    • 你试过去掉双引号和 htmlentities 函数吗?像这样:$this->email->to('t@t.com');
    • 我删除了双引号,它不起作用。所以,我删除了 htmlentities,它不起作用。对我来说更准确地说,我有“未发送”消息,但在收到之前,我有上面的错误消息。
    • 当您向有效且存在的地址发送电子邮件时会发生什么?您是否也收到错误消息,还是已发送?如果它不起作用,则可能是服务器错误,在这种情况下,您应该联系您的管理员。看看 apache 的错误日志(如果可以的话)
    • 当我发送到有效的电子邮件地址时,它可以完美运行。我在 apache 日志中看不到任何内容...我考虑过服务器,但由于它适用于有效的电子邮件地址,我认为我不会那样
    猜你喜欢
    • 2016-02-09
    • 2014-03-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多