PHP mail () de contacto-nosotros forma funciona bien si entrar en un Gmail dirección de envío, pero no con Yahoo [duplicado]

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

Pregunta

    

Esta pregunta es un duplicado exacto de:

         

he configurar un sitio de comercio electrónico utilizando Prestashop y cuando se prueba su forma de contacto, me di cuenta que no estaba recibiendo ningún mensaje si el usuario introduce la dirección de correo electrónico de Yahoo como la dirección del remitente. No tengo problemas, sin embargo, si el usuario introduce una dirección de Gmail.

Prestashop está configurado actualmente para utilizar la función de PHP mail () para el formulario de contacto. ¿Cuál podría ser el problema y qué soluciones podría me mira como yo, obviamente, necesita recibir mails de todos, no sólo los que tienen direcciones de Gmail.

El siguiente es el código de la página de contacto-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');

?> 

ACTUALIZACIÓN:
Me comuniqué con mi empresa de alojamiento de correo electrónico y le dieron la siguiente sugerencia: -

  

Usted tendría que cambiar el correo electrónico   dirección en el campo de $ a cualquier   dirección de correo electrónico en el nombre de dominio en   los cuales están incorporando este   guión. Por ejemplo, si su dominio   Nombre es abc.com, entonces sería definir   Desde la dirección de correo electrónico como   some-name@abc.com. Esta dirección de correo electrónico   no tiene por qué ser existente en el correo   Servidor de abc.com, sin embargo, el dominio   nombre en el campo de $ tiene que ser   tuya. Es posible utilizar una dirección de correo electrónico   tales como Do_Not_reply@abc.com.

     

El valor de los $ mailto necesidades de campo   que ser cambiado a la dirección de correo electrónico,   donde el correo electrónico que contiene los datos   presentado a través de las necesidades formulario que se   entregado.

Así pues, en el contexto de contacto form.php de Prestashop (código proporcionado anteriormente), ¿cómo hago para cambiarlo?

¿Fue útil?

Solución 5

La solución para esto se ha encontrado que esta pregunta es casi idéntica a: - Reconfiguración PHP mail () Smarty Formulario de contacto .

Otros consejos

PHP mail () es en realidad una forma cruda para enviar mensajes de correo electrónico. Es bastante fácil de estropear las cosas con el correo () si no conoce bien los RFC correo electrónico (estándares) ...

Le sugiero que use PHPMailer (o Librairies similares) o enviar el código real utilizando su.

No se pueden utilizar las direcciones que no están atados a sus servidores como direcciones de remitente. Esta será bloqueado por cada mecanismo de bloqueo de spam se precie. En realidad es un milagro que funciona con direcciones de Gmail.

Si usted quiere ser capaz de responder directamente a los mensajes que se envían a la gente a través de su formulario de contacto, añadir la siguiente cabecera de la cuarta parámetro para su llamada mail():

reply-to: customers_email_address

sino como la dirección del remitente física, siempre uso

from: something@yourserver.com

Hay un quinto parámetro se puede suministrar a la llamada mail().

Esto es lo que se utiliza para fijar mi correo Drupal (simplificado):

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

Desde AlexV remarcó correctamente que el uso de valores sin escape es peligroso, esto es la versión completa. Tenga en cuenta que se toma de las fuentes de drupal (con un pequeño arreglo).

    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 ayude, Chris

He estado usando este pequeño código para enviar mensajes de correo electrónico en un sistema de boletín de la mía. Este extracto se ocupa específicamente un único mensaje. Se basa en las especificaciones 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;
        }
    }

Me cambió el 'de' a $_REQUEST['from']. Puede cambiarlo $_POST['from'] también. reemplazar 2 'de' con esto y el cambio $contact->email a cualquier correo electrónico deseada donde desea entregar ese correo electrónico.

que trabajó para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top