1. PHP / Говнокод #16892

    +155

    1. 1
    mail("[email protected]", "Тема письма", "Текст письма");

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

    Запостил: gmihalkov, 19 Октября 2014

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

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

        В Python вон для этого целый модуль есть: https://docs.python.org/2/library/email.html
        Ответить
        • Что в PHP плохо с UTF-8?
          Ответить
          • Ну я полагаю, оно требует отдельного костыля (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 тоже можно не кодировать, если там название ящика без юзерфрендли-имени.
              Ответить
    • Эм. Что здесь не так?
      Ответить
    • чувак с таким крутым майлом был очень доволен
      Ответить
      • А ведь правда, ящик существует. И [email protected], [email protected] тоже существуют. И даже [email protected] и [email protected] заняты, а в Гмейле и в Яху логин с минусом создать нельзя.

        Ушёл регать [email protected] и [email protected].

        P.S. Сделал. Флудить и троллить не могу, ГК просит подождать неделю.
        Ответить
      • Больше ада: [email protected] и [email protected] свободны... были.
        Ответить
        • Ещё надо занять аналогичный кириллический адрес на письмо.рф для порядка.

          > ГК просит подождать неделю.
          Это была учётка "your-mail" на ГК или просто с адресом your-mail@питунея?
          Ответить
          • Попробовал войти через OpenID (your-mail.id.list.ru), ГК тут же предложил создать учётку с ником Your-mail.

            P.S. Надо ещё посмотреть плейсхолдеры в популярных CMS и на популярных сайтах.
            Ответить
    • Почему-то, в последнее время, у дилетантов из мейнстрима стало модным смеяться над "незнанием" коллег. В доисторические времена, нас, древних пионеров, учили, что если кто-то что-то не знает, а ты, соответственно, знаешь, то нужно вовсе не смеяться, а научить товарища. Искренне. С душой. Хорошие были времена.
      Добрые.
      --
      А что касается почты, то почта может "не доходить" в следующих случаях:
      1. Закрыты порты на уровне "системы", - желательно приверить "файрволы" всякие.
      2. Неправильно настроен sendmail (в php.ini в том числе - пр-р): "sendmail_path = /usr/sbin/sendmail -t -i -f [email protected]"
      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--...).
      Ответить

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