web-dev-qa-db-ja.com

PHP件名フィールドに特殊文字をメールで送信

PHP mail()関数で送信されるHTMLメールの件名に特殊文字を挿入したいと思います。

私は私の主題をこのように見せたいです:

★あなたの新しいアカウント

★(★)のようなHTMLエンティティを使用するか、コードに記号を直接貼り付けてみましたが、いくつかの電子メールクライアントを除いて、どちらも機能しません。

$to = '[email protected]';
$subject = '★ Your new account or ★ Your new account';
$message = 'HTML message...';

$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
$headers .= 'From: Me <[email protected]>' . "\r\n";

mail($to, $subject, $message, $headers);

これを正しく機能させる方法について何かアドバイスはありますか?ありがとうございました。

14
MrUpsidown

件名を試してください:

$sub = '=?UTF-8?B?'.base64_encode($subject).'?=';

その後:

mail($to, $sub, $message, $headers);
34
Lkopo

受け入れられた回答は正常に機能しますが、生のヘッダーを見るときに件名を読むことは不可能になります。これは、行を読みやすくし、ほとんどがASCII文字で構成されている場合は短くする代替手段です。

_$subject = '=?UTF-8?q?' . quoted_printable_encode($subject) . '?=';
_

承認された回答のエンコードされた件名は次のとおりです。

_=?UTF-8?B?4piFIFlvdXIgbmV3IGFjY291bnQ=?=
_

これが私の答えのエンコードされた件名です:

_=?UTF-8?q?=E2=98=85 Your new account?=
_

編集:

quoted_printable_encode()は、RFC 2045で要求されているように、長い文字列を最大75文字の複数行に分割します。これにより、mail()の_$subject_パラメータでは使用できない文字列になります。 。これを修正するための更新バージョンは次のとおりです。また、純粋なASCIIサブジェクトのエンコードも回避します。

_/**
 * Make sure the subject is ASCII-clean
 *
 * @param string $subject Subject to encode
 *
 * @return string Encoded subject
 */
function getEncodedSubject(string $subject): string {
    if (!preg_match('/[^\x20-\x7e]/', $subject)) {
        // ascii-only subject, return as-is
        return $subject;
    }
    // Subject is non-ascii, needs encoding
    $encoded = quoted_printable_encode($subject);
    $prefix = '=?UTF-8?q?';
    $suffix = '?=';
    return $prefix . str_replace("=\r\n", $suffix . "\r\n  " . $prefix, $encoded) . $suffix;
}
_

説明:

_$subj = "Lorem ipsuöm dolor sit amet, consectetur adipiscing elit. Praesent mattis molestie purus, non semper lectus dictum eget.";
_

_quoted_printable_encode_の後

_Lorem ipsu=C3=B6m dolor sit amet, consectetur adipiscing elit. Praesent mat=
tis molestie purus, non semper lectus dictum eget.
_

_str_replace_の後

_=?UTF-8?q?Lorem ipsu=C3=B6m dolor sit amet, consectetur adipiscing elit. Praesent mat?=
  =?UTF-8?q?tis molestie purus, non semper lectus dictum eget.?=
_
6
jlh
 $headers="";    
 $message = utf8_encode($message);
 $message = wordwrap($message, 70, "\r\n");
 $subject = '=?UTF-8?B?'.base64_encode(utf8_encode($subject)).'?=';
 $to_name = '=?UTF-8?B?'.base64_encode(utf8_encode($to_name)).'?=';
 $from_name = '=?UTF-8?B?'.base64_encode(utf8_encode($from_name)).'?=';

 $headers .= "MIME-Version: 1.0" . "\r\n"; 
 $headers .= "Content-type: text/plain; charset=utf-8" . "\r\n"; 
 //$headers .= "Content-Transfer-Encoding: quoted-printable" . "\r\n"; 
 $headers .= "From: $from_name <$from_email>" . "\r\n"; 
 $headers .= "To: $to_name <$to_email>" . "\r\n";
 $headers .= "Subject: $subject" . "\r\n";
 $headers .= "X-Mailer: PHP/" . phpversion();  

 mail("", $subject, $message, $headers); 
0
emmanuel