Для работы с почтовым ящиком с использованием PHP и расширения IMAP, вам нужно выполнить несколько шагов. Ниже приведен пример кода, который выполняет следующие задачи:
Проверяет почтовый ящик на новые письма.
Сохраняет данные письма в формате JSON.
Проверяет прикрепленные файлы и сохраняет их в папку upload.
Для начала убедитесь, что расширение IMAP установлено и включено в вашем PHP. Вы можете установить его с помощью следующей команды:
sudo apt-get install php-imap
После установки убедитесь, что расширение включено в вашем php.ini:
extension=imap.so
<?php
// Настройки подключения к почтовому ящику
$hostname = '{imap.example.com:993/imap/ssl}INBOX';
$username = 'your_email@example.com';
$password = 'your_password';
// Подключение к почтовому ящику
$inbox = imap_open($hostname, $username, $password) or die('Не удалось подключиться: ' . imap_last_error());
// Получение списка писем
$emails = imap_search($inbox, 'UNSEEN');
if ($emails) {
// Перебор всех новых писем
foreach ($emails as $email_number) {
// Получение заголовков письма
$overview = imap_fetch_overview($inbox, $email_number, 0);
$message = imap_fetchbody($inbox, $email_number, 1);
// Получение структуры письма
$structure = imap_fetchstructure($inbox, $email_number);
// Сохранение данных письма в формате JSON
$email_data = [
'subject' => $overview[0]->subject,
'from' => $overview[0]->from,
'date' => $overview[0]->date,
'message' => $message,
];
$json_filename = 'email_' . $email_number . '.json';
file_put_contents($json_filename, json_encode($email_data, JSON_PRETTY_PRINT));
// Проверка на наличие прикрепленных файлов
if (isset($structure->parts) && count($structure->parts)) {
for ($i = 0; $i < count($structure->parts); $i++) {
$attachments[$i] = [
'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($inbox, $email_number, $i + 1);
if ($structure->parts[$i]->encoding == 3) { // 3 = BASE64
$attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
} elseif ($structure->parts[$i]->encoding == 4) { // 4 = QUOTED-PRINTABLE
$attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']);
}
// Сохранение прикрепленного файла
$filename = $attachments[$i]['filename'] ?: $attachments[$i]['name'];
file_put_contents('upload/' . $filename, $attachments[$i]['attachment']);
}
}
}
}
} else {
echo "Новых писем нет.";
}
// Закрытие соединения
imap_close($inbox);Подключение к почтовому ящику: Используется функция imap_open для подключения к почтовому ящику через IMAP.
Поиск новых писем: Функция imap_search ищет письма с флагом UNSEEN (непрочитанные).
Получение данных письма: Используются функции imap_fetch_overview и imap_fetchbody для получения заголовков и тела письма.
Сохранение данных в JSON: Данные письма сохраняются в файл в формате JSON.
Обработка вложений: Проверяется структура письма на наличие вложений. Если вложения есть, они декодируются и сохраняются в папку upload.
Закрытие соединения: После завершения работы с почтовым ящиком соединение закрывается с помощью imap_close.
Убедитесь, что папка upload существует и доступна для записи.
Обратите внимание на кодировку вложений (BASE64, QUOTED-PRINTABLE и т.д.), чтобы правильно декодировать файлы.
Не забудьте заменить imap.example.com, your_email@example.com и your_password на реальные данные вашего почтового ящика.
Этот код является базовым примером и может быть расширен в зависимости от ваших потребностей.