mail.php第153行上的OpenCart邮件错误

时间:2014-05-01 03:19:53

标签: php email smtp opencart

我在尝试使用社交媒体捆绑插件进行注册时,在我的OpenCart网站上收到此错误:

  

警告:fsockopen():php_network_getaddresses:getaddrinfo failed:第153行/home/wankersh/public_html/system/library/mail.php中未知的名称或服务警告:fsockopen():无法连接到pds14.servikus。 com:465(php_network_getaddresses:getaddrinfo失败:名称或服务未知)位于第153行的/home/wankersh/public_html/system/library/mail.php注意:错误:php_network_getaddresses:getaddrinfo failed:名称或服务未知(0)in第156行/home/wankersh/public_html/system/library/mail.php

这是来自mail.php的代码:

<?php

class Mail {

    protected $to;

    protected $from;

    protected $sender;

    protected $subject;

    protected $text;

    protected $html;

    protected $attachments = array();

    public $protocol = 'mail';

    public $hostname;

    public $username;

    public $password;

    public $port = 25;

    public $timeout = 5;

    public $newline = "\n";

    public $crlf = "\r\n";

    public $verp = false;

    public $parameter = '';



    public function setTo($to) {

        $this->to = $to;

    }



    public function setFrom($from) {

        $this->from = $from;

    }



    public function setSender($sender) {

        $this->sender = $sender;

    }



    public function setSubject($subject) {

        $this->subject = $subject;

    }



    public function setText($text) {

        $this->text = $text;

    }



    public function setHtml($html) {

        $this->html = $html;

    }



    public function addAttachment($filename) {

        $this->attachments[] = $filename;

    }



    public function send() {

        if (!$this->to) {

            trigger_error('Error: E-Mail to required!');

            exit();         

        }



        if (!$this->from) {

            trigger_error('Error: E-Mail from required!');

            exit();                 

        }



        if (!$this->sender) {

            trigger_error('Error: E-Mail sender required!');

            exit();                 

        }



        if (!$this->subject) {

            trigger_error('Error: E-Mail subject required!');

            exit();                 

        }



        if ((!$this->text) && (!$this->html)) {

            trigger_error('Error: E-Mail message required!');

            exit();                 

        }



        if (is_array($this->to)) {

            $to = implode(',', $this->to);

        } else {

            $to = $this->to;

        }



        $boundary = '----=_NextPart_' . md5(time());



        $header = '';



        $header .= 'MIME-Version: 1.0' . $this->newline;



        if ($this->protocol != 'mail') {

            $header .= 'To: ' . $to . $this->newline;

            $header .= 'Subject: ' . $this->subject . $this->newline;

        }



        $header .= 'Date: ' . date('D, d M Y H:i:s O') . $this->newline;

        $header .= 'From: ' . '=?UTF-8?B?' . base64_encode($this->sender) . '?=' . ' <' . $this->from . '>' . $this->newline;

        $header .= 'Reply-To: ' . '=?UTF-8?B?' . base64_encode($this->sender) . '?=' . ' <' . $this->from . '>' . $this->newline;

        $header .= 'Return-Path: ' . $this->from . $this->newline;

        $header .= 'X-Mailer: PHP/' . phpversion() . $this->newline;

        $header .= 'Content-Type: multipart/related; boundary="' . $boundary . '"' . $this->newline . $this->newline;



        if (!$this->html) {

            $message  = '--' . $boundary . $this->newline;

            $message .= 'Content-Type: text/plain; charset="utf-8"' . $this->newline;

            $message .= 'Content-Transfer-Encoding: 8bit' . $this->newline . $this->newline;

            $message .= $this->text . $this->newline;

        } else {

            $message  = '--' . $boundary . $this->newline;

            $message .= 'Content-Type: multipart/alternative; boundary="' . $boundary . '_alt"' . $this->newline . $this->newline;

            $message .= '--' . $boundary . '_alt' . $this->newline;

            $message .= 'Content-Type: text/plain; charset="utf-8"' . $this->newline;

            $message .= 'Content-Transfer-Encoding: 8bit' . $this->newline . $this->newline;



            if ($this->text) {

                $message .= $this->text . $this->newline;

            } else {

                $message .= 'This is a HTML email and your email client software does not support HTML email!' . $this->newline;

            }



            $message .= '--' . $boundary . '_alt' . $this->newline;

            $message .= 'Content-Type: text/html; charset="utf-8"' . $this->newline;

            $message .= 'Content-Transfer-Encoding: 8bit' . $this->newline . $this->newline;

            $message .= $this->html . $this->newline;

            $message .= '--' . $boundary . '_alt--' . $this->newline;

        }



        foreach ($this->attachments as $attachment) {

            if (file_exists($attachment)) {

                $handle = fopen($attachment, 'r');



                $content = fread($handle, filesize($attachment));



                fclose($handle);



                $message .= '--' . $boundary . $this->newline;

                $message .= 'Content-Type: application/octet-stream; name="' . basename($attachment) . '"' . $this->newline;

                $message .= 'Content-Transfer-Encoding: base64' . $this->newline;

                $message .= 'Content-Disposition: attachment; filename="' . basename($attachment) . '"' . $this->newline;

                $message .= 'Content-ID: <' . basename(urlencode($attachment)) . '>' . $this->newline;

                $message .= 'X-Attachment-Id: ' . basename(urlencode($attachment)) . $this->newline . $this->newline;

                $message .= chunk_split(base64_encode($content));

            }

        }



        $message .= '--' . $boundary . '--' . $this->newline;



        if ($this->protocol == 'mail') {

            ini_set('sendmail_from', $this->from);



            if ($this->parameter) {

                mail($to, '=?UTF-8?B?' . base64_encode($this->subject) . '?=', $message, $header, $this->parameter);

            } else {

                mail($to, '=?UTF-8?B?' . base64_encode($this->subject) . '?=', $message, $header);

            }

        } elseif ($this->protocol == 'smtp') {

            $handle = fsockopen($this->hostname, $this->port, $errno, $errstr, $this->timeout);



            if (!$handle) {

                trigger_error('Error: ' . $errstr . ' (' . $errno . ')');

                exit();                 

            } else {

                if (substr(PHP_OS, 0, 3) != 'WIN') {

                    socket_set_timeout($handle, $this->timeout, 0);

                }



                while ($line = fgets($handle, 515)) {

                    if (substr($line, 3, 1) == ' ') {

                        break;

                    }

                }



                if (substr($this->hostname, 0, 3) == 'tls') {

                    fputs($handle, 'STARTTLS' . $this->crlf);



                    while ($line = fgets($handle, 515)) {

                        $reply .= $line;



                        if (substr($line, 3, 1) == ' ') {

                            break;

                        }

                    }



                    if (substr($reply, 0, 3) != 220) {

                        trigger_error('Error: STARTTLS not accepted from server!');

                        exit();                             

                    }

                }



                if (!empty($this->username)  && !empty($this->password)) {

                    fputs($handle, 'EHLO ' . getenv('SERVER_NAME') . $this->crlf);



                    $reply = '';



                    while ($line = fgets($handle, 515)) {

                        $reply .= $line;



                        if (substr($line, 3, 1) == ' ') {

                            break;

                        }

                    }



                    if (substr($reply, 0, 3) != 250) {

                        trigger_error('Error: EHLO not accepted from server!');

                        exit();                             

                    }



                    fputs($handle, 'AUTH LOGIN' . $this->crlf);



                    $reply = '';



                    while ($line = fgets($handle, 515)) {

                        $reply .= $line;



                        if (substr($line, 3, 1) == ' ') {

                            break;

                        }

                    }



                    if (substr($reply, 0, 3) != 334) {

                        trigger_error('Error: AUTH LOGIN not accepted from server!');

                        exit();                     

                    }



                    fputs($handle, base64_encode($this->username) . $this->crlf);



                    $reply = '';



                    while ($line = fgets($handle, 515)) {

                        $reply .= $line;



                        if (substr($line, 3, 1) == ' ') {

                            break;

                        }

                    }



                    if (substr($reply, 0, 3) != 334) {

                        trigger_error('Error: Username not accepted from server!');

                        exit();                             

                    }



                    fputs($handle, base64_encode($this->password) . $this->crlf);



                    $reply = '';



                    while ($line = fgets($handle, 515)) {

                        $reply .= $line;



                        if (substr($line, 3, 1) == ' ') {

                            break;

                        }

                    }



                    if (substr($reply, 0, 3) != 235) {

                        trigger_error('Error: Password not accepted from server!');

                        exit();                             

                    }

                } else {

                    fputs($handle, 'HELO ' . getenv('SERVER_NAME') . $this->crlf);



                    $reply = '';



                    while ($line = fgets($handle, 515)) {

                        $reply .= $line;



                        if (substr($line, 3, 1) == ' ') {

                            break;

                        }

                    }



                    if (substr($reply, 0, 3) != 250) {

                        trigger_error('Error: HELO not accepted from server!');

                        exit();                         

                    }

                }



                if ($this->verp) {

                    fputs($handle, 'MAIL FROM: <' . $this->from . '>XVERP' . $this->crlf);

                } else {

                    fputs($handle, 'MAIL FROM: <' . $this->from . '>' . $this->crlf);

                }



                $reply = '';



                while ($line = fgets($handle, 515)) {

                    $reply .= $line;



                    if (substr($line, 3, 1) == ' ') {

                        break;

                    }

                }



                if (substr($reply, 0, 3) != 250) {

                    trigger_error('Error: MAIL FROM not accepted from server!');

                    exit();                         

                }



                if (!is_array($this->to)) {

                    fputs($handle, 'RCPT TO: <' . $this->to . '>' . $this->crlf);



                    $reply = '';



                    while ($line = fgets($handle, 515)) {

                        $reply .= $line;



                        if (substr($line, 3, 1) == ' ') {

                            break;

                        }

                    }



                    if ((substr($reply, 0, 3) != 250) && (substr($reply, 0, 3) != 251)) {

                        trigger_error('Error: RCPT TO not accepted from server!');

                        exit();                         

                    }

                } else {

                    foreach ($this->to as $recipient) {

                        fputs($handle, 'RCPT TO: <' . $recipient . '>' . $this->crlf);



                        $reply = '';



                        while ($line = fgets($handle, 515)) {

                            $reply .= $line;



                            if (substr($line, 3, 1) == ' ') {

                                break;

                            }

                        }



                        if ((substr($reply, 0, 3) != 250) && (substr($reply, 0, 3) != 251)) {

                            trigger_error('Error: RCPT TO not accepted from server!');

                            exit();                             

                        }

                    }

                }



                fputs($handle, 'DATA' . $this->crlf);



                $reply = '';



                while ($line = fgets($handle, 515)) {

                    $reply .= $line;



                    if (substr($line, 3, 1) == ' ') {

                        break;

                    }

                }



                if (substr($reply, 0, 3) != 354) {

                    trigger_error('Error: DATA not accepted from server!');

                    exit();                     

                }



                // According to rfc 821 we should not send more than 1000 including the CRLF

                $message = str_replace("\r\n", "\n",  $header . $message);

                $message = str_replace("\r", "\n", $message);



                $lines = explode("\n", $message);



                foreach ($lines as $line) {

                    $results = str_split($line, 998);



                    foreach ($results as $result) {

                        if (substr(PHP_OS, 0, 3) != 'WIN') {

                            fputs($handle, $result . $this->crlf);

                        } else {

                            fputs($handle, str_replace("\n", "\r\n", $result) . $this->crlf);

                        }                           

                    }

                }



                fputs($handle, '.' . $this->crlf);



                $reply = '';



                while ($line = fgets($handle, 515)) {

                    $reply .= $line;



                    if (substr($line, 3, 1) == ' ') {

                        break;

                    }

                }



                if (substr($reply, 0, 3) != 250) {

                    trigger_error('Error: DATA not accepted from server!');

                    exit();                     

                }



                fputs($handle, 'QUIT' . $this->crlf);



                $reply = '';



                while ($line = fgets($handle, 515)) {

                    $reply .= $line;



                    if (substr($line, 3, 1) == ' ') {

                        break;

                    }

                }



                if (substr($reply, 0, 3) != 221) {

                    trigger_error('Error: QUIT not accepted from server!');

                    exit();                     

                }



                fclose($handle);

            }

        }

    }

}

?>

我创建了fb app,没有任何问题并且与插件相关联。点击fb登录按钮后,它要求我允许我的fb配置文件上的应用程序,然后让我一步一步填写信息,如国家,邮政编码,地址等。填写该页面后,我得到上面提到的错误。 我注意到,当我再次尝试使用相同的fb配置文件时,它会自动识别我。但是,在管理方面,没有这样的用户http://screencast.com/t/jJrUOnLw

我有最新版本的OpenCart 1.5.6.4

我立即创建了勾选并询问了#34;社交媒体包&#34;支持导致此问题的原因。

这是他们的回应:

  

我认为这是与商店的电子邮件配置相关的问题。您的商店似乎使用SMTP发送电子邮件。我尝试使用常规注册方法注册,并在此过程中出现相同的错误消息。这使我相信您的商店邮件设置存在错误配置。您可以转到管理员面板检查它们 - &gt;系统 - &gt;设置 - &gt;你的商店 - &gt;邮件标签。请注意您的SMTP凭据和配置的SMTP端口,因为错误源自那里。

希望这有帮助!

此致 Angel Metaxov - iSenseLabs团队

这是我对邮件的开放式设置:http://screencast.com/t/3KrPSpnlqcN

如果您需要更多信息,请与我们联系。

的Stefan

更新:我和服务器人谈过,他告诉我在SMTP主机上使用域名。

在我尝试手动注册(没有插件社交登录)后,我收到此错误:

  

注意:错误:服务器不接受EHLO!在/home/wankersh/public_html/system/library/mail.php第200行

1 个答案:

答案 0 :(得分:1)

OpenCart有一个SMTP错误;详细了解here

您可以通过以下方式正确配置SMTP来修复它;

问题出现在最后一行,其值为$mail->smtp_hostname

if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
    $mail = new Mail();
    $mail->protocol = $this->config->get('config_mail_protocol');
    $mail->parameter = $this->config->get('config_mail_parameter');
    $mail->smtp_hostname = $this->config->get('config_mail_smtp_host');
}

解决方案:将其设为$this->config->get('config_mail_smtp_hostname')而不是后者,如下面的代码段所示;

if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
    $mail = new Mail();
    $mail->protocol = $this->config->get('config_mail_protocol');
    $mail->parameter = $this->config->get('config_mail_parameter');
    $mail->smtp_hostname = $this->config->get('config_mail_smtp_hostname');
}