PHP IMAP如何获取正文的文本部分?不是不同的标签等

时间:2017-07-27 14:15:13

标签: php html parsing imap

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

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

.... mumbojumbo,只是电子邮件本身的文字(我可以忍受签名和图片以及这个和那个)。

有没有比在<body...</body...处稍微粗略地切断长弦然后从那里进一步切割更简单的方法?必须有其他人想要解决同样的问题但是我花了一整天的时间试图解决它并且谷歌后才能找到任何答案。

我想最后我只是将整个htmlresponse插入到数据库单元格中并希望最好,但我宁愿不这样做。

帮帮我,Stackoverflow。你是我唯一的希望

解决方案编辑:

不是我想要的确切解决方案,但它确实有效(稍作修改)。

echo strip_tags($message, '<body>');

仅输出

<body...>
Yayh the text i want!
</body .....>

一部分。非常感谢@ThisGuyHasTwoThumbs(评论中)

修改

最后,代码大致成了这个

<?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);
};
?>

在最后删除第一个<body something something something></body>,之后删除变量开头和结尾的空格。 (@Goose在下面的编辑答案中也有点回答)。它还将html编码的'字母转换为相应的字母,以及删除&amp; nbsp标签等。

2 个答案:

答案 0 :(得分:1)

你想要的是strip_tags()

http://php.net/manual/en/function.strip-tags.php

$html = '<div>hello</div>';
$text = strip_tags($html);
echo $text; // hello

如果您需要从结果字符串中删除多余的空格,请使用此选项。这也将删除新行。归功于Remove excess whitespace from within a string

$text = preg_replace('/\s+/', ' ', $text);

答案 1 :(得分:1)

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

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

(空) - 整条消息 0 - 消息头 1 - MULTIPART / ALTERNATIVE 1.1 - 文本/平原 1.2 - TEXT / HTML 2 - MESSAGE / RFC822(整个附加消息) 2.0 - 附加邮件标题 2.1 - TEXT / PLAIN 2.2 - TEXT / HTML 2.3 - file.ext

根据http://php.net/manual/en/function.imap-fetchbody.php的第2条评论,它还有一些不错的功能可以为您动态计算可用的消息部分,因此您不必过多担心消息和数据的类型它是。