前几天,有个人和我说能不能解决联系我们页面无法发邮件,我突然想起来,,当年我网站也有这个问题,可是因为事情多,这个页面也觉得用不上,我好像就没去搭理了。于是展开了研究。
联系我们的页面地址是: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”
我们打开这个文件,可以看到下面这些代码:
- 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->hostname = $this->config->get('config_smtp_host');
- $mail->username = $this->config->get('config_smtp_username');
- $mail->password = $this->config->get('config_smtp_password');
- $mail->port = $this->config->get('config_smtp_port');
- $mail->timeout = $this->config->get('config_smtp_timeout');
- $mail->setTo($this->config->get('config_email'));
- $mail->setFrom($this->request->post['email']);
- $mail->setSender($this->request->post['name']);
- $mail->setSubject(html_entity_decode(sprintf($this->language->get('email_subject'), $this->request->post['name']), ENT_QUOTES, 'UTF-8'));
- $mail->setText(strip_tags(html_entity_decode($this->request->post['enquiry'], ENT_QUOTES, 'UTF-8')));
- $mail->send();
- $this->redirect($this->url->link('information/contact/success'));
- }
这里我们可以很容易的看到几个POST参数:email、name 和 enquiry ,明显对应的是用户填写的邮件地址、名字和邮件内容了。那么,我们着手修改,把发件人,改为自己。
- //收件人
- $mail->setTo($this->config->get('config_email'));
- //发件人
- $mail->setFrom($this->request->post['email']);
很明显我们可以看到对应的值,于是修改为:
- //收件人
- $mail->setTo($this->config->get('config_email'));
- //发件人
- $mail->setFrom($this->config->get('config_email'));
那么,到了这里,你会发现一个问题,,,等等,,我咋知道发件人到底原本是谁??于是乎:
- //收件人名称
- $mail->setSender($this->request->post['name']);
- //修改为:
- $mail->setSender($this->request->post['name'].'<'.$this->request->post['email'].'>');
也就是,发件人姓名这里后面带入发件人邮箱地址。方便我们知道是谁发来的。
嗯,到此我以为就告一段落了,今天写vqmod插件后,准备在服务器上也测试,发现,,,多了个问题:“Error: RCPT TO not accepted from server!”,那么怎么办呢?我也是查看了几个地方,发现,要不,测试下修改收件人吧,嗯,我自己定义了一个收件人,于是乎,真的收到了,然后我把定义的收件人改回去[写死],可是依然不行,那么,,,解决办法自然是:
- //收件人
- $mail->setTo($this->config->get('config_email'));
- //改为自己定义的,区别于系统设置的邮件地址:
- $mail->setTo('yourmail@mail.com');
嗯,至此,所有问题解决了,但是,如果你害怕自己修改代码出问题,可以下载我免费提供的一个vqmod插件,适合1.5 系列和 2.0系列。
2016年07月04日 02:38 -9楼
感谢 解决了
2016年07月04日 02:39 -8楼
突然发现 你的这个回复时间差了八小时啊
2016年07月07日 17:48 地下1层
@qiye 时间没校准。后来好了。
2017年11月18日 00:33 -7楼
感谢技术分享,困扰我1年的问题解决了~~ 谢谢!
2019年11月15日 09:45 -6楼
瞬间解决了我的问题