Php 提取邮件';内容

Php 提取邮件';内容,php,email,imap,Php,Email,Imap,我需要创建一个应用程序,将提取增值税号码,我们的客户发送给我们进行验证。他们只发送电子邮件。这是为了创建扩展的统计数据 我需要的是在我需要的内容之前有一个没有任何标题的邮件正文,也就是增值税编号,就这么简单 这是我创建30封最近电子邮件列表的脚本: <? if (!function_exists('imap_open')) { die('No function'); } if ($mbox = imap_open(<confidential>)) { $output

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

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

这是我创建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());
}
?>
我需要清除邮件中包含的增值税号码之前的所有内容,但我不知道如何处理。有些电子邮件没有这些标题,有些有。由于我们与来自欧洲各地的客户合作,这让我很困惑,也让我无能为力

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

我将感谢所有能帮助我解决这个问题的人

先谢谢你


顺便说一句,记录在案。使用
imap\u fetchbody($mbox,$message\u id,1)
我需要使用
1
来获取整个内容。将
1
更改为其他任何内容都不会显示任何电子邮件内容。字面意思。

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

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

因此,在你的情况下: 可能的解决方案 实际上,您至少有两种解决方案。
自己制作一个自定义解析器或使用名为的
PECL

手动创建解析器:
$mail\u lines=explode($mail\u content,“\n”);
foreach($key=>$line的邮件行){
//跳过大部分头枕
如果($key<5){
继续;
}
//跳过标记行
if(STRPO($行,“-”)){
继续;
}
//跳过内容行
if(STRPO($line,“Content”)){
继续;
}
如果(空(修剪($line))){
继续;
} 
////////////////////////////////////////////////////
//这里必须插入解析器的逻辑
//以及延长保护条款
////////////////////////////////////////////////////
}
邮件解析: 安装邮件解析
sudo pecl安装邮件解析

提取增值税:
$mail=mailparse_msg_create();
mailparse_msg_parse($mail,$mail_content);
$struct=mailparse\u msg\u get\u结构($mail);
foreach($struct作为$st){
$section=mailparse\u msg\u get\u part($mail,$st);
$info=mailparse\u msg\u get\u part\u data($section);
打印(信息);
}
您必须使用查找邮件的纯文本部分

以下代码可以为您提供
text/plain
子部分的章节号(例如“1.1”)

使用示例:

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);
    }
 }
if($imap){
$messageCount=imap\u num\u msg($imap);
对于($i=1;$i<30;$i++){
$struct=imap_fetchstructure($imap,$i);
$part=getTextPart($struct);
$body=imap_fetchbody($imap,$i,$part);
打印(正文);
}
}

Youn可能会使用正则表达式:但如果用户从一个网站上复制自己的html代码,例如
而不是空格,或者
span
标签等,这仍然会失败。你有没有理由不能在公司网站上创建一个简单的表单,这样你就可以控制数据的格式了?这在**se中是多么痛苦啊!您是否可以采取某种形式的折衷措施,例如创建一个表单,而不是提交,创建并单击
mailto:
链接?这样,用户的电子邮件客户端就会以预先设置好的内容打开?否则,我至少会在您的站点上创建一个页面,该页面带有输入框,通过上面的正则表达式获取并验证数字,然后将预先设置好的响应吐出到文本区域,例如
我们的增值税编号:
,并指示复制和粘贴结果。有了它,我会尝试使用上面的正则表达式从电子邮件中捕获数字,如果失败,我会发送一个自动回复请求客户访问上面提到的页面
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
 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;
 }
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);
    }
 }