O formulário PHP Mail () Contact-Us funciona bem se entrar em um endereço de envio do Gmail, mas não com o Yahoo [duplicado

StackOverflow https://stackoverflow.com/questions/2133442

Pergunta

Esta questão é uma duplicata exata de:

Eu configurei um site de comércio eletrônico usando o PrestaShop e, ao testar seu formulário de contato, descobri que não estava recebendo nenhuma mensagem se o usuário inserir endereço de e -mail do Yahoo como endereço dos remetentes. Não tenho problemas, no entanto, se o usuário entrar em um endereço do Gmail.

Prestashop está configurado atualmente para usar a função php email () para o formulário de contato. Qual poderia ser o problema e quais soluções eu poderia ver, pois obviamente preciso receber e -mails de todos, não apenas aqueles com endereços do Gmail.

A seguir, é apresentado o código na página de contato com forma de contato:--

<?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');

?> 

ATUALIZAR:
Entrei em contato com minha empresa de hospedagem de e-mail e eles deram a seguinte sugestão:-

Você precisaria alterar o endereço de email no campo $ para qualquer endereço de email no nome de domínio em que está incorporando esse script. Por exemplo, se o seu nome de domínio for abc.com, você definirá o endereço de e-mail do algum name@abc.com. Esse endereço de e -mail não precisa existir no servidor de email do ABC.com, no entanto, o nome de domínio no $ do campo deve ser seu. Você pode usar um endereço de e -mail como do_not_reply@abc.com.

O valor no campo $ Mailto precisa ser alterado para o endereço de email, onde o email que contém os dados enviados pelo formulário precisa ser entregue.

Então, no contexto do Prestashop em forma de contato.php (código fornecido acima), como eu mudaria isso?

Foi útil?

Solução 5

A solução para isso foi encontrada, pois essas perguntas são quase idênticas a:- Reconfigurando o formulário de contato smarty php e -mail ().

Outras dicas

Php Mail () é realmente uma maneira bruta de enviar e -mails. É muito fácil estragar as coisas com Mail () se você não sabe bem os RFCs de email (padrões) ...

Eu sugiro que você use Phpmailer (ou bibliotecas similares) ou poste o código real que você está usando.

Você não pode usar endereços que não estão vinculados aos seus servidores como endereços do remetente. Isso será bloqueado por todos os mecanismos de bloqueio de spam que respeitam. Na verdade, é um milagre que ele funcione com os endereços do Gmail.

Se você deseja responder diretamente aos e -mails que as pessoas enviam para você através do seu formulário de contato, adicione o seguinte cabeçalho ao 4º parâmetro ao seu mail() ligar:

reply-to: customers_email_address

Mas como endereço do remetente físico, sempre usar

from: something@yourserver.com

Há um quinto parâmetro que você pode fornecer ao mail() ligar.

Aqui está o que eu costumava consertar meu correio Drupal (simplificado):

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

Como Alexv observou corretamente que o uso de valores não especiais é perigoso, esta é a versão completa. Observe que é retirado das fontes do Drupal (com uma pequena correção).

    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'] : '') );
    }

Espero que ajude, Chris

Eu tenho usado esse pequeno código para enviar e-mails em um sistema de boletins de boletim. Este trecho lida especificamente uma única mensagem. É baseado nas especificações da RFC.


    /**
     * @package  jaMailBroadcast
     * @author   Joel A. Villarreal Bertoldi (design at joelalejandro.com)
     *
     * @usage    
     *
     *     $msg = new jaMailBroadcast_Message("My Website", "my@website.com");
     *     $msg->to = new jaMailBroadcast_Contact("John Doe", "john@doe.com");
     *     $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;
        }
    }

Eu mudei o 'de' para $_REQUEST['from']. Você pode mudar isso $_POST['from'] também. Substitua 2 'de' por isso e altere $contact->email para qualquer e -mail desejado onde você deseja entregar esse email.

Funcionou para mim.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top