質問

この関数が、大部分の電子メールおよびウェブメールクライアントで正しく認識できる電子メールを送信するかどうか、少し心配です。具体的には、この疑問について最も懸念しています:

  • UTF-8の宣言と添付ファイルは整形式ですか?
  • quoted_printable_decode()を使用する必要がありますか?はいの場合、どこですか?
  • Content-Transfer-Encoding:7または8ビット?私はいつも7を見てきましたが、UTF-8でエンコードされたメールを送信しているのでわかりません。
  • mb_send_mail()またはmail()を使用すれば十分ですか?

編集:理由はわかりませんが、コードが正しく表示されません。@ http://gist.github.com/104818

編集2:メール処理の他の選択肢(ライブラリ)を知っていますが、私自身の好奇心と知識のために、このコードが100%良いか、バグがあるかを知りたいだけです。 。

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;
}
役に立ちましたか?

解決

これは機能するはずですが、 Zend_Mail 。 Zend Framework全体が猫のパジャマだとは思いませんが、メール処理コードについては非常に良い意見があります。

編集:事前に構築されたMail / SMTPクラスを使用すると、マルチパートメールのほぼすべての複雑さ/構造が抽象化されることも追加する必要があります。

2009年5月6日更新:質問に直接回答する。

  
      
  • UTF-8の宣言と添付ファイルは整形式ですか?
  •   

十分に見栄えが良い。

  
      
  • quoted_printable_decode()を使用する必要がありますか?はいの場合、どこですか?
  •   

いいえ。 quoted_printable_encode()は、電子メールメッセージをデコードする場合にのみ使用します。エンコードするときではありません。 trim(strip_tags($message, '<a>')) を使用する必要がありますか?次にこれについて説明します。

  
      
  • Content-Transfer-Encoding:7または8ビット?私はいつも7を見てきましたが、UTF-8でエンコードされたメールを送信しているのでわかりません。
  •   

送信先SMTPサーバーがサポートできることがわかっている場合にのみ、8ビットエンコーディングを使用します。ただし、メールをローカルMTAに渡すため、この値を設定することはお勧めしません。デフォルト値は7ビットエンコーディングですが、独自の制限があります。コード範囲1〜127の行ごとに最大998オクテットで、CRおよびLFはCRLF行末の一部としてのみ許可されます( http://tools.ietf.org/html/rfc2045#section-2.7 )。

>

Quoted-Printable( http://tools.ietfを使用することをお勧めします。 org / html / rfc2045#section-6.7 )Content-Transfer-Encoding。 trim($message)quoted_printable_encode(trim(...))を呼び出す場所は、それらをmb_send_mail()で囲みます。

  
      
  • mail()またはnullで十分ですか?
  •   

マルチバイトメッセージ(日本語、韓国語、中国語など)を処理することがないであることがわかっている場合は、$toで十分です。

最初の質問に答えました。問題がどこにあるのか教えてください。

  1. プレーンテキストとHTMLコンテンツパーツの文字セットがUTF-8であることを指定していますが、実際にUTF-8エンコードされていることを実際に確認しているため、表示されません。
  2. さらに処理する前に$bcc$attachments、<=>で<=>をチェックしていますが、実際に<=>である可能性がある場合は何もしていません。したがって、たまたま<=>の<=>を受け取った場合、変数は処理しませんが、引き続き<=>にメールを送信します。

今のところ、これですべてです。しかし、バグを解決するために多くのユーザー/時間があったため、ビルド済みのソリューションを強くお勧めします。

他のヒント

ほとんどの状況で自分で転がすことはすべてですが、メールに関しては、自分で簡単にできるようにして Swift Mailer または PHPMailer (この順序で、私のお金のために) 。

おまけとして(および返信先などを指定すると仮定すると)、スパムとしてタグ付けされる可能性がはるかに低くなります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top