imap_mail_compose

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_mail_compose根据给定的信封和正文部分创建 MIME 消息

说明

imap_mail_compose(array $envelope, array $bodies): string|false

根据给定的 envelopebodies 部分创建 MIME 消息。

参数

envelope

一个包含标题字段的关联数组。有效键为:"remail""return_path""date""from""reply_to""in_reply_to""subject""to""cc""bcc""message_id",它们将各自的消息头设置为给定的 string。要设置其他头,支持键 "custom_headers",它期望包含这些头的数组,例如 ["User-Agent: My Mail Client"]

bodies

一个包含正文的索引数组。第一个正文是消息的主体;只有当它的类型为 TYPEMULTIPART 时,才会处理其他正文;这些正文构成部分的正文。

正文数组结构
类型 说明
type int MIME 类型。其中之一为 TYPETEXT(默认)、TYPEMULTIPARTTYPEMESSAGETYPEAPPLICATIONTYPEAUDIOTYPEIMAGETYPEMODELTYPEOTHER
encoding int The Content-Transfer-Encoding。其中之一为 ENC7BIT(默认)、ENC8BITENCBINARYENCBASE64ENCQUOTEDPRINTABLEENCOTHER
charset string MIME 类型的字符集参数。
type.parameters array 一个包含 Content-Type 参数名称及其值的关联 array
subtype string MIME 子类型,例如 'jpeg' 用于 TYPEIMAGE
id string The Content-ID
description string The Content-Description
disposition.type string The Content-Disposition,例如 'attachment'
disposition array 一个包含 Content-Disposition 参数名称及其值的关联 array
contents.data string 有效载荷。
lines int 有效载荷的行数。
bytes int 有效载荷的字节数。
md5 string 有效载荷的 MD5 校验和。

返回值

将 MIME 消息作为 string 返回,或在失败时返回 false

示例

示例 #1 imap_mail_compose() 示例

<?php

$envelope
["from"]= "[email protected]";
$envelope["to"] = "[email protected]";
$envelope["cc"] = "[email protected]";

$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));

?>

添加注释

用户贡献的注释 10 个注释

up
5
jvandeweghe at kipsu dot com
7 年前
custom_headers 信封文档具有误导性。它实际上不是一个“关联数组”,而是一个普通的头数组。

这是错误的

<?php
$envelope
= [
//...
"custom_headers" => [
"X-SES-CONFIGURATION-SET" => "example",
"X-SES-MESSAGE-TAGS" => "emailType=example"
]
];
?>

这是正确的

<?php
$envelope
= [
//...
"custom_headers" => [
"X-SES-CONFIGURATION-SET: example",
"X-SES-MESSAGE-TAGS: emailType=example"
]
];
?>
up
3
prices at dflytech dot com
22 年前
上面的文档没有提到您可以使用索引 ["charset"] 来设置消息部分的字符集。

示例

$part1["type"]= "TEXT";
$part1["subtype"]="PLAIN";
$part1["charset"] = "koi8-r";

用俄语-koi8发送邮件。

Scott =)
up
3
Los Olvidados
21 年前
如果要发送此函数的输出,只需将其用于 imap_mail() 或 mail() 的 headers 参数。请记住,这些函数会设置 To: 和 Subject: 标头,因此在信封中包含它们会创建重复项。
up
2
thomas dot hebinck at digionline dot de
20 年前
设置日期标头是个好主意
$envelope['date']=date('r');
up
2
Guido
15 年前
对于某些电子邮件客户端,必须先以正文开头,以附件结尾。否则所有部分最终都会出现在附件中,包括正文(找到这一点花了很长时间)。

因此,示例 #1(以上)应该被切换,例如

$body[1] = $part1;
$body[2] = $part3;
$body[3] = $part2;
up
0
Freman
17 年前
至少从 PHP 4.3 开始,$part[] 哈希可以包含 $part['type.parameters'],它期望一个哈希。

不幸的是,对于“hans at lintoo dot dk”,似乎从来没有过 $part['parameters.name'] 或 $part['dparameters.filename']

因此,他的函数的修正代码似乎是

<?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));
?>
虽然这正确地设置了标头

Content-Type: application/octet-stream; name="file_name"
Content-Transfer-Encoding: BASE64
Content-Description: file_name
Content-Disposition: attachment; filename="file_name"

但这仍然不是一个好主意,因为将每个附件都设置为 application/octet-stream,所以请考虑使用 unix 命令文件或 Fileinfo 函数(甚至信任文件上传 MIME 类型)并注意来自“derf dot m at reseaunix dot net”的代码。
up
0
trionon at mail dot ru
22 年前
至少 $part[] 哈希中的以下项会被解析

type
encoding
charset
subtype
id
description
disposition.type
disposition
contents.data
lines
bytes
md5

注意:$part['disposition'] 是一个哈希

$part['disposition.type'] = 'attachment';
$part['disposition'] = array ('filename'=>'file.txt');

这将转换为这样的部分标头

Content-disposition: attachment; filename="file.txt"
up
-1
coxsterdillon at hotmail dot com
10 年前
因此,遵循他们的示例,在您完成带有附件或其他内容的电子邮件的撰写后,您可能想要发送它。

因为 imap_mail(...) 将消息作为正文并重新编码它,忽略您已经完成的所有艰苦工作。

我找到的唯一真正的解决方案是自己发布它

// 打开到邮件服务器的连接
$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
if ($socket===false) {
die('错误:socket_create,'.socket_strerror(socket_last_error()));
}

$server="myserver.com"; // 例如 10.0.0.1 或您的邮件服务器的任何地址
$port=25; // 您的邮件服务器端口,这里是通用的 SMTP
if (socket_connect($socket,$server,$port)) {
print "连接成功\n";
}else {
die('错误:socket_connect,'.socket_strerror(socket_last_error()));
}

// 发送...
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");

// 完成...
socket_close($socket);

当然,shell 可能会对您有用?

echo "Hello World" | mail -s "Greeting..." -a "attachSomeFile.txt" [email protected]
up
-2
hans at lintoo dot dk
18 年前
这里有一些关于附件文件的东西... 这已经在手册中记录了,但我的解决方案涉及一些更改。这是基于测试和来自此页面上其他注释的建议。
<?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
?>
希望有人能用得上...
致敬,Hans @ http://lintoo.dk/
up
-2
hans at lintoo dot dk
18 年前
我在附件(多部分电子邮件)方面遇到了很多问题,修复方法就在这个注释的正下方。
相反,只需将其包含在可选的 headers 参数中,如前所述

<?php
$mail
= str_replace("\r","",imap_mail_compose($envelope, $body));
imap_mail($_POST["to"],$_POST["subject"],'',$mail);
?>
"修复之上的修复"。

如果您想将消息复制到例如“已发送”文件夹,请执行以下操作
<?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");
?>
有关更多信息,请参阅 imap_append.... 尽情享受!
To Top