📅  最后修改于: 2023-12-03 15:24:54.026000             🧑  作者: Mango
在 PHP 中获取电子邮件的附件可以通过 IMAP 和 POP3 协议来实现。IMAP 协议是交互式邮件协议,它允许在本地和远程邮件服务器之间保留同步状态。POP3 协议是获取邮件的一种方式,它下载邮件到本地,然后将其从服务器上删除。
要使用 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 协议获取电子邮件的附件,您可以使用 PHP 的 POP3 类。您需要使用 pop3.php
和 mime_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 文件。无论您选择哪种方法,都可以轻松地获取电子邮件的附件。