Задать вопрос
furniture
@furniture
консультант технолог

Как научить форму обратной связи учитывать разные домены e-mail?

Перестала работать форма обратной связи. Точнее если домен после @ из 3-х букв сообщения приходят. А если 2 буквы, сообщение не отправляется. Так если указать емаил отправителя скажем test@mail.ru - сообщения не отправляются, а если указать test@mail.com - сообщения приходят как положено.
Вот код обработчика, помогите отредактировать чтобы срабатывало в не зависимости от количества букв домена.

файл обработчик:
<?php

class Mail
 {
  const MAIL_HEADER_SEPARATOR = "\r\n"; // "\r\n" complies with RFC 2822 but might cause problems in some cases (see http://php.net/manual/en/function.mail.php)
  const MAIL_HEADER_TRANSFER_ENCODING = 'B'; // 'B' for Base64 or 'Q' for Quoted-Printable
  private $charset = 'utf-8';

  public function __construct()
   {
    mb_internal_encoding($this->charset);
   }

  public function set_charset($charset)
   {
    $this->charset = $charset;
    mb_internal_encoding($this->charset);
   }

  public function is_valid_email($email)
   {
    if(preg_match("/^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/", $email))
     {
      return true;
     }
    return false;
   }

  public function escape_display_name($display_name)
   {
    $display_name = str_replace('"', '\\"', $display_name);
    if(preg_match("/(\.|\;|\")/", $display_name))
     {
      return '"'.mb_encode_mimeheader($display_name, $this->charset, self::MAIL_HEADER_TRANSFER_ENCODING, self::MAIL_HEADER_SEPARATOR).'"';
     }
    else
     {
      return mb_encode_mimeheader($display_name, $this->charset, self::MAIL_HEADER_TRANSFER_ENCODING, self::MAIL_HEADER_SEPARATOR);
     }
   }

  public function make_address($display_name, $email)
   {
    return $this->escape_display_name($display_name).' <'.$email.'>';
   }

  private function mail_header_filter($string)
   {
    #return preg_replace("/(\015\012|\015|\012|content-transfer-encoding:|mime-version:|content-type:|subject:|to:|cc:|bcc:|from:|reply-to:)/ims", '', $string);
    #return preg_replace("/(\015\012|\015|\012|to:|cc:|bcc:|from:|reply-to:)/ims", '', $string);
    return preg_replace("/(\015\012|\015|\012)/", '', $string);
   }

  private function my_quoted_printable_encode($input, $line_max=76, $space_conv = false )
   {
    $hex = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
    $lines = preg_split('/(?:\r\n|\r|\n)/', $input);
    $eol = "\n";
    $escape = '=';
    $output = '';
    while(list(, $line) = each($lines))
     {
      $linlen = strlen($line);
      $newline = '';
      for($i = 0; $i < $linlen; $i++)
       {
        $c = substr($line, $i, 1);
        $dec = ord( $c );
        if(($i == 0) && ($dec == 46)) // convert first point in the line into =2E
         { 
          $c = '=2E';
         }
        if($dec == 32)
         {
          if($i==($linlen-1)) // convert space at eol only
           {
            $c = '=20';
           }
          elseif($space_conv)
           {
            $c = '=20';
           }
          }
         elseif(($dec == 61) || ($dec < 32) || ($dec > 126)) // always encode "\t", which is *not* required
          { 
           $h2 = floor($dec/16);
           $h1 = floor($dec%16);
           $c = $escape.$hex[$h2].$hex[$h1];
          }
         if((strlen($newline) + strlen($c)) >= $line_max) // CRLF is not counted
          { 
           $output .= $newline.$escape.$eol; //  soft line break; " =\r\n" is okay
           $newline = '';
           if($dec == 46) // check if newline first character will be point or not
            {
             $c = '=2E';
            }
          }
         $newline .= $c;
       } // end of for
      $output .= $newline.$eol;
     } // end of while
    return $output;
   }

  public function send($to, $from, $subject, $message, $additional_parameters='')
   {
    $to = $this->mail_header_filter($to);
    $subject = mb_encode_mimeheader($this->mail_header_filter($subject), $this->charset, self::MAIL_HEADER_TRANSFER_ENCODING, self::MAIL_HEADER_SEPARATOR);
    $message = $this->my_quoted_printable_encode($message);

    $headers  = "From: " . $this->mail_header_filter($from) . self::MAIL_HEADER_SEPARATOR;
    $headers .= "MIME-Version: 1.0" . self::MAIL_HEADER_SEPARATOR;
    $headers .= "X-Sender-IP: ".$_SERVER["REMOTE_ADDR"] . self::MAIL_HEADER_SEPARATOR;
    #$headers .= "X-Mailer: " . BASE_URL . self::MAIL_HEADER_SEPARATOR;
    $headers .= "Content-Type: text/plain; charset=" . $this->charset . self::MAIL_HEADER_SEPARATOR;
    $headers .= "Content-Transfer-Encoding: quoted-printable";

    if($additional_parameters)
     {
      if(@mail($to, $subject, $message, $headers, $additional_parameters))
       {
        return true;
       }
      else
       {
        return false;
       }
     }
    else
     {
      if(@mail($to, $subject, $message, $headers))
       {
        return true;
       }
      else
       {
        return false;
       }
     }
   }
 }
?>
  • Вопрос задан
  • 193 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
Почта перестала доходить, потому что для домена mail.ru включен DMARC, защищающий письма от подделок:
https://habrahabr.ru/company/mailru/blog/282602/
Ответ написан
Комментировать
alsopub
@alsopub
Может быть не "перестало отправляться", а "перестало доходить"?
В папке "спам" искали?
Почтовые логи смотрели?
Ответ написан
Строчку:
if(preg_match("/^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/", $email))

Замените на:
if(preg_match("/[0-9a-zA-Z\.\-_]{1,}@[0-9a-zA-Z\-_]{1,}\.[0-9a-zA-Z\-_]{1,}[\.0-9a-zA-Z]{0,}/", $email))
Ответ написан
furniture
@furniture Автор вопроса
консультант технолог
Похоже проблема на стороне mail.ru видать что-то там они настроили так что почта перестала приходить. Отписал в майл тикет в поддержку жду что ответят.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы