PHP IMAP如何只获取正文的文本部分?不是不同的<;html>;标签等

PHP IMAP如何只获取正文的文本部分?不是不同的<;html>;标签等,php,html,parsing,imap,Php,Html,Parsing,Imap,我正试图编写一个脚本,从exchange服务器下载电子邮件,然后将其插入数据库,但我无法以良好的方式获取电子邮件的“文本部分” phpcode <?PHP $user = "email@domain.com"; $password = "password123"; $mbox = imap_open("{exchange01:993/imap/ssl/novalidate-cert}", $user, $password); $message = imap_fetchbody($mbox

我正试图编写一个脚本,从exchange服务器下载电子邮件,然后将其插入数据库,但我无法以良好的方式获取电子邮件的“文本部分”

phpcode

<?PHP
$user = "email@domain.com";
$password = "password123";
$mbox = imap_open("{exchange01:993/imap/ssl/novalidate-cert}", $user, $password);

$message = imap_fetchbody($mbox,1,1);

print_r($message);

if($mbox)
{
    imap_close($mbox);
};
?>

整个html正文都会被打印出来。我想这是意料之中的事,但我不希望有这样的机会

<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=iso-8859-1"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
    {font-family:"Cambria Math";
    panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
    {font-family:Calibri;
    panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
    {font-family:Verdana;
    panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
    {font-family:"Neo Sans Std";}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
    {margin:0cm;
    margin-bottom:.0001pt;
    font-size:11.0pt;
    font-family:"Calibri",sans-serif;
    mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
    {mso-style-priority:99;
    color:#0563C1;
    text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
    {mso-style-priority:99;
    color:#954F72;
    text-decoration:underline;}
span.E-postmall17

您想要的是
去除标签()

$message=imap_fetchbody($mbox,1,1.1)

将为您提供消息的纯文本部分,而不是整个正文内容,如果您需要html部分,请使用1.2

(空)-整个消息 0-消息头 1-多部分/备选方案 1.1-文本/纯文本 1.2-文本/HTML 2-消息/RFC822(完整附加消息) 2.0-附加邮件标题 2.1-文本/纯文本 2.2-文本/HTML 2.3-file.ext


根据第二条评论,它还有一些很好的功能,可以为您动态计算可用的消息部分,这样您就不必太担心它是什么类型的消息和数据。

您不将正文内容(文本)与电子邮件代码分开存储吗?@Thisguihasstwomthumbs hm?据我所知,
imap_fetchbody($mbox,1,1)
是下载邮件正文的正确方法,下载的内容就是你在上面看到的(+更多的html文本,最后是一些我想要的文本(更多的html垃圾)我的意思是,如果你在一个变量中存储$body,那么你就拥有了标签之间的所有内容,然后你可以使用
strip\u标签
来摆脱rest@ThisGuyHasTwoThumbs哦..!这正是我想要的,多谢各位!几个小时来我一直在为这个问题发愁xD:)不用担心:D哈哈哈,问题确实解决了(除了标记前后的大量空白)。不是“完美”的解决方案,但已经足够了。@Tamazin我编辑了这个问题,以解决如何处理多余的空白。是的,我做了修剪,还分解了字符串以删除开头和结尾。现在我只需要它来正确地编码我的瑞典语字母,也许还删除了其他东西,我很抱歉一个快乐的编码者;D谢谢!遗憾的是,这不起作用。对于一封只有文本正文且没有任何mime附件的电子邮件,imap-fetchbody()将为每个请求的部分号返回以下内容:(空)-整封邮件0-邮件头1-邮件正文文本采用这种方式,因此我只能从0或1中进行选择(1.1、1.2、2、2.1、2.2等将不起作用)。即使电子邮件有png图像和一些这个和那个(带有签名的普通邮件等)。如果我是你,我会循环查看可用部分并检查,因为很少有邮件客户端不提供a)mime和b)将html拆分为纯文本正文部分无论如何,我尝试过,但无法使其工作。使用:$structure=imap\u fetchstructure($mbox,$email\u number);我可以看到三部分,第一部分是文本(html),另外两部分是两个PNG。我正在使用outlook向常规exchange2010服务器发送电子邮件。当然,我更愿意只获取“纯文本”而不是html,然后根据我的喜好对其进行格式化。。buuut没有做到这一点:(很奇怪,因为outlook默认为您在html框中键入的任何内容创建纯文本副本,并且总是(默认情况下也是如此)使其成为多部分mime电子邮件在过去,它导致了大量的电子邮件膨胀问题,因为outlook电子邮件与适当的电子邮件客户端相比是巨大的。是的,我认为现代版本的outlook可以做到这一点,但由于某些原因它似乎不起作用。必须进一步调查。如果我设法找到原因,那么修复将很容易(改为下载纯文本)。
echo strip_tags($message, '<body>');
<body...>
Yayh the text i want!
</body .....>
<?PHP
$user = "email@domain.com";
$password = "password";
$mbox = imap_open("{exchange01:993/imap/ssl/novalidate-cert}", $user, $password);

$message = imap_fetchbody($mbox,1,1);

$message = strip_tags($message, '<body>');
$message = explode(">", $message);
$message = explode("<", $message[1]);
$message = str_replace("&nbsp;", "", $message[0]);
$message = html_entity_decode($message);
$message = trim($message);
//Or the above three combined in one row
#$message = trim(html_entity_decode( str_replace("&nbsp;", "", $message[0])));

echo $message;

if($mbox)
{
    imap_close($mbox);
};
?>
$html = '<div>hello</div>';
$text = strip_tags($html);
echo $text; // hello
$text = preg_replace('/\s+/', ' ', $text);