Frage

Ich bin ein bisschen besorgt, wenn diese Funktion E-Mails sendet, die korrekt auf der Mehrheit der E-Mail und Webmail-Clients so, wie es sollte erkannt werden können, und zwar ich bin sehr besorgt über diese Zweifel:

  • sind gut ausgebildet die UTF-8-Erklärungen und Anhänge?
  • Muss ich quoted_printable_decode () verwenden? Wenn ja, wo?
  • Content-Transfer-Encoding: 7 oder 8 Bit? Ich habe immer 7 gesehen, aber da ich eine UTF-8-codierte Mail zu senden Ich bin nicht sicher.
  • Sollte ich mb_send_mail () oder E-Mail () ist genug?

EDIT: Ich weiß nicht, warum, aber der Code korrekt nicht angezeigt, ich kann es zur Verfügung gestellt @ http://gist.github.com/104818

EDIT 2: Ich bin mir dessen bewusst andere Alternativen (Bibliotheken) für E-Mail-Handling, sondern wegen meiner eigenen Neugier und Wissen Ich möchte nur wissen, ob dieser Code 100% gut ist, oder wenn es 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;
}
War es hilfreich?

Lösung

Während das funktionieren sollte, würde ich empfehlen eine vorkompilierte Post / SMTP-Klasse wie http://tools.ietf.org/html/rfc2045#section-2.7 ).

Ich würde empfehlen, den Quoted-Printable verwenden ( http: //tools.ietf. org / html / RFC2045 # section-6.7 ) Content-Transfer-Encoding. Wo Sie trim(strip_tags($message, '<a>')) anrufen und trim($message) wollen Sie diejenigen mit quoted_printable_encode(trim(...)) einzuschließen.

  
      
  • Sollte ich mb_send_mail() oder mail() ist genug?
  •   

Wenn Sie wissen, dass Sie nicht gehen Multibyte Nachrichten zu Handling (Japanisch, Koreanisch, Chinesisch, etc.), dann sollte mail() genügen.

Nun, da ich Ihre ersten Fragen beantwortet haben, lassen Sie mich Ihnen sagen, wo einige Probleme gibt.

  1. Sie angeben, dass der Zeichensatz Ihrer Plain Text und HTML-Inhalt Teile sind UTF-8, jedoch ist es nicht angezeigt, wie Sie tatsächlich sicherzustellen, dass sie sind UTF-8 kodierten wirklich.
  2. Sie werden nach null in $to Überprüfung $bcc, $attachments, bevor Sie sie weiter verarbeiten, aber Sie tun nichts, wenn sie tatsächlich null werden können. Also, wenn Sie einen null für $to passieren zu erhalten, müssen Sie die Variable nicht verarbeiten, aber Sie weiterhin E-Mail senden an null.

Ab jetzt, das ist alles, was ich in gehen werde, aber ich werde immer noch zu sehr eine vorgefertigte Lösung empfehlen, da sie viele Benutzer / Zeit gehabt haben, um Fehler zu trainieren.

Andere Tipps

Ich bin für Roll-your-own in den meisten Situationen, aber wenn es auf die Post kommt würde ich von ganzem Herzen empfehlen es einfacher, an sich selbst zu machen und mit so etwas wie Swift Mailer oder PHPMailer (in dieser Reihenfolge, für mein Geld) .

Als Neben Bonus (und vorausgesetzt, Sie geben Antwort an, usw.), können Sie auch haben viel weniger Chancen als Spam markiert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top