首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提取邮件内容

提取邮件内容
EN

Stack Overflow用户
提问于 2016-01-15 19:32:21
回答 2查看 388关注 0票数 7

我需要创建一个应用程序,将提取增值税号码,我们的客户发送给我们进行验证。他们不再通过电子邮件发送任何东西。这是为了创建扩展统计数据。

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

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

代码语言:javascript
复制
<?
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());
}
?>

我使用过imap_fetchbody、imap_header等工具来检索所需的内容,但大多数电子邮件在内容之前都有其他内容(如标题),例如。

代码语言:javascript
复制
--=-Dbl2eWTUl0Km+Tj46Ww1
Content-Type: text/plain;

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

--=-ucRIRGamiKb0Ot1/AkNc
Content-Type: text/plain;

我需要去掉邮件中包含的增值税号码之前的所有东西,但我不知道怎么做。有些电子邮件没有这些标题,有些则有。由于我们与来自欧洲各地的客户合作,这真的让我感到困惑,让我无能为力。

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

我将感谢每一位帮助我解决这个问题的人。

提前谢谢你。

PS。只是为了记录一下。对于imap_fetchbody($mbox,$message_id, 1),我需要使用1来拥有整个内容。将1更改为其他任何值都会导致根本不显示电子邮件内容。从字面上看。

EN

回答 2

Stack Overflow用户

发布于 2016-01-21 14:41:40

你定义为“噪音”的那部分电子邮件只是电子邮件格式的一部分。

在某种程度上,就像你正在阅读网页的html代码一样。

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

所以在你的例子中:

代码语言:javascript
复制
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

可行的解决方案

实际上你至少有两个解决方案。

自己制作一个自定义解析器,或者使用一个名为MailparsePECL库。

手动创建解析器:

代码语言:javascript
复制
$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
     ////////////////////////////////////////////////////
}

Mailparse:

安装邮件解析sudo pecl install mailparse

提取增值税:

代码语言:javascript
复制
$mail = mailparse_msg_create();
mailparse_msg_parse($mail, $mail_content);
$struct = mailparse_msg_get_structure($mail); 

foreach ($struct as $st) { 
    $section = mailparse_msg_get_part($mail, $st); 
    $info = mailparse_msg_get_part_data($section); 

    print_r($info);
}
票数 3
EN

Stack Overflow用户

发布于 2016-01-24 03:19:10

您必须使用imap_fetchstructure()来查找邮件的纯文本部分。

下面的代码可以给出text/plain子部分的节号(例如"1.1")

代码语言:javascript
复制
 function getTextPart($struct) {
    if ($struct->type==0) return "1";
    if ($struct->type==1) {
            $num=1;
            foreach ($struct->parts as $part) {
                    if (($part->type==0)&&($part->subtype="PLAIN")) {
                            return $num;
                    } else if ($part->type==1) {
                            $found=getTextPart($part);
                            if ($found) return "$num.$found";
                    }
                    $num++;
            }
    }
    return NULL;
 }

使用示例:

代码语言:javascript
复制
if ($imap) {
    $messageCount = imap_num_msg($imap);
    for ($i = 1; $i < 30; $i++) {
            $struct=imap_fetchstructure($imap, $i);
            $part=getTextPart($struct);
            $body=imap_fetchbody($imap, $i, $part);
            print_r($body);
    }
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34810120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档