gpt4 book ai didi

php - 提取邮件内容

转载 作者:可可西里 更新时间:2023-11-01 12:57:33 26 4
gpt4 key购买 nike

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

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

这是我创建 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());
}
?>

我曾使用 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;

我需要删除邮件消息中包含的增值税号之前的所有内容,但我不知道该怎么做。有些电子邮件没有这些 header ,有些则有。由于我们正在与来自欧洲各地的客户合作,这真的让我感到困惑并且无能为力。

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

如果能帮助我解决这个问题,我将不胜感激。

提前谢谢你。

附言。只是为了记录。使用 imap_fetchbody($mbox,$message_id, 1) 我需要使用 1 来获取全部内容。将 1 更改为其他任何内容都不会显示任何电子邮件内容。字面意思。

最佳答案

电子邮件中您定义为“噪音”的部分只是电子邮件格式的一部分。
在某种程度上就像您正在阅读网页的 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

可能的解决方案

实际上你至少有2种解法。
自己制作自定义解析器或使用名为 MailparsePECL 库.

手动创建解析器:

$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
////////////////////////////////////////////////////
}

邮件解析:

安装邮件解析 sudo pecl install mailparse

提取增值税:

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

关于php - 提取邮件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34810120/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com