If you wish to send the output of this function, simply use it for the headers argument of imap_mail() or mail(). Keep in mind that those functions set the To: and Subject: headers, so including them in the envelope will create double entries.
(PHP 4, PHP 5, PHP 7, PHP 8)
imap_mail_compose — Erzeugt eine MIME-Nachricht aus Kopf- und Nachrichtenelementen
Erzeugt eine MIME-konforme Nachricht aus den in
envelope
gegebenen Kopfelementen und den
Nachrichtenteilen aus bodies
.
envelope
Ein assoziatives Array von Kopfzeilenfeldern. Gültige Schlüssel sind:
"remail"
, "return_path"
,
"date"
, "from"
,
"reply_to"
, "in_reply_to"
,
"subject"
, "to"
,
"cc"
, "bcc"
und
"message_id"
, die die jeweiligen Kopfzeilen zum
angegebenen String definieren. Um zusätzliche Kopfzeilen zu
definieren, kann der Schlüssel "custom_headers"
verwendet werden, der ein Array von anderen Kopfzeilen erwartet, z. B.
["User-Agent: Mein Mail-Client"]
).
bodies
Ein Array mit dem Textkörper. Das erste Element des Arrays ist der
zentrale Teil der Nachricht. Nur wenn er vom Typ
TYPEMULTIPART
ist, werden die weiteren Elemente
verarbeitet. Die verarbeiteten Elemente bilden die Teile des Körpers.
Schlüssel | Typ | Beschreibung |
---|---|---|
type |
int |
Der MIME-Typ. Entweder TYPETEXT (Standard),
TYPEMULTIPART ,
TYPEMESSAGE ,
TYPEAPPLICATION ,
TYPEAUDIO , TYPEIMAGE ,
TYPEMODEL oder
TYPEOTHER .
|
encoding |
int |
Das Content-Transfer-Encoding . Entweder
ENC7BIT (Standard),
ENC8BIT , ENCBINARY ,
ENCBASE64 ,
ENCQUOTEDPRINTABLE oder
ENCOTHER .
|
charset |
string | Der Zeichensatz-Parameter des MIME-Typs. |
type.parameters |
array |
Ein assoziatives Array von
Content-Type -Parameternamen und deren Werten.
|
subtype |
string |
Der MIME-Subtyp, z. B. 'jpeg' für
TYPEIMAGE .
|
id |
string | Die Content-ID . |
description |
string | Die Content-Description . |
disposition.type |
string |
Die Content-Disposition , z. B.
'attachment' .
|
disposition |
array |
Ein assoziatives Array von
Content-Disposition -Parameternamen und deren
Werten.
|
contents.data |
string | Der Inhalt. |
lines |
int | Die Größe des Inhalts in Zeilen. |
bytes |
int | Die Größe des Inhalts in Bytes. |
md5 |
string | Die MD5-Prüfsumme des Inhalts. |
Gibt eine MIME-konforme Nachricht als String zurück.
Bei einem Fehler wird false
zurückgegeben.
Beispiel #1 imap_mail_compose()-Beispiel
<?php
$envelope["from"]= "joe@example.com";
$envelope["to"] = "foo@example.com";
$envelope["cc"] = "bar@example.com";
$part1["type"] = TYPEMULTIPART;
$part1["subtype"] = "mixed";
$filename = "/tmp/imap.c.gz";
$fp = fopen($filename, "r");
$contents = fread($fp, filesize($filename));
fclose($fp);
$part2["type"] = TYPEAPPLICATION;
$part2["encoding"] = ENCBINARY;
$part2["subtype"] = "octet-stream";
$part2["description"] = basename($filename);
$part2["contents.data"] = $contents;
$part3["type"] = TYPETEXT;
$part3["subtype"] = "plain";
$part3["description"] = "description3";
$part3["contents.data"] = "contents.data3\n\n\n\t";
$body[1] = $part1;
$body[2] = $part2;
$body[3] = $part3;
echo nl2br(imap_mail_compose($envelope, $body));
?>
If you wish to send the output of this function, simply use it for the headers argument of imap_mail() or mail(). Keep in mind that those functions set the To: and Subject: headers, so including them in the envelope will create double entries.
The documentation above does not mention that you can use the index ["charset"] to set the character set of the messsage part.
Example:
$part1["type"]= "TEXT";
$part1["subtype"]="PLAIN";
$part1["charset"] = "koi8-r";
to send a message in Russian-koi8.
Scott =)
It is a good idea to set the date header:
$envelope['date']=date('r');
For some email clients its necessary first to start with the body text and end with the attachment(s). Otherwise all the parts end up in attachments, also the body text (took a while to find this).
So example #1 (above) should be switched over, like:
$body[1] = $part1;
$body[2] = $part3;
$body[3] = $part2;
The custom_headers envelope documentation is misleading. Its not actually an "associative array", its a regular array of headers.
This is wrong:
<?php
$envelope = [
//...
"custom_headers" => [
"X-SES-CONFIGURATION-SET" => "example",
"X-SES-MESSAGE-TAGS" => "emailType=example"
]
];
?>
This is right:
<?php
$envelope = [
//...
"custom_headers" => [
"X-SES-CONFIGURATION-SET: example",
"X-SES-MESSAGE-TAGS: emailType=example"
]
];
?>
Since at least PHP 4.3 the $part[] hash can contain the $part['type.parameters'] which expects a hash.
Unfortunately for "hans at lintoo dot dk" there doesn't appear to have ever been $part['parameters.name'] or a $part['dparameters.filename']
So it would appear the corrected code for his function is
<?php
$part["type"] = TYPEAPPLICATION;
$part["encoding"] = ENCBASE64;
$part["subtype"] = "octet-stream";
$part["description"] = $file_name;
$part['disposition.type'] = 'attachment';
$part['disposition'] = array ('filename' => $file_name);
$part['type.parameters'] = array('name' => $file_name);
$part["contents.data"] = base64_encode(fread($file_handle,$file_size));
?>
While this correctly sets the header
Content-Type: application/octet-stream; name="file_name"
Content-Transfer-Encoding: BASE64
Content-Description: file_name
Content-Disposition: attachment; filename="file_name"
But this is still not a good idea to blanket set every attachment as a application/octet-stream so please consider using the unix command file, or Fileinfo functions (or even trusting file upload mimetype) and pay attention to the code from "derf dot m at reseaunix dot net"
At least the following items in $part[] hashes are parsed:
type
encoding
charset
subtype
id
description
disposition.type
disposition
contents.data
lines
bytes
md5
Note: $part['disposition'] is a hash:
$part['disposition.type'] = 'attachment';
$part['disposition'] = array ('filename'=>'file.txt');
This will transform in such part header:
Content-disposition: attachment; filename="file.txt"
So following on from their example, once you've composed your email with attachment or whatever, you'll probably want to send it.
since imap_mail(...) takes the message as body and re-encodes it, ignoring all the hard work you've done already.
Only real solution I found is to post it yourself:
// open connect to mail server
$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
if ($socket===false) {
die('Error: socket_create, '.socket_strerror(socket_last_error()));
}
$server="myserver.com"; // say 10.0.0.1 or whatever your mail sever is
$port=25; // again your mail server port, here generic smtp
if (socket_connect($socket,$server,$port)) {
print "Connection successful\n";
}else {
die('Error: socket_connect, '.socket_strerror(socket_last_error()));
}
// send it...
socket_write($socket,"HELO {$envelope["from"]}\n");
socket_write($socket,"MAIL FROM: {$envelope["from"]}\n");
socket_write($socket,"RCPT TO: {$envelope["to"]}\n");
socket_write($socket,"DATA\n");
socket_write($socket,"$message\n");
socket_write($socket,".\n");
socket_write($socket,"QUIT\n");
// done...
socket_close($socket);
Ofcourse the shell may work for you?
echo "Hello World" | mail -s "Greeting..." -a "attachSomeFile.txt" gspot@gmail.com
Here is a little something for attaching files... This is already documented in the manual, but my solution involves some changes. This is based on testing and suggestions from others notes on this page.
<?php
//snip
if (count($_FILES) > 0) {
$multipart["type"] = TYPEMULTIPART;
$multipart["subtype"] = "mixed";
$body[] = $multipart; //add multipart stuff
}
//snip
$uploaddir = ini_get("upload_tmp_dir"); //Get tmp upload dir from PHP.ini
foreach ($_FILES as $fieldName => $file) {
for ($i=0;$i < count($file['tmp_name']);$i++) {
if (is_uploaded_file($file['tmp_name'][$i])) {
$file_handle = fopen($file["tmp_name"][$i], "rb");
$file_name = $file["name"][$i];
$file_size = filesize($file["tmp_name"][$i]);
$part["type"] = TYPEAPPLICATION;
$part["encoding"] = ENCBASE64;
$part["subtype"] = "octet-stream";
$part["description"] = $file_name;
$part['disposition.type'] = 'attachment';
$part['disposition'] = array ('filename' => $file_name);
$part['dparameters.filename'] = $file_name;
$part['parameters.name'] = $file_name;
$part["contents.data"] = base64_encode(fread($file_handle,$file_size));
$body[] = $part;
unlink($file["tmp_name"][$i]);
}
}
}
//snip
?>
hope someone can use this...
Regards, Hans @ http://lintoo.dk/
I got a lot of problems with attachments (multipart emails) and the fix directly below this note.
instead just include it in the optional headers argument as previously suggested:
<?php
$mail = str_replace("\r","",imap_mail_compose($envelope, $body));
imap_mail($_POST["to"],$_POST["subject"],'',$mail);
?>
"Nothing like a fix on a fix".
If you want to copy the message to ie: a sent folder do:
<?php
//take note of the link: $this->mbox, and the constant: self::$imapStream
$envelope["to"] = $_POST["to"]; //included with imap_mail
$envelope["subject"] = $_POST["subject"]; //included with imap_mail
$mail = imap_mail_compose($envelope, $body); //note no problems with \r
imap_append($this->mbox,self::$imapStream."INBOX.Sent",$mail ,"\\Seen");
?>
See imap_append for more info.... Enjoy!