Pergunta

Estou um pouco preocupado se esta função envia e-mails que podem ser reconhecidos corretamente na maioria dos e-mail e webmail clientes da maneira que deveria, especificamente eu estou mais preocupado com esta dúvida:

  • são os UTF-8 declarações e anexos bem formado?
  • Preciso uso quoted_printable_decode ()? Se sim, onde?
  • Content-Transfer-Encoding: 7 ou 8 bits? Eu sempre vi 7, mas desde que eu estou enviando um UTF-8 e-mail codificado eu não tenho certeza.
  • Devo usar mb_send_mail () ou correio () é suficiente?

EDIT: Eu não sei por que, mas o código não está aparecendo corretamente, eu fiz isso disponível @ http://gist.github.com/104818

EDIT 2: Eu estou ciente de outras alternativas (bibliotecas) para manuseio e-mail, mas por causa da minha própria curiosidade e conhecimento que eu só queria saber se esse código é 100% bom, ou se é de buggy .

function Email($name, $from, $to, $subject, $message, $bcc = null, $attachments = null)
{
    ini_set('SMTP', 'localhost');
    ini_set('sendmail_from', $from);

    $name = filter_var($name, FILTER_SANITIZE_STRING);
    $from = filter_var($from, FILTER_SANITIZE_EMAIL);
    $subject = filter_var($subject, FILTER_SANITIZE_STRING);

    $boundary = '_Boundary_' . md5(microtime(true) . mt_rand(0, PHP_INT_MAX));

    $headers = array
    (
        'MIME-Version: 1.0',
        'Content-Type: multipart/mixed; boundary="Mixed' . $boundary . '"',
        'Date: ' . date('r', time()),
        'From: "' . $name . '" <' . $from . '>',
        'Reply-To: "' . $name . '" <' . $from . '>',
        'Return-Path: "' . $name . '" <' . $from . '>',
        'X-Mailer: PHP ' . phpversion(),
        'X-Priority: 2',
        'X-MSMail-Priority: High',
        'X-Originating-IP: ' . $_SERVER['SERVER_ADDR'],
    );

    if (is_null($to) === false)
    {
        if (is_array($to) === false)
        {
            $to = explode(',', $to);
        }

        foreach ($to as $key => $value)
        {
            $to[$key] = filter_var($value, FILTER_SANITIZE_EMAIL);
        }

        $to = implode(', ', array_filter($to));
    }

    if (is_null($bcc) === false)
    {
        if (is_array($bcc) === false)
        {
            $bcc = explode(',', $bcc);
        }

        foreach ($bcc as $key => $value)
        {
            $bcc[$key] = filter_var($value, FILTER_SANITIZE_EMAIL);
        }

        $headers[] = 'BCC: ' . implode(', ', array_filter($bcc));
    }

    if (is_null($attachments) === false)
    {
        settype($attachments, 'array');

        foreach ($attachments as $key => $value)
        {
            if (is_file($value) === true)
            {
                $attachments[$key] = array
                (
                    '',
                    '--Mixed' . $boundary,
                    'Content-Type: application/octet-stream; name="' . basename($value) . '"',
                    'Content-Disposition: attachment; filename="' . basename($value) . '"',
                    'Content-Transfer-Encoding: base64',
                    '',
                    trim(chunk_split(base64_encode(file_get_contents($value)))),
                );

                $attachments[$key] = implode("\n", $attachments[$key]);
            }

            else
            {
                unset($attachments[$key]);
            }
        }

        $attachments = implode("\n", $attachments) . "\n";
    }

    $message = array
    (
        'This is a multi-part message in MIME format.',
        '',
        '--Mixed' . $boundary,
        'Content-Type: multipart/alternative; boundary="Alt' . $boundary . '"',
        '',
        '--Alt' . $boundary,
        'Content-Type: text/plain; charset="UTF-8"',
        'Content-Disposition: inline',
        'Content-Transfer-Encoding: 8bit',
        '',
        trim(strip_tags($message, '<a>')),
        '',
        '--Alt' . $boundary,
        'Content-Type: text/html; charset="UTF-8"',
        'Content-Disposition: inline',
        'Content-Transfer-Encoding: 8bit',
        '',
        trim($message),
        '',
        '--Alt' . $boundary . '--',
        $attachments,
        '--Mixed' . $boundary . '--',
    );

    if (@mail($to, stripslashes($subject), implode("\n", $message), implode("\n", $headers)) === true)
    {
        return true;
    }

    return false;
}
Foi útil?

Solução

Enquanto que deve funcionar, eu recomendaria fortemente usando uma classe pré-construídos Mail / SMTP, como Zend_Mail . Enquanto eu não acho que todo o Zend Framework é os pijamas do gato, eu tenho uma opinião muito boa de seu código de manipulação mail.

EDIT: Gostaria também de acrescentar que o uso de uma classe pré-construídos Mail / SMTP irá abstrato quase toda a complexidade / estrutura de e-mails de várias partes

.

Atualização 2009-05-06:. Respondendo a sua pergunta diretamente

  • são os UTF-8 declarações e anexos bem formado?

Eles parecem bastante decente.

  • Preciso uso quoted_printable_decode()? Se sim, onde?

No. Você iria querer usar quoted_printable_decode() apenas se estiver a descodificar uma mensagem de e-mail. Não quando você estiver codificando um. Se você usar quoted_printable_encode() ? Vou discutir isso em seguida.

  • Content-Transfer-Encoding: 7 ou 8 bits? Eu sempre vi 7, mas desde que eu estou enviando um UTF-8 e-mail codificado eu não tenho certeza.

Use apenas 8 bits codificação, se você sabe que o servidor SMTP de destino pode apoiá-lo. No entanto, desde que você está passando o seu e-mail off para o MTA local, eu não recomendo a definição deste valor. O valor padrão é a codificação de 7 bits, mas ele tem seu próprio conjunto de restrições: até 998 octetos por linha do intervalo de código 1-127 com CR e LF só permitiu a aparecer como parte da linha CRLF final ( http://tools.ietf.org/html/rfc2045#section-2.7 ).

Eu recomendo que você use o Citado de Impressão ( http: //tools.ietf. org / html / RFC2045 # section-6,7 ) Content-Transfer-Encoding. Onde você está chamando trim(strip_tags($message, '<a>')) e trim($message) você vai querer colocar aqueles com quoted_printable_encode(trim(...)).

  • Devo usar mb_send_mail() ou mail() é suficiente?

Se você sabe que está não vai ser lidar com mensagens de vários bytes (japonês, coreano, chinês, etc.), então mail() deve bastar.

Agora que eu já respondeu às suas perguntas iniciais, deixe-me dizer-lhe onde existem alguns problemas.

  1. Você está especificando que o conjunto de caracteres do seu texto simples e HTML peças de conteúdo são UTF-8, no entanto, ele não aparece como você está realmente garantir que eles realmente são UTF-8 codificado.
  2. Está a visitar para null em $to, $bcc, $attachments antes de mais processá-los, no entanto, você não está fazendo nada, quando eles podem realmente ser null. Então, se acontecer de você receber uma null para $to, você não processar a variável, mas você continuar a enviar um e-mail para null.

A partir de agora, isso é tudo que eu estou indo para ir em mas eu ainda vou recomendo uma solução pré-construído como eles tiveram muitos usuários / tempo para trabalhar fora bugs.

Outras dicas

Eu sou tudo para rolar o seu próprio na maioria das situações, mas quando se trata de e-mail eu recomendo vivamente tornando mais fácil em si mesmo e usar algo como Swift Mailer ou PHPMailer (nessa ordem, para o meu dinheiro) .

Como um side-bônus (e supondo que você especificar reply-to, etc), você também tem muito menos chance de ser marcado como spam.

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