提取邮件的内容

Sat*_*tes 7 php email imap

我需要创建一个应用程序来提取客户发送给我们进行验证的增值税号.他们不再发送电子邮件了.这是为了创建扩展统计数据.

我需要的是在我需要的内容之前有一个没有任何标题的邮件正文,即增值税编号,就这么简单.

这是我的脚本,它创建了30个最近的电子邮件列表:

<?
if (!function_exists('imap_open')) { die('No function'); }

if ($mbox = imap_open(<confidential>)) {
    $output = "";
    $messageCount = imap_num_msg($mbox);
    $x = 1;     
    for ($i = 0; $i < 30; $i++) {
        $message_id = ($messageCount - $i);
        $fetch_message = imap_header($mbox, $message_id);
        $mail_content = quoted_printable_decode(imap_fetchbody($mbox,$message_id, 1));
        iconv(mb_detect_encoding($mail_content, mb_detect_order(), true), "UTF-8", $mail_content);

        $output .= "<tr>
        <td>".$x.".</td>
        <td>
            ".$fetch_message->from[0]->mailbox."@".$fetch_message->from[0]->host."
        </td>
        <td>
            ".$fetch_message->date."
        </td>
        <td>
            ".$fetch_message->subject."
        </td>
        <td>
            <textarea cols=\"40\">".$mail_content."</textarea>
        </td>
        </tr>";
        $x++;
    }
    $smarty->assign("enquiries", $output);
    $smarty->display("module_mail");
    imap_close($mbox);
} else {
    print_r(imap_errors());
}
?>
Run Code Online (Sandbox Code Playgroud)

我已经使用imap_fetchbody,imap_header等来检索所需的内容但事实证明大多数电子邮件在内容之前都有其他东西(如标题),即.

--=-Dbl2eWTUl0Km+Tj46Ww1
Content-Type: text/plain;

------=_NextPart_001_003A_01D14F7A.F25AB3D0
Content-Type: text/plain;

--=-ucRIRGamiKb0Ot1/AkNc
Content-Type: text/plain;
Run Code Online (Sandbox Code Playgroud)

我需要摆脱邮件消息中包含的增值税号码之前的所有内容,但我不知道如何.有些电子邮件没有这些标题,有些则有.由于我们正在与来自欧洲各地的客户合作,这让我感到困惑并且无能为力.

另一个问题是,有些客户只是从各种网站复制粘贴增值税号,这意味着这些增值税号通常会粘贴原始样式(粗体/背景/更改颜色等).这可能是我的PS下面的原因.

我会感谢每一个帮助我解决这个问题的帮助.

先感谢您.

PS.只是为了记录.随着imap_fetchbody($mbox,$message_id, 1)我需要使用1拥有全部内容.更改1为其他任何内容都会导致显示无电子邮件内容.从字面上看.

bor*_*Blu 3

您定义为“噪音”的电子邮件部分只是电子邮件格式的一部分。
在某种程度上就像您正在阅读网页的 html 代码一样。

所有这些位都是边界。电子邮件的这些元素就像 html 中的标签一样,也像 html 一样,它们开始和结束。

所以在你的情况下:

Content-Type: multipart/alternative; boundary="=-Dbl2eWTUl0Km+Tj46Ww1" // define type of email structure and boudary

--=-Dbl2eWTUl0Km+Tj46Ww1    // used to start the section
Content-Type: text/plain;   // to define the type of content of the section
// here there is your VAT presumbly

--=-Dbl2eWTUl0Km+Tj46Ww1--  // used to close the section
Run Code Online (Sandbox Code Playgroud)

可能的解决方案

实际上你至少有2个解决方案。
自己制作一个自定义解析器或使用PECL名为Mailparse的库。

手动制作解析器:

Content-Type: multipart/alternative; boundary="=-Dbl2eWTUl0Km+Tj46Ww1" // define type of email structure and boudary

--=-Dbl2eWTUl0Km+Tj46Ww1    // used to start the section
Content-Type: text/plain;   // to define the type of content of the section
// here there is your VAT presumbly

--=-Dbl2eWTUl0Km+Tj46Ww1--  // used to close the section
Run Code Online (Sandbox Code Playgroud)

邮件解析:

安装邮件解析sudo pecl install mailparse

提取增值税:

$mail_lines = explode($mail_content, "\n");

foreach ($mail_lines as $key => $line) {
     // jump most of the headrs
     if ($key < 5) {
         continue;
     }

     // skip tag lines
     if (strpos($line, "--")) {
        continue;
     }

     // skip Content lines
     if (strpos($line, "Content")) {
        continue;
     }

     if (empty(trim($line))) {
        continue;
     } 

     ////////////////////////////////////////////////////
     // here you have to insert the logic for the parser
     // and extend the guard clauses
     ////////////////////////////////////////////////////
}
Run Code Online (Sandbox Code Playgroud)