From mail(): Lines should not belarger than 70 characters. Not 76 and not 72!
(PHP 5, PHP 7, PHP 8)
iconv_mime_encode — Compõe um campo de cabeçalho MIME
Compõe e retorna uma string que representa um campo de cabeçalho MIME
válido,
semelhante ao seguinte:
Subject: =?ISO-8859-1?Q?Pr=FCfung_f=FCr?= Entwerfen von einer MIME kopfzeile
field_name
O nome do campo.
field_value
O valor do campo.
options
Você pode controlar o comportamento de iconv_mime_encode()
especificando um array associativo que contém itens de configuração
para as options
opcionais do terceiro parâmetro.
Os itens suportados por iconv_mime_encode() estão
listados abaixo. Observe que os nomes dos itens são tratados com distinção entre maiúsculas e minúsculas.
Item | Tipo | Descrição | Valor padrão | Exemplo |
---|---|---|---|---|
scheme | string |
Especifica o método para codificar um valor de campo. O valor
deste item pode ser "B" ou "Q", onde "B" significa
esquema de codificação base64 e "Q" significa esquema
de codificação quoted-printable .
|
B | B |
input-charset | string |
Especifica o conjunto de caracteres no qual o primeiro parâmetro
field_name e o segundo parâmetro
field_value são apresentados. Se não for fornecido,
iconv_mime_encode() assume que esses parâmetros
são apresentados a ele na configuração ini
iconv.internal_encoding
.
|
iconv.internal_encoding | ISO-8859-1 |
output-charset | string |
Especifica o conjunto de caracteres a ser usado para compor o
cabeçalho MIME .
|
iconv.internal_encoding | UTF-8 |
line-length | int | Especifica o comprimento máximo das linhas de cabeçalho. O cabeçalho resultante é "dobrado" em um conjunto de múltiplas linhas caso o campo do cabeçalho resultante seja maior que o valor deste parâmetro, de acordo com » RFC2822 - Internet Message Format. Se não for fornecido, o comprimento será limitado a 76 caracteres. | 76 | 996 |
line-break-chars | string |
Especifica a sequência de caracteres a ser anexada a cada linha
como um sinal de fim de linha quando a "dobragem" é executada em um campo de
cabeçalho longo. Se não fornecido, o padrão é "\r\n"
(CR LF ). Observe que
esse parâmetro é sempre tratado como uma string ASCII,
independentemente do valor de input-charset .
|
\r\n | \n |
Retorna um campo MIME
codificado em caso de sucesso
ou false
se ocorrer um erro durante a codificação.
Exemplo #1 Exemplo iconv_mime_encode()
<?php
$preferences = array(
"input-charset" => "ISO-8859-1",
"output-charset" => "UTF-8",
"line-length" => 76,
"line-break-chars" => "\n"
);
$preferences["scheme"] = "Q";
// Isto resulta em "Subject: =?UTF-8?Q?Pr=C3=BCfung=20Pr=C3=BCfung?="
echo iconv_mime_encode("Subject", "Prüfung Prüfung", $preferences);
$preferences["scheme"] = "B";
// Isto resulta em "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.