Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php OpenCart-不发送电子邮件(通知或联系人页面)_Php_Email_Base64_Opencart - Fatal编程技术网

Php OpenCart-不发送电子邮件(通知或联系人页面)

Php OpenCart-不发送电子邮件(通知或联系人页面),php,email,base64,opencart,Php,Email,Base64,Opencart,据我所知,我的邮件设置配置正确,但我没有收到任何电子邮件,没有通过联系人表单,也没有新客户或任何订单 以下是我当前的设置: 我试过: 更改为SMTP时,我收到一个错误,我的主机(IXWebHosting)说我 需要在应用程序中禁用授权,而我无法 查看此选项的一个选项 在电子邮件之前添加-f和-f作为 将不同的电子邮件添加到列表底部的“还发送到”框中 邮件页面 手动将代码中的“From”头定义为 试过@gmail.com、@googlemail.com和@arabel.co.uk 不幸的是,我仍

据我所知,我的邮件设置配置正确,但我没有收到任何电子邮件,没有通过联系人表单,也没有新客户或任何订单

以下是我当前的设置:

我试过:

  • 更改为SMTP时,我收到一个错误,我的主机(IXWebHosting)说我 需要在应用程序中禁用授权,而我无法 查看此选项的一个选项

  • 在电子邮件之前添加-f和-f作为

  • 将不同的电子邮件添加到列表底部的“还发送到”框中 邮件页面

  • 手动将代码中的“From”头定义为

  • 试过@gmail.com、@googlemail.com和@arabel.co.uk

  • 不幸的是,我仍然没有收到来自OpenCart的任何电子邮件。我已经联系了我的主机并运行了测试脚本——服务器上的邮件功能或设置没有问题,我刚刚从OpenCart下载了mail.php的最新版本(尽管这已经有六个月了,也是我一直在使用的版本)

    谢谢

    更新:

    base64_encode似乎不起作用,因为以下代码:

    echo $header = 'From: ' . '=?UTF-8?B?' . base64_encode($this->sender) . '?=' . '<' . $this->from . '>' . $this->newline;
    die();
    
    echo$header='From:'。=?UTF-8?B?’。base64_编码($this->sender)。“?=”。”$本->新线;
    模具();
    
    输出如下:

    From:=?UTF-8?B?Tmljaw===


    老实说,我不完全确定为什么会有Base64编码。打开
    system/library/mail.php
    并更改此行

    echo $header .= 'From: ' . '=?UTF-8?B?' . base64_encode($this->sender) . '?=' . '<' . $this->from . '>' . $this->newline;
    
    echo$header.=“发件人:”。=?UTF-8?B?’。base64_编码($this->sender)。“?=”。”$本->新线;
    

    $header.='From:'$此->发件人。“”$本->新线;
    
    我对此感到非常沮丧

    问题确实出在你的服务器上。。。如果使用邮件选项,则必须在本地主机上设置邮件服务器。 但问题是,您的ISP是否支持smtp的25端口。如果没有,那你就有麻烦了

    第二种选择是使用gmail smtp或hotmail smtp。 我试过了,但失败得很惨。。我不知道为什么gmail对我不起作用,但我搜索了整个互联网,发现人们随机地对gmail有问题

    我在寻找,并尝试了最后的办法。。smtp从我的isp。我使用了我的ISP的smtp并在smtp上设置了选项,发现这些东西是有效的

    我打电话给我的ISP,他们不知道gmail为什么不工作,但他们告诉我,他们关闭了25个端口,以防止垃圾邮件发送者用你的用户名发送邮件

    TL,DR: 如果您正在本地主机上工作,请尝试使用您自己的isp smtp,如果不是,请您的主机提供商为您解决问题:)

    PS:您不能禁用授权。opencart的早期版本没有授权,这很有趣,为什么他们不添加选项来选择是否有授权


    如果您知道编码,您可以在opencart中编辑邮件类,如果不知道,您唯一的解决方案是使用您的ISP smtp或移动到邮件服务器设置了smtp授权的主机(即使对于您当前的主机也不难设置)。

    尝试在站点的“设置”菜单中添加多个电子邮件地址。(现场管理)

    它在OpenCart版本1.5.5.3中对我们有效


    我尝试了所有可能的修复,但没有一个对我有效(我托管在Site5上,在Webfaction上,它有效)。 最后,我使用我安装的system/library/SwiftMailer目录重写了system/library/mail.php文件中的send()函数。 我的代码不完整,因为它假定身份验证总是必要的,但这应该是一个简单的修复方法

    public function send() {
        require_once(DIR_SYSTEM . 'library/swiftmailer/swift_required.php');
    
        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;
        }
    
        $message = Swift_Message::newInstance()
          ->setSubject($this->subject)
          ->setFrom(array($this->from => $this->sender))
          ->setTo(array($to))
          ->setBody($this->text);
    
        if($this->html){
            $message->addPart($this->html, 'text/html');
        }
    
        foreach ($this->attachments as $attachment) {
            if (file_exists($attachment)) {
                $message->attach(Swift_Attachment::fromPath($attachment));
            }
        }
    
        $transport = Swift_SmtpTransport::newInstance('localhost', 25)
        ->setUsername($this->username)
        ->setPassword($this->password);
    
        $mailer = Swift_Mailer::newInstance($transport);
        $mailer->send($message);
    }
    

    我的解决方案是,当电子邮件的“发件人”中的域与主机不同时,我的服务器无法发送电子邮件

    这很清楚,因为当我填写
    test@mydomain.com
    在联系方式中,它是有效的,而且定期的电子邮件也确实到达了

    为了强制邮件从我自己的主机而不是填写的电子邮件地址发送,我编辑了联系人控制器

    如果您不知道如何编辑源代码,请不要继续,我省略了一些简单的步骤。如果你不知道这些步骤,不要问,而是请专业人士查一下。(只是为了保护自己)

    文件:
    catalog/controller/information/contact.php

    功能索引,我在第21行:

    原件:

    $mail->setFrom($this->request->post['email']);
    
    新的:


    这为我解决了这个问题。

    +1此外,“回复”标题(就在“发件人”后面的下一行)似乎也遇到了同样的问题。将其修改为:
    $header.='Reply to:'后$此->发件人。“”$本->新线它似乎工作正常。但是
    php.ini
    中使用的邮件主机肯定与此问题有关,因为电子邮件通知过去对我很有效,直到它们突然停止工作为止。如图所示。。。这也帮助了我的一位客户。可能是因为第一个电子邮件帐户存在配置问题,但你的提示使我们无法使用。谢谢;)您确定检查了html页面的源代码吗?因为零件被视为标记,所以不会显示在浏览器中。这就是为什么它只显示“From:=?UTF-8?B?Tmljaw==?=”。但是在html源代码中,电子邮件部分应该显示base64_编码之间的代码非常有效。你的输入是“尼克”。另外,你的浏览器只是隐藏了东西,因为它在标签中。。。
    $mail->setFrom($this->request->post['email']);
    
    $mail->setFrom($this->config->get('config_email'));
    $mail->setReplyTo($this->request->post['email']);