opencart设置SMTP情况下联系我们页面无法发邮件的解决办法

前几天,有个人和我说能不能解决联系我们页面无法发邮件,我突然想起来,,当年我网站也有这个问题,可是因为事情多,这个页面也觉得用不上,我好像就没去搭理了。于是展开了研究。

联系我们的页面地址是:http://www.3clove.cn/index.php?route=information/contact 那么,也就是相应的处理文件在:catalog/controller/information/contact.php

不过,一开始,我是从错误文件开始看的,也就是:system/library/mail.php 这个文件。可是,我测试了好久,没发现什么可以修复的地方。

那么,难道就不能解决了么?仔细查看错误提示:“Error: MAIL FROM not accepted from server!”

其实,我英语不怎么好,于是我测试了下,我填写了自己的邮件地址,也就是和SMTP的一样。于是乎,这个邮件可以发出去。

懂了吧,也就是,发件人和SMTP账户一样,其实是一种安全保护。那么,怎么办?

一,把这个页面单独改为 mail函数发送,可是也有很多主机商不支持mail函数呢。。怎么办呢?

二:发件人是自己,用户填写的邮箱通过邮件传达即可。

那么,我们用第二个方案,比较靠谱,于是着手修改处理器文件“contact.php”

我们打开这个文件,可以看到下面这些代码:

  1. if (($this->request->server['REQUEST_METHOD'] == 'POST') && $this->validate()) {
  2.             $mail = new Mail();
  3.             $mail->protocol = $this->config->get('config_mail_protocol');
  4.             $mail->parameter = $this->config->get('config_mail_parameter');
  5.             $mail->hostname = $this->config->get('config_smtp_host');
  6.             $mail->username = $this->config->get('config_smtp_username');
  7.             $mail->password = $this->config->get('config_smtp_password');
  8.             $mail->port = $this->config->get('config_smtp_port');
  9.             $mail->timeout = $this->config->get('config_smtp_timeout');
  10.             $mail->setTo($this->config->get('config_email'));
  11.             $mail->setFrom($this->request->post['email']);
  12.             $mail->setSender($this->request->post['name']);
  13.             $mail->setSubject(html_entity_decode(sprintf($this->language->get('email_subject'), $this->request->post['name']), ENT_QUOTES, 'UTF-8'));
  14.             $mail->setText(strip_tags(html_entity_decode($this->request->post['enquiry'], ENT_QUOTES, 'UTF-8')));
  15.             $mail->send();
  16.             $this->redirect($this->url->link('information/contact/success'));
  17.         }

这里我们可以很容易的看到几个POST参数:email、name 和 enquiry ,明显对应的是用户填写的邮件地址、名字和邮件内容了。那么,我们着手修改,把发件人,改为自己。

  1. //收件人
  2. $mail->setTo($this->config->get('config_email'));
  3. //发件人
  4. $mail->setFrom($this->request->post['email']);

很明显我们可以看到对应的值,于是修改为:

  1. //收件人
  2. $mail->setTo($this->config->get('config_email'));
  3. //发件人
  4. $mail->setFrom($this->config->get('config_email'));

那么,到了这里,你会发现一个问题,,,等等,,我咋知道发件人到底原本是谁??于是乎:

  1. //收件人名称
  2. $mail->setSender($this->request->post['name']);
  3. //修改为:
  4. $mail->setSender($this->request->post['name'].'<'.$this->request->post['email'].'>');

也就是,发件人姓名这里后面带入发件人邮箱地址。方便我们知道是谁发来的。

嗯,到此我以为就告一段落了,今天写vqmod插件后,准备在服务器上也测试,发现,,,多了个问题:“Error: RCPT TO not accepted from server!”,那么怎么办呢?我也是查看了几个地方,发现,要不,测试下修改收件人吧,嗯,我自己定义了一个收件人,于是乎,真的收到了,然后我把定义的收件人改回去[写死],可是依然不行,那么,,,解决办法自然是:

  1. //收件人
  2. $mail->setTo($this->config->get('config_email'));
  3. //改为自己定义的,区别于系统设置的邮件地址:
  4. $mail->setTo('yourmail@mail.com');

嗯,至此,所有问题解决了,但是,如果你害怕自己修改代码出问题,可以下载我免费提供的一个vqmod插件,适合1.5 系列和 2.0系列。

 

文件下载

广告也精彩

您可以选择一种方式赞助本站

支付宝扫一扫赞助

微信钱包扫描赞助

目前评论:4   其中:访客  4   博主  0

  1. avatar qiye 1

    感谢 解决了

  2. avatar qiye 1

    突然发现 你的这个回复时间差了八小时啊 :razz:

  3. avatar tony 0

    感谢技术分享,困扰我1年的问题解决了~~ 谢谢!

评论加载中...

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

图片 表情