【问题标题】:PHP IMAP How to get just the text-part of body? Not the different <html> tags etcPHP IMAP 如何获取正文的文本部分?不是不同的 <html> 标签等
【发布时间】:2017-07-27 23:29:54
【问题描述】:

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

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,只是电子邮件中的文字(我可以忍受有签名和图像等等)。

有没有比粗略地将&lt;body... 处的长字符串剪断到&lt;/body... 然后再从那里剪得更远的方法?一定有其他人想要解决同样的问题,但我花了一整天的时间试图解决它并用谷歌搜索它,却找不到任何答案。

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

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

解决方案编辑:

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

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

输出只是

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

部分。非常感谢@ThisGuyHasTwoThumbs(在 cmets 中)

编辑:

最后代码大致变成了这样

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

删除第一个&lt;body something something something&gt; 和末尾的&lt;/body&gt;,然后删除变量开头和结尾的空格。 (@Goose 在下面他编辑的答案中也有点回答)。它还将 html 编码的 ' 字母转换为相应的字母,并删除 &nbsp 标记等。

【问题讨论】:

  • 您不将正文内容(文本)与电子邮件代码分开存储吗?
  • @ThisGuyHasTwoThumbs 嗯?据我所知imap_fetchbody($mbox,1,1); 是下载邮件正文的正确方法,下载的内容是您在上面看到的(+更多 html 文本,然后最后是一些 YAYH 我想要的文本(还有一些 html 废话).
  • 我的意思是,如果你将 $body 存储在一个变量中,那么 标签之间的所有内容,那么你可以使用strip_tags 来摆脱其余部分
  • @ThisGuyHasTwoThumbs 哦..!正是我要找的,非常感谢!几个小时以来一直在为这个问题拉头发xD
  • :) 不用担心 :D 哈哈

标签: php html parsing imap


【解决方案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);

【讨论】:

  • 是的,确实可以解决问题(除了 标签前后的大量空格)。不是“完美”的解决方案,但绰绰有余。
  • @Tamazin 我编辑了问题以解决如何处理多余的空白。
  • 是的,我用修剪完成了它,还分解了字符串以删除开始 部分和结束 。现在我只需要它来正确编码我的瑞典 åäö 字母,并可能删除 &nbsp 等东西,我是一个快乐的编码员;D 谢谢!
【解决方案2】:

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

会给你消息的纯文本部分而不是整个正文内容,如果你想要 html 部分,请使用 1.2

(空) - 整个消息 0 - 消息头 1 - 多部分/替代 1.1 - 文本/纯文本 1.2 - 文本/HTML 2 - MESSAGE/RFC822(整个附加消息) 2.0 - 附加消息头 2.1 - 文本/纯文本 2.2 - 文本/HTML 2.3 - 文件.ext

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

【讨论】:

  • 不幸的是,这不起作用。对于只有文本正文且没有任何 mime 附件的电子邮件,imap-fetchbody() 将为每个请求的部分编号返回以下内容:(空)- 整个邮件 0 - 邮件标题 1 - 正文文本 邮件是这样我只有 0 或 1 可供选择(1.1、1.2、2、2.1、2.2 等不起作用)。即使电子邮件有一个 png 图像和一些这个和那个(带有签名等的普通邮件)。
  • 如果我是你,我会遍历可用部分并检查,因为很少有邮件客户端不会提供 a) mime 和 b) 将 html 拆分为纯文本正文部分
  • 我试过了,但无法让它工作。使用: $structure = imap_fetchstructure($mbox, $email_number);我可以看到三个 [部分],首先是文本(在 html 中),另外两个是两个 PNG。我正在使用 Outlook 将电子邮件发送到常规的 exchange2010 服务器。当然更愿意只获取“纯文本”而不​​是 html,然后根据我的喜好对其进行格式化.. buuut 没有让它起作用:(
  • 很奇怪,因为 Outlook 默认情况下会为您在 html 框中键入的任何内容制作纯文本副本,并且总是(再次默认情况下)使它们成为过去的多部分 mime 电子邮件,这导致了电子邮件膨胀的很多问题因为与适当的电子邮件客户端相比,Outlook 电子邮件非常庞大。
  • 是的,我认为现代版的 Outlook 可以做到这一点,但由于某种原因它似乎不起作用。必须进一步调查。如果我设法找到原因,那么修复将很容易(下载纯文本)。
猜你喜欢
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多