"PHP" / Говнокод #16892 Ссылка на оригинал

0

  1. 1
mail("your-mail@mail.ru", "Тема письма", "Текст письма");

Заметка из цикла "О вреде копипаста".
Коллега попросил разобраться, отчего почта не приходит. Пять лет программирования на PHP, говорил он, когда устраивался к нам в контору... Вопрос один: как его вообще на работу взяли?..

Запостил: gmihalkov gmihalkov, (Updated )

Комментарии (46) RSS

    • Может быть "Текст письма" надо явно кодировать, чтобы почтовый клиент на той стороне понял, что там cp1251 (PHP же плохо с UTF-8), а не неизвестные не-ASCII символы.

      В Python вон для этого целый модуль есть: https://docs.python.org/2/library/email.html
      Ответить
        • Ну я полагаю, оно требует отдельного костыля (mbstring), из-за чего разработчики предпочитают однобайтные кодировки.
          Ответить
          • Эм, а причем здесь «почта не приходит»?

            Какого полового члена мне над формой для коммента написало «Где здесь C++, DesmondHume?!». Вот я откуда знаю, где здесь C++? Почему меня PHP троллит? 🙁
            Ответить
          • Ну да, иногда бывает морально тяжело писать mb_substr вместо квадратных скобок, чтобы извлечь единственный символ, или писать костыли для извлечения кодов символов (с которыми мне пришлось недавно столкнуться, чтобы писать вот таким курсивом: 𝓡𝓮𝓶𝓮𝓶𝓫𝓮𝓻 𝓽𝓱𝓮 𝓰𝓸𝓸𝓭 𝓸𝓵𝓭 𝓷𝓲𝓷𝓮𝓽𝓮𝓮𝓷 𝓮𝓲𝓰𝓱𝓽𝓲𝓮𝓼, 𝓦𝓱𝓮𝓷 𝓽𝓱𝓲𝓷𝓰𝓼 𝔀𝓮𝓻𝓮 𝓼𝓸 𝓾𝓷𝓬𝓸𝓶𝓹𝓵𝓲𝓬𝓪 𝓽𝓮𝓭), но здесь не тот случай. Самое страшное, что может понадобиться для отправки е-мейла, предложил некто pavel.lint at vk.com в комментариях к докам:
            function mail_utf8($to, $from_user, $from_email, 
                                                         $subject = '(No subject)', $message = '')
               { 
                  $from_user = "=?UTF-8?B?".base64_encode($from_user)."?=";
                  $subject = "=?UTF-8?B?".base64_encode($subject)."?=";
            
                  $headers = "From: $from_user <$from_email>\r\n". 
                           "MIME-Version: 1.0" . "\r\n" . 
                           "Content-type: text/html; charset=UTF-8" . "\r\n"; 
            
                 return mail($to, $subject, $message, $headers); 
               }


            Всё. Само сообщение перекодировать не нужно (если основная кодировка у нас UTF-8), поле From тоже можно не кодировать, если там название ящика без юзерфрендли-имени.
            Ответить
  • Почему-то, в последнее время, у дилетантов из мейнстрима стало модным смеяться над "незнанием" коллег. В доисторические времена, нас, древних пионеров, учили, что если кто-то что-то не знает, а ты, соответственно, знаешь, то нужно вовсе не смеяться, а научить товарища. Искренне. С душой. Хорошие были времена.
    Добрые.
    --
    А что касается почты, то почта может "не доходить" в следующих случаях:
    1. Закрыты порты на уровне "системы", - желательно приверить "файрволы" всякие.
    2. Неправильно настроен sendmail (в php.ini в том числе - пр-р): "sendmail_path = /usr/sbin/sendmail -t -i -f noreply@site.com"
    3. А также страшные фильтры основных почтовых сервисов (по заголовкам, да по содержанию), которые, пожалуй, похлеще мегафоновской анархии.
    Ответить
    • Бывает ещё, что почта уходит, но попадает в спам из-за того, что у домена отсутствует PTR-запись (либо она разрешается в домен, которому соответствует другой айпишник) и|или SPF-запись.
      Ответить
      • Попадались украинские сервисы, которые фильтруют по user-agent, если там фигурирует что-то не из известных, то сразу в спам. Т.е. там вайт-лист, а не блек-лист даже.
        Ответить
        • > фильтруют по user-agent
          А смысл? Ведь любой уважающий себя спамер впишет популярный UA.
          Ответить
          • Ключевой момент — уважающий себя. По сети гуляет слишком много спама, у которого заголовки составлены через жопу.

            А так да, похапешники любят менять UA на Аутглюк и даже добавлять заголовок X-MimeOLE:, потому что по их поверью в противном случае письмо уйдёт в спам.

            P.S. Кстати, нет стандарта, как штамповать UA в письме. Мозилловские агенты пишут заголовок User-Agent (как в браузере), а остальные популярные пишут заголовок X-Mailer.
            Ответить
    • Вообще-то почта в данном случае не приходит, потому что ящик взят из какого-то левого примера в сети. Говнокодистость в том, что чувак с 5-летним стажем не знает, как написать вызов функции mail() и копипастит этот вызов из гугля.

      Ненавижу разжевывать очевидное.
      Ответить
      • Скажи, зачем ты влез во все темы про пхп. Ты просто ничего другого не знаешь?
        Ответить
  • Занял адрес <твоё@е-письмо.рф>.

    Выяснил, что <input type="email"> (HTML5) в некоторых браузерах не пропускает такие адреса.

    Также выяснил, что для отправки письма на такой адрес из пышечки придётся домен перекодировать в Punycode (xn--...).
    Ответить

Добавить комментарий

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8