2010-01-25 10 views
-1

Я установил сайт электронной торговли с помощью Prestashop, и при тестировании их контактной формы я обнаружил, что я не получал никаких сообщений, если пользователь вводит адрес электронной почты Yahoo в качестве адреса отправителя. Однако у меня нет проблем, если пользователь вводит адрес Gmail.PHP Mail() Форма обратной связи работает нормально, если вы вводите адрес отправки Gmail, но не с Yahoo

В настоящее время Prestashop настроен на использование функции PHP Mail() для контактной формы. В чем может быть проблема и какие решения я могу рассмотреть, поскольку я, очевидно, должен получать почту от всех, а не только с адресами gmail.

Ниже приведен код в бесконтактном form.php странице: -

<?php 

$useSSL = true; 

include(dirname(__FILE__).'/config/config.inc.php'); 
include(dirname(__FILE__).'/header.php'); 

$errors = array(); 

$smarty->assign('contacts', Contact::getContacts(intval($cookie->id_lang))); 

if (Tools::isSubmit('submitMessage')) 
{ 
    if (!($from = Tools::getValue('from')) OR !Validate::isEmail($from)) 
     $errors[] = Tools::displayError('invalid e-mail address'); 
    elseif (!($message = nl2br2(Tools::getValue('message')))) 
     $errors[] = Tools::displayError('message cannot be blank'); 
    elseif (!Validate::isMessage($message)) 
     $errors[] = Tools::displayError('invalid message'); 
    elseif (!($id_contact = intval(Tools::getValue('id_contact'))) OR !(Validate::isLoadedObject($contact = new Contact(intval($id_contact), intval($cookie->id_lang))))) 
     $errors[] = Tools::displayError('please select a contact in the list'); 
    else 
    { 
     if (intval($cookie->id_customer)) 
      $customer = new Customer(intval($cookie->id_customer)); 
     if (Mail::Send(intval($cookie->id_lang), 'contact', 'Message from contact form', array('{email}' => $_POST['from'], '{message}' => stripslashes($message)), $contact->email, $contact->name, $from, (intval($cookie->id_customer) ? $customer->firstname.' '.$customer->lastname : $from))) 
      $smarty->assign('confirmation', 1); 
     else 
      $errors[] = Tools::displayError('an error occurred while sending message'); 
    } 
} 

$email = Tools::safeOutput(Tools::getValue('from', ((isset($cookie) AND isset($cookie->email) AND Validate::isEmail($cookie->email)) ? $cookie->email : ''))); 
$smarty->assign(array(
    'errors' => $errors, 
    'email' => $email 
)); 

$smarty->display(_PS_THEME_DIR_.'contact-form.tpl'); 
include(dirname(__FILE__).'/footer.php'); 

?> 

UPDATE:
Я связался мой адрес электронной хостинговой компании, и они дали следующее предложение: -

Вам необходимо изменить адрес электронной почты адрес в поле $ from to any Адрес электронной почты для домена который вы используете этот скрипт . Например, если ваше доменное имя - это abc.com, вы должны определить с адреса электронной почты как [email protected] Этот адрес электронной почты не должен быть на почтовом сервере . Сервер abc.com, однако, имя домена в поле $ from должно быть вашего. Вы можете использовать адрес электронной почты , такой как [email protected]

Значение в поле $ MAILTO необходимо быть изменен на адрес электронной почты, где письмо, содержащие данные, представленные через форму должно быть доставлено.

Итак, в контексте контакта-form.php от Prestashop (приведенный выше код), как я могу его изменить?

ответ

1

PHP mail() - это действительно простой способ отправки писем. Достаточно легко повредить вещи почтой(), если вы не знаете, правильно ли RFC (стандарты) ...

Я предлагаю вам использовать PHPMailer (или аналогичные librairies) или разместить фактический код для использования.

+0

Например, если вы используете CRLF (\ r \ n) в содержимом сообщения, это может испортить некоторые почтовые серверы. \ r \ n следует использовать только как «разделитель» для заголовков электронной почты и \ n как новый символ строки в теле сообщения (содержание). – AlexV

+0

Конфигурация «отправить электронную почту» в Prestashop действительно дает возможность функции PHP mail() или SMTP. – nitbuntu

+0

И как вы «кормите», что отправить в Престашоп (я не знаю этого приложения). – AlexV

1

Вы не можете использовать адреса, не привязанные к вашим серверам в качестве адресов отправителей. Это будет блокировано каждым уважающим себя механизмом блокировки спама. На самом деле это чудо, что оно работает с адресами GMail.

Если вы хотите, чтобы иметь возможность непосредственно отвечать на письма, которые люди посылают вам через контактную форму, добавьте следующий заголовок к 4-му параметру к вашему mail() вызова:

reply-to: customers_email_address 

, но в качестве физического отправителя адрес, всегда использование

from: [email protected] 
+0

Моя почтовая хостинговая компания сказала то же самое. Но в контексте приведенного выше кода contact-form.php, что мне нужно делать. Что будет следующим шагом? – nitbuntu

+0

Я не знаю, так как не могу сказать, куда отправляется почта в вашем коде. Сожалею. В конфигурации Prestashop должен быть раздел «отправить электронную почту от». В этот момент, чтобы вставить заголовки, кто-то, более знакомый с этим магазином, должен будет ответить. –

0

Там в пятый параметр, который можно поставить на mail() вызова.

Вот что я использовал, чтобы исправить мою Друпала почту (упрощенную):

return @mail($message['to'], 
      $message['subject'], 
      $message['body'], 
      join("\n", $mimeheaders), 
      '-f' . $message['from']); 

С AlexV правильно заметил, что использование неэкранированных значений опасно, это полная версия. Обратите внимание, что он берется из источников drupal (с небольшим исправлением).

function drupal_mail_wrapper($message) 
    { 
     $mimeheaders = array(); 

     foreach ($message['headers'] as $name => $value) 
     { 
      $mimeheaders[] = $name .': '. mime_header_encode($value); 
     } 

     return @mail(
      $message['to'], 
      mime_header_encode($message['subject']), 
      // Note: e-mail uses CRLF for line-endings, but PHP's API requires LF. 
      // They will appear correctly in the actual e-mail that is sent. 
      str_replace("\r", '', $message['body']), 
      // For headers, PHP's API suggests that we use CRLF normally, 
      // but some MTAs incorrecly replace LF with CRLF. See #234403. 
      join("\n", $mimeheaders), 
      ($message['from'] ? '-f' . $message['from'] : '')); 
    } 

Надежда, что помогает, Крис

0

Я использую этот небольшой код для отправки сообщений электронной почты в бюллетене системы самостоятельно. Эта выдержка обрабатывает специально одно сообщение. Он основан на спецификациях RFC.


    /** 
    * @package jaMailBroadcast 
    * @author Joel A. Villarreal Bertoldi (design at joelalejandro.com) 
    * 
    * @usage  
    * 
    *  $msg = new jaMailBroadcast_Message("My Website", "[email protected]"); 
    *  $msg->to = new jaMailBroadcast_Contact("John Doe", "[email protected]"); 
    *  $msg->subject = "Something"; 
    *  $msg->body = "Your message here. You <b>can use</b> HTML."; 
    *  $msg->send(); 
    **/ 

    class jaMailBroadcast_Contact 
    { 
     public $id; 
     public $name; 
     public $email; 

     function __construct($contactName, $contactEmail, $contactId = "") 
     { 
      $this->name = $contactName; 
      $this->email = $contactEmail; 
      if (!$contactId) 
       $this->id = uniqid("contact_"); 
      else 
       $this->id = $contactId; 
     } 

     function __toString() 
     { 
      return json_encode 
      (
       array 
       (
        "id" => $this->id, 
        "name" => $this->name, 
        "email" => $this->email 
       ) 
      ); 
     } 

     function rfc882_header() 
     { 
      return sprintf('"%s" ', $this->name, $this->email); 
     } 
    } 

    class jaMailBroadcast_Message 
    { 
     public $from; 
     public $to; 
     public $subject; 
     public $body; 
     public $mime_boundary; 
     public $headerTemplate; 
     public $footerTemplate; 

     function __construct($fromName, $fromEmail) 
     { 
      $this->from = new jaMailBroadcast_Contact($fromName, $fromEmail); 
      $this->mime_boundary = "==" . md5(time()); 
     } 

     private function mail_headers($EOL = "\n") 
     { 
      $headers 
       = "From: " . $this->from->rfc882_header() . $EOL 
       . "Reply-To: from->email . ">" . $EOL 
       . "Return-Path: from->email . ">" . $EOL 
       . "MIME-Version: 1.0" . $EOL 
       . "Content-Type: multipart/alternative; boundary=\"{$this->mime_boundary}\"" . $EOL 
       . "User-Agent: jaMailBroadcast/1.0" . $EOL 
       . "X-Priority: 3 (Normal)" . $EOL 
       . "Importance: Normal" . $EOL 
       . "X-Mailer: jaMailBroadcast"; 

      return $headers; 
     } 

     private function rfc882_body_format($EOL = "\r\n") 
     { 
      return wordwrap($this->body, 70, $EOL); 
     } 

     function send() 
     { 
      $EOL = 
       (
        stripos($this->to->email, "hotmail") !== false 
        || 
        stripos($this->to->email, "live") !== false 
       ) 
        ? "\n" 
        : "\n"; 

      return mail 
      (
       $this->to->rfc882_header(), 
       $this->subject, 
       $this->multipart_alternative_body($EOL), 
       $this->mail_headers($EOL), 
       "-f" . $this->from->email 
      ); 
     } 

     private function multipart_alternative_body($EOL = "\r\n") 
     { 
      $multipart 
        = "Content-Transfer-Encoding: 7bit" . $EOL 
        . "This is a multi-part message in MIME format. This part of the E-mail should never be seen. If you are reading this, consider upgrading your e-mail client to a MIME-compatible client." . $EOL . $EOL 
        = "--{$this->mime_boundary}" . $EOL 
        . "Content-Type: text/plain; charset=iso-8859-1" . $EOL 
        . "Content-Transfer-Encoding: 7bit" . $EOL . $EOL 
        . strip_tags($this->br2nl($this->headerTemplate)) . $EOL . $EOL 
        . strip_tags($this->br2nl($this->body)) . $EOL . $EOL 
        . strip_tags($this->br2nl($this->footerTemplate)) . $EOL . $EOL 
        . "--{$this->mime_boundary}" . $EOL 
        . "Content-Type: text/html; charset=iso-8859-1" . $EOL 
        . "Content-Transfer-Encoding: 7bit" . $EOL . $EOL 
        . $this->headerTemplate . $EOL 
        . $this->body . $EOL 
        . $this->footerTemplate . $EOL 
        . "--{$this->mime_boundary}--" . $EOL; 

      return $multipart; 
     } 

     private function br2nl($text, $EOL = "\n") 
     { 
      $text = str_ireplace("<br>", $EOL, $text); 
      $text = str_ireplace("<br />", $EOL, $text); 
      return $text; 
     } 
    } 

0

Я изменил 'from' на $_REQUEST['from']. Вы также можете изменить его $_POST['from']. замените 2 'из' на это и измените $contact->email на любой желаемый адрес электронной почты, куда вы хотите доставить это письмо.

это сработало для меня.