Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何转发PHP和IMAP下载的电子邮件?_Php_Email_Imap_Forwarding - Fatal编程技术网

如何转发PHP和IMAP下载的电子邮件?

如何转发PHP和IMAP下载的电子邮件?,php,email,imap,forwarding,Php,Email,Imap,Forwarding,我正在写一个脚本来阅读电子邮件,并根据收件人地址将其分发到不同的电子邮件地址。所有的电子邮件都发到一个地址,但我似乎不知道如何转发一封电子邮件,或者创建一封新的电子邮件并包含所有相关的邮件正文 现在我正在使用IMAP下载电子邮件,并使用IMAP_fetchbody获取电子邮件内容 $email_body = imap_fetchbody($imapconnex, $msgnumber, 1); 某些电子邮件正文无法正确显示,而其他电子邮件正文结尾包含带有=符号的短行,导致内容无法正确显示。此外

我正在写一个脚本来阅读电子邮件,并根据收件人地址将其分发到不同的电子邮件地址。所有的电子邮件都发到一个地址,但我似乎不知道如何转发一封电子邮件,或者创建一封新的电子邮件并包含所有相关的邮件正文

现在我正在使用IMAP下载电子邮件,并使用IMAP_fetchbody获取电子邮件内容

$email_body = imap_fetchbody($imapconnex, $msgnumber, 1);
某些电子邮件正文无法正确显示,而其他电子邮件正文结尾包含带有
=
符号的短行,导致内容无法正确显示。此外,我看到随机
A0
随机打印在我的电子邮件正文中

我的计划是使用PHP的mail()函数将电子邮件发送到我希望它去的地方,并将From地址更改为真实的From地址。这可以满足我的需要,但我似乎不知道如何检索正确的正文,格式化并发送它

这是我用来发送电子邮件的代码:

$header = imap_fetch_overview($imapconnex, $search[$i]);
$email_subject = $header[0]->subject;
$email_head = imap_fetchbody($imapconnex, $search[$i], 0); 
$email_body = imap_fetchbody($imapconnex, $search[$i], 1); 
mail("me@mydomain.com", $email_subject, $email_body, $email_head);

标题似乎可以很好地转发,但消息的主体仍然显示有
=
A0
符号。

今天,大部分消息都是多部分的。我用这个和它的作品

$mailstructure = imap_fetchstructure($inbox, $uid, FT_UID); //
$type = $mailstructure->type;
if ($type == 1 && $mailstructure->ifparameters == 1) {
    $subtype = strtolower($mailstructure->subtype);
    echo "SubType is" . $subtype . "<br />";
    $parameters = $mailstructure->parameters;
    $attribute = $parameters[0]->attribute;
    $value = $parameters[0]->value;
    echo $attribute . "//" . $value . "<br />";
    # prepare the mail
$to="";
$subject="";
    $body="\r\nThis is a multipart message in MIME format.\r\n";
    $body.=imap_body($inbox, $uid, FT_UID);
    $headers ="From:" . $from . "\r\n";
    $headers .="Date: " . date("r") . "\r\n";
    $headers .="MIME-Version: 1.0\r\n";
    $headers .="Content-Type: multipart/" . $subtype . ";
        \t boundary=\"" . $value . "\""."\r\n";
   $sendmail = imap_mail($to, $subject, $body, $headers);
$mailstructure=imap\u fetchstructure($inbox,$uid,FT\u uid)//
$type=$mailstructure->type;
如果($type==1&&$mailstructure->ifparameters==1){
$subtype=strtolower($mailstructure->subtype);
echo“子类型为”。$SubType。“
”; $parameters=$mailstructure->parameters; $attribute=$parameters[0]->attribute; $value=$parameters[0]->value; 回显$attribute.“//”$value.“
”; #准备邮件 $to=“”; $subject=“”; $body=“\r\n这是MIME格式的多部分消息。\r\n”; $body.=imap\u body($inbox、$uid、FT\u uid); $headers=“From:”.$From.\r\n”; $headers.=“日期:”.Date(“r”)。“\r\n”; $headers.=“MIME版本:1.0\r\n”; $headers.=“内容类型:多部分/”$subtype。”; \t边界=\“”.$value.\“”.\r\n; $sendmail=imap_邮件($to、$subject、$body、$headers);
}马克

回答不错,提供了一个简单的解决方案。它还可以处理纯文本,只需稍作修改

$mtype = array('text', 'multipart', 'message', 'application', 'audio', 
               'image', 'video', 'model', 'other');
$mailstructure = imap_fetchstructure($mbox, $msgno, FT_UID); //
$type = $mailstructure->type;
if ($type == 1 && $mailstructure->ifparameters == 1) {
    $parameters = $mailstructure->parameters;
    $attribute = $parameters[0]->attribute;
    $value = $parameters[0]->value;
    echo $attribute . "//" . $value . "<br />";
}
# prepare the mail
$to="";
$subject="";
//   line below (may) not (be) needed
//   $body="\r\nThis is a multipart message in MIME format.\r\n";
$body = imap_body($inbox, $uid, FT_UID);
$headers ="From:" . $from . "\r\n";
$headers .="Date: " . date("r") . "\r\n";
$headers .="MIME-Version: 1.0\r\n";
$headers .="Content-Type: " . $mtype[$mailstructure->type] . '/'
         . strtolower($mailstructure->subtype) . ";\r\n";
if ($type == 1) { // multipart
    $headers .= "\t boundary=\"" . $value . "\""."\r\n";
}
$sendmail = imap_mail($to, $subject, $body, $headers);
$mtype=array('text'、'multipart'、'message'、'application'、'audio',
“图像”、“视频”、“模型”、“其他”);
$mailstructure=imap_fetchstructure($mbox,$msgno,FT_UID)//
$type=$mailstructure->type;
如果($type==1&&$mailstructure->ifparameters==1){
$parameters=$mailstructure->parameters;
$attribute=$parameters[0]->attribute;
$value=$parameters[0]->value;
回显$attribute.“//”$value.“
”; } #准备邮件 $to=“”; $subject=“”; //下面的行(可能)不需要 //$body=“\r\n这是MIME格式的多部分消息。\r\n”; $body=imap\u body($inbox,$uid,FT\u uid); $headers=“From:”$从…起“\r\n”; $headers.=“日期:”。日期(“r”)。“\r\n”; $headers.=“MIME版本:1.0\r\n”; $headers.=“内容类型:”$mtype[$mailstructure->type]。/' . strtolower($mailstructure->subtype)。“;\r\n”; 如果($type==1){//multipart $headers.=“\t边界=\”“.$value.\”“.\r\n”; } $sendmail=imap_邮件($to、$subject、$body、$headers);
听起来像是将原始邮件的正文复制到新邮件中,但缺少标题,
内容传输编码
,这将导致出现
=
A0
症状。如果您正在重新发送邮件,您可能应该从原始邮件复制大部分(如果不是全部的话)邮件头。如果您正在转发,则应将原始邮件及其所有邮件头作为MIME正文部分完整地包含在新邮件中。谢谢您的帮助。关于内容传输编码,这很有趣。我已经修复了代码的标题(谢谢Celada),但仍然存在显示
=
A0
的正文问题。我注意到,使用我的代码,我没有在原始标题中获得
内容传输编码
。我尝试将
内容传输编码:8比特
添加到我的标题中,但它仍然是相同的输出。如果消息的原始正文中有
=A0
之类的内容,您几乎可以肯定原始消息中有一个
内容传输编码
,它是
引用的可打印的
。也许您没有得到原始标题的忠实版本。我忘记了用IMAP语法来下载原始电子邮件,但也许你需要用它来代替
IMAP\u fetch\u overview
。您需要复制所有相关的标题(
Content-Type
MIME-Version
,等等),它才能工作。事实上,最简单、最正确的方法就是复制原始电子邮件的所有标题。