Nasıl PHP'nin mail fonksiyonu ile Arapça içerikli e-posta gönderebilirim?

4 Cevap php

PHP'nin posta işlevini kullanarak Arapça içerikli e-postalar göndererek bir sorun yaşıyorum. Diyelim ki bu basit arapça bir dize var diyelim:

بريد

Ben başlıklarını kullanmak için çeşitli yollar denedim, ama e-posta içeriği tüm hala gibi bir şey ile sonuna kadar: X*X1X(X1Y X/. (Aşağıda işlevi görmek base64_encode sayesinde) arapça karakterleri kullanabilirsiniz Ancak, e-posta konu doğru biçimde kodlanmış

İşte ben denedim e-posta işlevleri biri

function sendSimpleMail($to,$from,$subject,$message) {
    $headers = 'MIME-Version: 1.0' ."\r\n";
    $headers .= 'To: '.$to ."\r\n";
    $headers .= 'From: '.$from . "\r\n";
    $headers .= 'Content-type: text/plain; charset=UTF-8; format=flowed' . "\r\n";
    $headers .= 'Content-Transfer-Encoding: 8bit'."\r\n";

    mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=',$message, $headers);
}

Bu hedefe ulaşmak için alternatif yollar üzerinde herhangi bir öneriniz?

4 Cevap

Ne yazık ki, 8bit kodlaması e-posta güvenilir değildir. Birçok posta taşıma acentaları posta vücuttaki her bayt üst bit kaldıracaktır. بريد "\xD8\xA8\xD8\xB1\xD9\x8A\xD8\xAF" UTF-8 bayt olduğunu; Bu bayt üst bit kaldırmak ve ASCII olsun "X(X1Y\nX/".

Bir posta vücuda ASCII olmayan karakterleri almak için yolu {[(3 gövdesini Content-Transfer-Encoding ya base64 veya quoted-printable için ayarlanır ve kodlamak için )]} ya da quoted_printable_encode, sırasıyla.

Bu kodlanmış biçimde okunabilirlik korur ve ASCII için daha etkili olduğu gibi, büyük ölçüde ASCII posta ise, (quoted-printable iyidir. Bütün posta Arap ise, base64 muhtemelen daha iyi olurdu seçim.)

        $boundary = uniqid(rand(), true);

        $headers  = "From: $from\n";
        $headers .= "MIME-Version: 1.0\n";
        $headers .= "Content-Type: multipart/alternative; boundary = $boundary\n";
        $headers .= "This is a MIME encoded message.\n\n";
        $headers .= "--$boundary\n" .
                    "Content-Type: text/plain; charset=UTF-8 \n" .
                    "Content-Transfer-Encoding: base64\n\n";
        $headers .= chunk_split(base64_encode($plaintext));
        $headers .= "--$boundary\n" .
                    "Content-Type: text/html; charset=ISO-8859-1\n" .
                    "Content-Transfer-Encoding: base64\n\n";
        $headers .= chunk_split(base64_encode($msg));
        $headers .= "--$boundary--\n" .


        mail($address, $subject, '', $headers);

Bu benim için çalışıyor.

Bu deneyin

$headers .= 'From: =?UTF-8?B?'.base64_encode($from). "\r\n";

Olduğu gibi-Sizin kod benim için çalışıyor.

Eğer $message geçerli bir UTF-8 dizesi içeren emin misiniz?