From mail(): Lines should not belarger than 70 characters. Not 76 and not 72!
(PHP 5, PHP 7, PHP 8)
iconv_mime_encode — Compone un campo de cabecera MIME
Compone y retorna un string que representa un campo de cabecera
MIME
válido que tiene una forma similar a:
Subject: =?ISO-8859-1?Q?Pr=FCfung_f=FCr?= Entwerfen von einer MIME kopfzeile
field_name
Nombre del campo.
field_value
Valor del campo.
preferences
Puede controlarse el comportamiento de
iconv_mime_decode() especificando un array
asociativo que contenga elementos de configuración al parámetro
opcional preferences
. Los elementos soportados
por iconv_mime_encode() son listados seguidamente.
Notar que en los nombres de los elementos se distinguen mayúsculas y
minúsculas.
Elemento | Tipo | Descripción | Valor por defecto | Ejemplo |
---|---|---|---|---|
scheme | string |
Especifica el método con el que codificar el valor de un campo. El
valor de este elemento puede ser tanto "B" como "Q", donde "B" se
usa para un esquema de codificación base64 y
"Q" para un esquema de codificación
quoted-printable .
|
B | B |
input-charset | string |
Especifica el set de caracteres con el que se muestran el primer
parámetro field_name y el segundo
field_value . Si no se da,
iconv_mime_encode() asume que esos parámetros
se muestran según lo indicado en el parámetro de coonfiguración
ini iconv.internal_encoding.
|
iconv.internal_encoding | ISO-8859-1 |
output-charset | string |
Especifica el set de caracteres a usar para componer la cabecera
MIME .
|
iconv.internal_encoding | UTF-8 |
line-length | integer | Especifica la longitud máxima de las líneas de la cabecera. La cabecera resultante se "desdobla" en varias líneas en caso de que el campo de la cabecera resultante sea más largo que el valor de este parámetro, de acuerdo con » RFC2822 - Internet Message Format. Si no se especifica, la longitud se limita a 76 caracteres. | 76 | 996 |
line-break-chars | string |
Especifica la secuencia de caracteres a añadir a cada línea como
signo de final de línea cuando ocurre el "desdoblamiento" de
campos de cabeceras largos. Si no se da, por defecto es "\r\n"
(CR LF ). Notar que este
parámetro siempre se trata como strings ASCII, sea cual sea el
valor de input-charset .
|
\r\n | \n |
En caso de éxito retorna un campo MIME
codificado o
false
si ha ocurrido un error durante la codificación.
Ejemplo #1 Ejemplo de 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 contiene "Subject: =?UTF-8?Q?Pr=C3=BCfung=20Pr=C3=BCfung?="
echo iconv_mime_encode("Subject", "Prüfung Prüfung", $preferences);
$preferences["scheme"] = "B";
// This yields "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.