From mail(): Lines should not belarger than 70 characters. Not 76 and not 72!
(PHP 5, PHP 7, PHP 8)
iconv_mime_encode — Bir MIME
başlık alanını tertipler
Örnekteki gibi, geçerli bir MIME
başlık alanını bir
dizge olarak tertipleyip döndürür:
Subject: Re: PHP =?utf-8?q?=C3=87eviri?= Grubu
alan_adı
Alan ismi.
alan_değeri
Alanın değeri.
seçenekler
İsteğe bağlı seçenekler
bağımsız değişkeninde
yapılandırma öğelerini içeren bir dizi belirterek
iconv_mime_encode() işlevinin davranışını
belirleyebilirsiniz. Desteklenen öğeler aşağıda listelenmiştir. Öğe
isimlerinin harf büyüklüğüne duyarlı oluşuna dikkat ediniz.
Öğe | Tür | Açıklama | Öntanımlı değer | Örnek |
---|---|---|---|---|
scheme | string |
Alan değerinin kodlanmasında kullanılacak yöntemi belirler. Bu
öğenin değeri "B" veya "Q" olabilir. "B" base64
kodlama şemasını, "Q" ise quoted-printable
kodlama şemasını betimler.
|
B | B |
input-charset | string |
alan_adı ve
alan_değeri bağımsız değişkenleri için girdi
karakter kümesini belirler. Belirtilmezse,
iconv.internal_encoding
INI yönergesinin değerinin kullanılacağı varsayılır.
|
iconv.internal_encoding | ISO-8859-1 |
output-charset | string |
MIME başlığını tertiplemekte kullanılacak
karakter kümesini belirler.
|
iconv.internal_encoding | UTF-8 |
line-length | integer | Başlık satırının azami uzunluğunu belirler. » RFC2822 - Genel Ağ İleti Biçemi belirtimine göre, bu değerden daha uzun bir başlık alanı satırı, en uzunu bu kadar baytlık satırlar halinde katlanır. Belirtilmezse, satır uzunluğu 76 karakterle sınırlanır. | 76 | 996 |
line-break-chars | string |
Uzun başlık alanlarına satır katlama uygulandığında satır sonlarına
eklenecek dizgeyi belirler. Belirtilmezse, "\r\n"
(CR LF ) öntanımlıdır.
Bu öğenin input-charset değerinden bağımsız
olarak daima bir ASCII dizge olarak ele alınacağına dikkat ediniz.
|
\r\n | \n |
Başarı durumunda kodlanmış MIME
alanı, aksi takdirde
false
döner.
Örnek 1 - iconv_mime_encode() örneği
<?php
$preferences = array(
"input-charset" => "ISO-8859-1",
"output-charset" => "UTF-8",
"line-length" => 76,
"line-break-chars" => "\n"
);
$preferences["scheme"] = "Q";
// Sonucu: "Subject: =?UTF-8?Q?Pr=C3=BCfung=20Pr=C3=BCfung?="
echo iconv_mime_encode("Subject", "Prüfung Prüfung", $preferences);
$preferences["scheme"] = "B";
// Sonucu: "Subject: =?UTF-8?B?UHLDvGZ1bmcgUHLDvGZ1bmc=?="
echo iconv_mime_encode("Subject", "Prüfung Prüfung", $preferences);
?>
From mail(): Lines should not belarger than 70 characters. Not 76 and not 72!
iconv_mime_encode() isn't directly suitable for encoding headers which include "specials" as described in RFC 1522 s4 & s5, for example
<?php
$mimeprefs = array ("scheme" => "Q",
"input-charset" => "utf-8",
"output-charset" => "utf-8",
"line-break-chars" => "\n");
$enc = iconv_mime_encode('From', '"Réal Namé" <user@example.com>', $prefs);
?>
will wrongly attempt to encode the angle brackets. To use the function in place of mb_encode_mimeheader(), instead you need to encode the words separately, removing the superfluous field name:
<?php
$encoded = "From: \"". preg_replace('/^:\s+/', '', iconv_mime_encode("", $real, $mimeprefs))."\" <$email>";
?>
Also, values of "line-length" greater than 76 would be illegal under RFC 1522 and resulting encoded words may not be recognised. (Not tested, but 72 would be safer.)
Looks like this function suffers from the same bug as mb_encode_mime() with long strings of non us-ascii characters. The function then returns false. This applies for utf-8 to utf-8 "conversion".
<?php
$subject = 'Вы находитесь здесь: Главная > продукт';
$prefs = array(
'scheme' => 'Q',
'input-charset' => 'UTF-8',
'output-charset' => 'UTF-8',
'line-length' => 76,
'line-break-chars' => "\r\n",
);
echo 'Original: ' . $subject . PHP_EOL;
$enc = iconv_mime_encode( 'Subject', $subject, $prefs );
var_dump( $enc ); // will show bool(false)
?>
As a workaround, you could explode() the value on spaces and encode each word separately. Then remove the "Subject: " in front of the resulting strings and join() them with "\r\n " (don't forget the SPACE after the \n) as separator.