imap_append

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

imap_append将字符串消息追加到指定的邮箱

描述

imap_append(
    IMAP\Connection $imap,
    string $folder,
    string $message,
    ?string $options = null,
    ?string $internal_date = null
): bool

将字符串 message 追加到指定的 folder

参数

imap

一个 IMAP\Connection 实例。

folder

邮箱名称,有关更多信息,请参见 imap_open()

警告

除非 imap.enable_insecure_rsh 已禁用,否则将不受信任的数据传递给此参数是不安全的。

message

要追加的消息,以字符串形式

在与 Cyrus IMAP 服务器通信时,您必须使用“\r\n”作为您的行尾终止符,而不是“\n”,否则操作将失败

options

如果提供,options 也将写入 folder

internal_date

如果设置了此参数,它将设置追加消息的 INTERNALDATE。参数应为符合 rfc2060 规范的日期字符串,用于日期时间值。

返回值

成功时返回 true,失败时返回 false

变更日志

版本 描述
8.1.0 imap 参数现在需要一个 IMAP\Connection 实例;以前需要一个有效的 imap 资源
8.0.0 optionsinternal_date 现在是可空的。

范例

范例 #1 imap_append() 范例

<?php
$imap
= imap_open("{imap.example.org}INBOX.Drafts", "username", "password");

$check = imap_check($imap);
echo
"Msg Count before append: ". $check->Nmsgs . "\n";

imap_append($imap, "{imap.example.org}INBOX.Drafts"
, "From: [email protected]\r\n"
. "To: [email protected]\r\n"
. "Subject: test\r\n"
. "\r\n"
. "this is a test message, please ignore\r\n"
);

$check = imap_check($imap);
echo
"Msg Count after append : ". $check->Nmsgs . "\n";

imap_close($imap);
?>

添加备注

用户贡献的备注 18 个备注

rixsta at hotmail dot com
11 年前
您好,

由于我们一直在努力解决这个问题,因此我想分享我们如何让 imap_append 与所有 MIME 部分(包括附件)一起正常工作。如果您要发送电子邮件并希望将已发送的邮件追加到“已发送邮件”文件夹,我认为没有比以下方法更简单的方法了

1) 使用 SwiftMailer 通过 PHP 发送邮件。
$message = Swift_Message::newInstance("Subject goes here");
(然后添加发件人、收件人、正文、附件等)
$result = $mailer->send($message);

2) 在上面的步骤 1) 中构造邮件时,将其保存到一个变量中,如下所示

$msg = $message->toString(); (这将创建 imap_append() 所需的完整 MIME 邮件!在此之后,您可以像这样调用 imap_append

imap_append($imap_conn,$mail_box,$msg."\r\n","\\Seen");

我希望这能帮助读者,并防止人们像我们最初做的那样手工制作 MIME 邮件 :-0
bill at dyndns dot org
12 年前
以下是我在使用此函数时如何处理附件的。我借鉴了其他所有人的示例,但使其更容易更清晰地修改。

<?php
$authhost
="{000.000.000.000:993/validate-cert/ssl}Drafts";

$user="sadasd";
$pass="sadasd";

if (
$mbox=imap_open( $authhost, $user, $pass))
{
$dmy=date("d-M-Y H:i:s");

$filename="filename.pdf";
$attachment = chunk_split(base64_encode($filestring));

$boundary = "------=".md5(uniqid(rand()));

$msg = ("From: Somebody\r\n"
. "To: [email protected]\r\n"
. "Date: $dmy\r\n"
. "Subject: This is the subject\r\n"
. "MIME-Version: 1.0\r\n"
. "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"
. "\r\n\r\n"
. "--$boundary\r\n"
. "Content-Type: text/html;\r\n\tcharset=\"ISO-8859-1\"\r\n"
. "Content-Transfer-Encoding: 8bit \r\n"
. "\r\n\r\n"
. "Hello this is a test\r\n"
. "\r\n\r\n"
. "--$boundary\r\n"
. "Content-Transfer-Encoding: base64\r\n"
. "Content-Disposition: attachment; filename=\"$filename\"\r\n"
. "\r\n" . $attachment . "\r\n"
. "\r\n\r\n\r\n"
. "--$boundary--\r\n\r\n");

imap_append($mbox,$authhost,$msg, "\\Draft");

imap_close($mbox);
}
else
{
echo
"<h1>FAIL!</h1>\n";
}

?>

希望这能帮助到某些人。
nanomoow at gmail dot com
7 年前
// 这对我有效,一个更好的版本:].
<?php
$fn
= 'filename.zip';
$IMAPhost = 'imap.hostname.com';
// IMAP 端口 143、995 或 POP3 端口 110、995
$IMAPport = '143';
$IMAPssl = 'tls';
$IMAP = '{'.$IMAPhost.':'.$IMAPport.'/imap/'.$IMAPssl.'/novalidate-cert}';
$IMAPuser = '[email protected]';
$msg ='Message text <h1 style="color: #093"> Hello </h1>';
// imap 邮箱和密码
$ibox = imap_open($IMAP, $_SESSION['email'], $_SESSION['pass']);
$dmy=date("Y-m-d H:i:s");
// 打包文件内容
$attachment = chunk_split(base64_encode(file_get_contents('tmp/'.$fn)));

$boundary1 = "###".md5(microtime())."###";
$boundary2 = "###".md5(microtime().rand(99,999))."###";
imap_append($ibox, $IMAP."Send"
, "From: Hello <".$IMAPuser.">\r\n"
. "To: ".$email."\r\n"
. "Date: $dmy\r\n"
. "Subject: ".quoted_printable_encode($sub)."\r\n"
. "MIME-Version: 1.0\r\n"
. "Content-Type: multipart/mixed; boundary=\"$boundary1\"\r\n"
. "\r\n\r\n"
. "--$boundary1\r\n"
. "Content-Type: multipart/alternative; boundary=\"$boundary2\"\r\n"
. "\r\n\r\n"
// 添加纯文本数据
. "--$boundary2\r\n"
. "Content-Type: text/plain; charset=\"utf-8\"\r\n"
. "Content-Transfer-Encoding: quoted-printable\r\n"
. "\r\n\r\n"
. $msg."\r\n"
. "\r\n\r\n"
// 添加 HTML 内容
. "--$boundary2\r\n"
. "Content-Type: text/html; charset=\"utf-8\"\r\n"
. "Content-Transfer-Encoding: quoted-printable \r\n"
. "\r\n\r\n"
. html_entity_decode($msg)."\r\n"
. "\r\n\r\n"
. "--$boundary2\r\n"
. "\r\n\r\n"
// 添加附件
. "--$boundary1\r\n"
. "Content-Type: image/gif; name=\"$fn\"\r\n"
. "Content-Transfer-Encoding: base64\r\n"
. "Content-Disposition: attachment; filename=\"$fn\"\r\n"
. "\r\n\r\n"
. $attachment
. "\r\n\r\n"
. "--$boundary1--\r\n\r\n"
);

// 从此不再有这样的奇葩问题 :) ble..
?>
scott at threeam dot com dot au
5 年前
根据我今天的测试,如果使用 PHPMailer 向基于 Exchange 的 IMAP 服务器发送包含大于 7kb 的附件或嵌入式图片的邮件,您需要将回车符从 Unix 格式更改为 Windows 格式。我简单地对 `\n` 进行了字符串替换,并将它替换为 `\r\n` 来完成操作。

$content = str_replace("\n", "\r\n", $mail->getSentMIMEMessage());
$result = imap_append($imapStream, $path, $content);
Krzysiek
9 年前
您可以使用 PHPMailer ( https://github.com/PHPMailer/PHPMailer/ ) 与 imap 协同工作。

<?php
// 在创建邮件内容后,您需要运行 preSend() - send() 方法的一部分
$mail->send();
// 然后您可以使用 getSentMIMEMessage() 方法获取完整的原始邮件
imap_append($imap, $mailserver.'INBOX.Sent',$mail->getSentMIMEMessage(), "\\Seen");
kaminski at istori dot com
13 年前
创建 `$internal_date` 时使用的日期格式字符串是 `'d-M-Y H:i:s O'`。
jille at DIESPAMMERShexon dot cx
17 年前
最后一个参数 `$options` 是类似于 `imap_setflag_full` 中使用的标志。
我花了一段时间才发现这一点。
bithive
21 年前
参数描述有误导性。您可以将一串标志(例如 `'\Seen'` [参见 `imap_setflag_full()`])作为最后一个参数传递。在其他 imap 函数中,`'options'` 通常似乎指的是位掩码,而不是消息标志。
chris at sma-sportsmgmt dot com
16 年前
我今天大部分时间都在完善示例,使其在保存到 Inbox.Sent 文件夹时能够正常工作。

现在 append 命令看起来像这样

$return = imap_append($stream,$mailbox_addr
, "From: $fromReply\r\n"
. "To: $to\r\n"
. "Subject: $subject\r\n"
. "Date: $now \r\n"
. "X-Mailer: Cmail_v2.0 \r\n"
. "X-Originating-IP: $ip_addr \r\n"
. "MIME-Version: 1 \r\n"
. "Content-Type: text/html;\r\n\tcharset=\"ISO-8859-1\"\r\n"
. "Content-Transfer-Encoding: 8bit \r\n"
. "\r\n\r\n"
. "$wk_msg\r\n"
);

这将当前日期插入电子邮件,并使其支持 html 内容。 我还没能做到的一件事是包含附件。 我可能必须将边界和附件内容作为消息正文的一部分。

Chris
bluebiru78 at hotmail dot com
22 年前
我使用 imap_append 将任何已撰写邮件复制到 INBOX.Sent 文件夹..

$app = imap_append($stream,"{" . $connectstring . "}INBOX.Sent","$header\r\n" ."$mbody\r\n");

if (!$app) {
error("电子邮件复制到已发送文件夹失败!");
}
svicentemolina at gmail dot com
17 年前
我使用此函数将一个帐户的所有电子邮件从一台服务器复制到另一台服务器。 问题是,此函数不会复制每条消息的原始接收日期。
为了添加第五个字段来提供日期,我在一些 php 源文件中进行了一些更改,遵循了 http://www.zend.com/lists/php-dev/200303/msg00843.html 中描述的步骤,它运行良好。
正确的日期格式是由 c-client/mail.c 源文件中的 mail_date 函数返回的,例如:"17-Jan-2007 10:00:01 +0100"
Mime 电子邮件格式示例
7 年前
Mime 消息示例(smtp telnet DATA 示例)

From: [email protected]
To: to@@ccc.cc
Subject: Example Email
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="MixedBoundaryString"

--MixedBoundaryString
Content-Type: multipart/related; boundary="RelatedBoundaryString"

--RelatedBoundaryString
Content-Type: multipart/alternative; boundary="AlternativeBoundaryString"

--AlternativeBoundaryString
Content-Type: text/plain;charset="utf-8"
Content-Transfer-Encoding: quoted-printable

这是电子邮件的纯文本部分。

--AlternativeBoundaryString
Content-Type: text/html;charset="utf-8"
Content-Transfer-Encoding: quoted-printable

<html>
<body>=0D
<img src=3D=22cid:masthead.png=40ccc.cc=22 width 800 height=3D80=
=5C>=0D
<p>这是电子邮件的 html 部分。</p>=0D
<img src=3D=22cid:logo.png=40ccc.cc=22 width 200 height=3D60 =5C=
>=0D
</body>=0D
</html>=0D

--AlternativeBoundaryString--

--RelatedBoundaryString
Content-Type: image/jpgeg;name="logo.png"
Content-Transfer-Encoding: base64
Content-Disposition: inline;filename="logo.png"
Content-ID: <[email protected]>

amtsb2hiaXVvbHJueXZzNXQ2XHVmdGd5d2VoYmFmaGpremxidTh2b2hydHVqd
dWkgb2l1b3NydGhpdXRvZ2hqdWlyb2h5dWd0aXJlaHN1aWhndXNpaHhidnVqZ
a25qbW9nNXRwbF0nemVycHpvemlnc3k5aDZqcm9wdHo7amlodDhpOTA4N3U5
LGZ2cDBbZWRzcm85eWo1Zmtsc2xrZ3g=

--RelatedBoundaryString
Content-Type: image/jpgeg;name="masthead.png"
Content-Transfer-Encoding: base64
Content-Disposition: inline;filename="masthead.png"
Content-ID: <[email protected]>

aXR4ZGh5Yjd1OHk3MzQ4eXFndzhpYW9wO2tibHB6c2tqOTgwNXE0aW9qYWJ6aX
dGlmOTA0cW05dGkwbWk0OXQwYVttaXZvcnBhXGtsbGo7emt2c2pkZnI7Z2lwb2F
eXN6dWdoeXhiNzhuZzdnaHQ3eW9zemlqb2FqZWt0cmZ1eXZnamhka3JmdDg3aXV2dWd5aGVidXdz
dhyuhehe76YTGSFGA=

--RelatedBoundaryString--

--MixedBoundaryString
Content-Type: application/pdf;name="Invoice_1.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;filename="Invoice_1.pdf"

aGZqZGtsZ3poZHVpeWZoemd2dXNoamRibngganZodWpyYWRuIHVqO0hmSjtyRVVPIEZSO05SVURF
SEx1aWhudWpoZ3h1XGh1c2loZWRma25kamlsXHpodXZpZmhkcnVsaGpnZmtsaG
a2psajY1ZWxqanNveHV5ZXJ3NTQzYXRnZnJhZXdhcmV0eXRia2xhanNueXVpNjRv

--MixedBoundaryString
Content-Type: application/pdf;name="SpecialOffer.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;filename="SpecialOffer.pdf"

aXBvY21odWl0dnI1dWk4OXdzNHU5NTgwcDN3YTt1OTQwc3U4NTk1dTg0dTV5OG
cS0zNHU4NTk0eWI4OTcwdjg5MHE4cHV0O3BvYTt6dWI7dWlvenZ1em9pdW51dD
OTViOHk5cDV3dTh5bnB3dWZ2OHQ5dTh2cHVpO2p2Ymd1eTg5MGg3ajY4bjZ2ODl1ZGlvcjQ1amts
dfnhgjdfihn=

--MixedBoundaryString--

.

// 或者您可以从以下地址下载
https://www.phpclasses.org/browse/file/14672.html
owain at vaughan dot com
23 年前
使用 SIMS IMAP 服务器,您还需要使用 \r\n 作为行终止符,否则您将能够正确添加所有标题行,但消息正文将不会保存。<br>
您可以为每个标题行使用 \n,但在创建标题和正文之间的空行时,您必须使用 \r\n\r\n
Tigggger
13 年前
在尝试让我的服务器将邮件复制到已发送文件夹时,我遇到了 3 个问题。

1. 在我添加 /novalidate-cert 之前,不会登录
2. 没有获取发送日期的代码示例
3. 包含附件

希望这段代码能帮助其他人

<?php
$dmy
=date("d-M-Y H:i:s");
$dmy.= " +0100"; // 由于服务器和我的时区不同,我不得不手动执行此操作。
$stream=@imap_open("{mail.example.com/novalidate-cert}INBOX.Sent", "username", "password");
$boundary = "------=".md5(uniqid(rand()));
$header = "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
$header .= "\r\n";
$file="../path_to/filename.pdf";
$filename="filename.pdf";
$ouv=fopen ("$file", "rb");$lir=fread ($ouv, filesize ("$file"));fclose
($ouv);
$attachment = chunk_split(base64_encode($lir));
$msg2 .= "--$boundary\r\n";
$msg2 .= "Content-Transfer-Encoding: base64\r\n";
$msg2 .= "Content-Disposition: attachment; filename=\"$filename\"\r\n";
$msg2 .= "\r\n";
$msg2 .= $attachment . "\r\n";
$msg2 .= "\r\n\r\n";
$msg3 .= "--$boundary--\r\n";
imap_append($stream,"{mail.example.com/novalidate-cert}INBOX.Sent","From: Somebody\r\n"."To: [email protected]\r\n"."Date: $dmy\r\n"."Subject: This is the subject\r\n"."$header\r\n"."$msg2\r\n"."$msg3\r\n");
imap_close ($stream);
?>
michel dot jansens at ulb dot ac dot be
21 年前
我使用 imap_append() 来解码 message/rfc822 附件类型(嵌入式电子邮件)

$attachment = imap_fetchbody($mbox,$mailuid,$atpos,FT_UID);
$attachment = imap_base64($attachment);
$res = imap_append($mbox,mboxspec("INBOX"),$attachment);
// 嵌入式电子邮件现在是我的收件箱中的普通邮件
nanomoow at gmail dot com
7 年前
$fn = 'filename.zip';
$IMAPhost = 'imap.hostname.com';
// IMAP 端口 143、995 或 POP3 端口 110、995
$IMAPport = '143';
$IMAPssl = 'tls';
$IMAP = '{'.$IMAPhost.':'.$IMAPport.'/imap/'.$IMAPssl.'/novalidate-cert}';
$IMAPuser = '[email protected]';
$msg ='消息文本 <h1 style="color: #093"> 您好 </h1>';
// imap 电子邮件和密码
$ibox = imap_open($IMAP, $_SESSION['email'], $_SESSION['pass']);
$dmy=date("Y-m-d H:i:s");
// 打包文件内容
$attachment = chunk_split(base64_encode(file_get_contents('tmp/'.$fn)));
$boundary = "------=".md5(uniqid(rand()));
imap_append($ibox, $IMAP."Send"
, "From: Hello <".$IMAPuser.">\r\n"
. "To: ".$email."\r\n"
. "Date: $dmy\r\n"
. "Subject: ".$sub."\r\n"
. "MIME-Version: 1.0\r\n"
. "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"
. "\r\n\r\n"
. "--$boundary\r\n"
. "Content-Type: text/html;\r\n\tcharset=\"utf-8\"\r\n"
. "Content-Transfer-Encoding: 8bit \r\n"
. "\r\n\r\n"
. html_entity_decode($msg)."\r\n"
. "\r\n\r\n"
. "--$boundary\r\n"
. "Content-Transfer-Encoding: base64\r\n"
. "Content-Disposition: attachment; filename=\"$fn\"\r\n"
. "\r\n" . $attachment . "\r\n"
. "\r\n\r\n\r\n"
. "--$boundary--\r\n\r\n"
);
jesper at angelo dot dk
24 年前
请注意,imap_append() 不支持 NNTP 发布。 请改用 fsockopen(),并自行完成工作。
serpent at paradise dot net dot nz
11 年前
我们无法让此函数与 MS-Exchange/IMAP 正确配合,不是因为函数本身存在问题,而是因为 MS-Exchange 在所有情况下都将标题中的 content-type 从 multipart/[anything] 更改为 text/plain。 我们设置了 ImapMessagesRetrievalMimeFormat 为 HtmlAndTextAlternative
在 Exchange 服务器上,但这也没有帮助。 我甚至尝试将多部分消息包装在 message/rfc822 包装器中,它到达外部消息内部,并将内部消息从 multipart/alternative 更改为 text/plain。

发送到 mbox 的邮件不受影响,建议您尝试使用这种方式,并将相关邮件移动到您想要的位置。
To Top