From mail(): Lines should not belarger than 70 characters. Not 76 and not 72!
(PHP 5, PHP 7, PHP 8)
iconv_mime_encode — Construye un encabezado MIME con los campos field_name y field_value
iconv_mime_encode() compone y devuelve una
cadena de caracteres que representa un campo
encabezado MIME
similar a:
Subject: =?ISO-8859-1?Q?Pr=FCfung_f=FCr?= Entwerfen von einer MIME kopfzeile
"Subject"
es el nombre
del campo y la parte que comienza por
"=?ISO-8859-1?..."
es el valor del campo.
field_name
El nombre del campo.
field_value
El valor del campo.
options
Puede controlarse el comportamiento de la función
iconv_mime_encode() especificando
un array asociativo que contenga la configuración de
los elementos en el parámetro options
.
La lista de elementos soportados por
iconv_mime_encode() se muestra a continuación.
Tenga en cuenta que los nombres de los elementos son sensibles a mayúsculas/minúsculas.
Elemento | Tipo | Descripción | Valor por omisión | Ejemplo |
---|---|---|---|---|
scheme | string |
Especifica el método de codificación de un campo. Los valores posibles son "B" o "Q" , donde
"B" indica que el esquema de codificación será base64 y "Q" ,
quoted-printable .
|
B | B |
input-charset | string |
Especifica el juego de caracteres para representar el primer parámetro
field_name y el segundo parámetro
field_value . Si se omite,
iconv_mime_encode()
utilizará la directiva de configuración
iconv.internal_encoding
de su php.ini para representarlos.
|
iconv.internal_encoding | ISO-8859-1 |
output-charset | string |
Especifica el juego de caracteres a utilizar para componer
el encabezado MIME .
|
iconv.internal_encoding | UTF-8 |
line-length | int | Especifica la longitud máxima de cada encabezado. Si el encabezado es mayor que la longitud definida por este parámetro, el encabezado resultante será un encabezado compuesto por varias líneas conforme al estándar » RFC2822 - Internet Message Format. Si se omite, la longitud máxima se establecerá en 76 caracteres. | 76 | 996 |
line-break-chars | string |
Especifica los caracteres de fin de línea. Si se omite, el valor por omisión será "\r\n"
(CR LF ). Tenga en cuenta que este parámetro siempre
se representa como una cadena ASCII en relación con el valor del parámetro
input-charset .
|
\r\n | \n |
Devuelve un campo MIME
en caso de éxito,
o false
si ocurre un error durante la codificación.
Ejemplo #1 Ejemplo con 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";
// Esto produce "Subject: =?UTF-8?Q?Pr=C3=BCfung=20Pr=C3=BCfung?="
echo iconv_mime_encode("Subject", "Prüfung Prüfung", $preferences);
$preferences["scheme"] = "B";
// Esto produce "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.