From mail(): Lines should not belarger than 70 characters. Not 76 and not 72!
(PHP 5, PHP 7, PHP 8)
iconv_mime_encode — Composes a MIME
header field
$field_name
, string $field_value
, array $options
= []
) : string|false
Composes and returns a string that represents a valid MIME
header field, which looks like the following:
Subject: =?ISO-8859-1?Q?Pr=FCfung_f=FCr?= Entwerfen von einer MIME kopfzeile
field_name
The field name.
field_value
The field value.
options
You can control the behaviour of iconv_mime_encode()
by specifying an associative array that contains configuration items
to the optional third parameter options
.
The items supported by iconv_mime_encode() are
listed below. Note that item names are treated case-sensitive.
Item | Type | Description | Default value | Example |
---|---|---|---|---|
scheme | string |
Specifies the method to encode a field value by. The value of
this item may be either "B" or "Q", where "B" stands for
base64 encoding scheme and "Q" stands for
quoted-printable encoding scheme.
|
B | B |
input-charset | string |
Specifies the character set in which the first parameter
field_name and the second parameter
field_value are presented. If not given,
iconv_mime_encode() assumes those parameters
are presented to it in the
iconv.internal_encoding
ini setting.
|
iconv.internal_encoding | ISO-8859-1 |
output-charset | string |
Specifies the character set to use to compose the
MIME header.
|
iconv.internal_encoding | UTF-8 |
line-length | int | Specifies the maximum length of the header lines. The resulting header is "folded" to a set of multiple lines in case the resulting header field would be longer than the value of this parameter, according to » RFC2822 - Internet Message Format. If not given, the length will be limited to 76 characters. | 76 | 996 |
line-break-chars | string |
Specifies the sequence of characters to append to each line
as an end-of-line sign when "folding" is performed on a long header
field. If not given, this defaults to "\r\n"
(CR LF ). Note that
this parameter is always treated as an ASCII string regardless
of the value of input-charset .
|
\r\n | \n |
Returns an encoded MIME
field on success,
or false
if an error occurs during the encoding.
Example #1 iconv_mime_encode() example
<?php
$preferences = array(
"input-charset" => "ISO-8859-1",
"output-charset" => "UTF-8",
"line-length" => 76,
"line-break-chars" => "\n"
);
$preferences["scheme"] = "Q";
// This yields "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é" <[email protected]>', $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.