前几天,有个人和我说能不能解决联系我们页面无法发邮件,我突然想起来,,当年我网站也有这个问题,可是因为事情多,这个页面也觉得用不上,我好像就没去搭理了。于是展开了研究。联系我们的页面地址是: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=newMail();$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系列。 下载地址