Prestashop 通常默认使用 mail 函数发送邮件,邮件发送的IP地址就是服务器或者共享空间的IP地址。共享空间上面的网站不少,可能存在发送垃圾邮件的网站,致使共享空间的IP地址被其 他邮件服务商(gmail、hotmail等等)加入黑名单,使用mail发送的邮件所有不可以发送成功。php
更换使用第三方邮件来发送邮件,Prestashop 后台设置的发送邮件模式更换成SMTP。html
通过测试发现:使用SMTP发送邮件,当发件人为非SMTP帐户邮箱时,发送邮件成功,可是收件人收不到邮件。服务器
联系咱们(contact us)页面发送邮件给网站管理者,发件人为客户的邮箱,这样的邮件都收不到。个人订单页面也存在这种问题。函数
若是设置发件人邮箱为SMTP帐户邮箱,可以正常收到邮件。从网站后台给客户发送邮件,客户都可以收到邮件。从后台发送的邮件,发件人为SMTP帐户邮箱。测试
Magento开发者也许考虑到这个问题,他们给出了很好的解决方案。Magento联系咱们页面,客户发送的邮件,发件人就是SMTP帐户邮箱,可是回复收件人邮箱是客户邮箱。网站
综合考虑上面的状况,只可以采用Magento的那种邮件处理模式来解决问题。发件人设置为SMTP帐户邮箱,回复邮箱设置成客户邮箱。this
找到Prestashop classes/Mail.php 文件,修改地方以下:rest
// 102-104 行之间修改代码 // $from_name is not that important, no need to die if it is not valid if (!isset($from_name) || !Validate::isMailName($from_name)) $from_name = $configuration['PS_SHOP_NAME']; if (!Validate::isMailName($from_name)) $from_name = null; // 设置回复邮箱为客户邮箱 $email_reply_to = $from; // 设置发件人邮箱为SMTP帐户邮箱 $from = $configuration['PS_SHOP_EMAIL']; // It would be difficult to send an e-mail if the e-mail is not valid, so this time we can die if there is a problem if (!is_array($to) && !Validate::isEmail($to)) { Tools::dieOrLog(Tools::displayError('Error: parameter "to" is corrupted'), $die); return false; }
// 256-264 行代码修改 /* Create mail and attach differents parts */ $message = new Swift_Message('['.Configuration::get('PS_SHOP_NAME', null, null, $id_shop).'] '.$subject); $message->setCharset('utf-8'); // 设置回复者邮箱为客户邮箱 $message->setReplyTo($email_reply_to); /* Set Message-ID - getmypid() is blocked on some hosting */ $message->setId(Mail::generateId()); $message->headers->setEncoding('Q');
上面的解决方法暂时适合于Prestashop 1.5.6.1,其余高版本是否修复这个漏洞,暂不清楚。htm