📌  相关文章
📜  如何获取电子邮件的附件 php (1)

📅  最后修改于: 2023-12-03 15:24:54.026000             🧑  作者: Mango

如何获取电子邮件的附件 php

在 PHP 中获取电子邮件的附件可以通过 IMAP 和 POP3 协议来实现。IMAP 协议是交互式邮件协议,它允许在本地和远程邮件服务器之间保留同步状态。POP3 协议是获取邮件的一种方式,它下载邮件到本地,然后将其从服务器上删除。

IMAP 协议获取附件

要使用 IMAP 协议获取电子邮件的附件,您需要安装并启用 PHP 的 IMAP 扩展。您可以使用 imap_open() 函数打开一个 IMAP 连接。

以下是一个基本的示例代码:

<?php

/* 要连接到的电子邮件服务器 */
$hostname = '{imap.gmail.com:993/imap/ssl}INBOX';

/* 电子邮件地址和密码 */
$username = 'youremail@gmail.com';
$password = 'yourpassword';

/* IMAP 连接 */
$connection = imap_open($hostname, $username, $password);

/* 选择邮件文件夹 */
imap_reopen($connection, $hostname);

/* 搜索邮件 */
$search = 'UNSEEN';

/* 获取邮件头和内容 */
$emails = imap_search($connection, $search);

/* 遍历邮件 */
foreach ($emails as $email_number) {

    /* 获取邮件头 */
    $header = imap_headerinfo($connection, $email_number);

    /* 获取附件 */
    $structure = imap_fetchstructure($connection, $email_number);
    $attachments = array();

    if (isset($structure->parts) && count($structure->parts)) {
        for ($i = 0; $i < count($structure->parts); $i++) {
            $attachments[$i] = array(
                'is_attachment' => false,
                'filename' => '',
                'name' => '',
                'attachment' => ''
            );

            if ($structure->parts[$i]->ifdparameters) {
                foreach ($structure->parts[$i]->dparameters as $object) {
                    if (strtolower($object->attribute) == 'filename') {
                        $attachments[$i]['is_attachment'] = true;
                        $attachments[$i]['filename'] = $object->value;
                    }
                }
            }

            if ($structure->parts[$i]->ifparameters) {
                foreach ($structure->parts[$i]->parameters as $object) {
                    if (strtolower($object->attribute) == 'name') {
                        $attachments[$i]['is_attachment'] = true;
                        $attachments[$i]['name'] = $object->value;
                    }
                }
            }

            if ($attachments[$i]['is_attachment']) {
                $attachments[$i]['attachment'] = imap_fetchbody($connection, $email_number, $i+1);

                /* 将消息的编码转换为可读的字符串 */
                if ($structure->parts[$i]->encoding == 3) {
                    $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
                }
                elseif ($structure->parts[$i]->encoding == 4) {
                    $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']);
                }
            }
        }
    }

    /* 处理附件 */
    foreach ($attachments as $attachment) {
        if ($attachment['is_attachment'] == 1) {
            $filename = $attachment['name'];
            if (empty($filename)) {
                $filename = $attachment['filename'];
            }

            /* 保存附件到本地文件系统 */
            $fp = fopen('attachments/' . $filename, 'w+');
            fwrite($fp, $attachment['attachment']);
            fclose($fp);
        }
    }

}

/* 关闭 IMAP 连接 */
imap_close($connection);

?>

此代码使用 $hostname 变量指定要连接的电子邮件服务器,以及 $username$password 变量指定使用的电子邮件地址和密码。imap_open() 函数打开到邮件服务器的 IMAP 连接,并将其存储在 $connection 变量中。imap_reopen() 函数重新打开连接,并选择邮箱。imap_search() 函数搜索未读电子邮件。imap_headerinfo() 函数获取每个邮件的头信息。

该代码从 IMAP 服务器中获取邮件的结构信息,并使用 imap_fetchbody() 函数获取附件的内容。在此过程中,如果必要的话,将进行编码转换。完成后,将附件保存到本地计算机的文件系统中。

POP3 协议获取附件

要使用 POP3 协议获取电子邮件的附件,您可以使用 PHP 的 POP3 类。您需要使用 pop3.phpmime_parser.php 文件,这些文件可以从 POP3 类库的网站中下载。

以下是一个基本的示例代码:

<?php

/* 引入 POP3 类 */
require_once 'pop3.php';

/* 要连接到的电子邮件服务器 */
$pop3 = new POP3('pop.gmail.com', 995, 30);

/* 电子邮件地址和密码 */
$username = 'youremail@gmail.com';
$password = 'yourpassword';

/* 登录到 POP3 服务器 */
$pop3->login($username, $password);

/* 获取未读邮件 */
$emails = $pop3->getEmails();

/* 遍历邮件 */
foreach ($emails as $email) {

    /* 获取附件 */
    $attachments = $email->getAttachments();

    /* 处理附件 */
    foreach ($attachments as $attachment) {
        /* 保存附件到本地文件系统 */
        $fp = fopen('attachments/' . $attachment->getName(), 'w+');
        fwrite($fp, $attachment->getContent());
        fclose($fp);
    }

}

/* 关闭 POP3 连接 */
$pop3->close();

?>

此代码使用 $pop3 变量打开到 POP3 服务器的连接,使用 $username$password 变量指定要使用的电子邮件地址和密码。$pop3->login() 函数将电子邮件地址和密码发送到 POP3 服务器以进行身份验证。$pop3->getEmails() 函数获取未读电子邮件。

该代码使用 $email->getAttachments() 函数从每个电子邮件中获取附件,并使用 $attachment->getName() 函数获取附件的名称。

在获取附件后,该代码使用 $fp = fopen() 函数打开文件,并使用 $attachment->getContent() 函数获取附件的内容。最后,使用 $fp->fwrite() 函数写入附件的内容,并使用 $fp->fclose() 函数关闭文件。

总结

以上是使用 PHP 获取电子邮件附件的两种方法。使用 IMAP 协议时,您需要安装并启用 PHP 的 IMAP 扩展。使用 POP3 类时,您需要使用 pop3.php 和 mime_parser.php 文件。无论您选择哪种方法,都可以轻松地获取电子邮件的附件。