php рассчитывает, сколько вложений в одном письме - PullRequest
1 голос
/ 29 июня 2019

Я работаю над своим PHP, чтобы подсчитать, сколько вложений я получил в одном письме.

Когда я пытаюсь это сделать:

echo count($structure->parts);

Вывод будет отображаться так:

3

У меня есть 2 вложения в одном письме, поэтому возвращаемый результатневерен.Поэтому, когда я попробовал это:

for($i = 0; $i < count($structure->parts); $i++) {
    echo $i;
}

Выходные данные возвращаются так:

012

Вот полный код:

<?php

require_once "Mail.php";
require_once('Mail/IMAPv2.php');

$username = 'myusername';
$password = 'mypassword';
$mailserver = '{imap.domain.com:993/imap/ssl/novalidate-cert}INBOX';
$mailbox = imap_open($mailserver, $username, $password) or die("Can't connect: " . imap_last_error());
$key = "mykey";
$email_number = openssl_decrypt(hex2bin('274'),'AES-128-CBC', $key);
$attach_id = $_GET['attid'];

/* get information specific to this email */
$overview = imap_fetch_overview($mailbox, $email_number, 0);

$message = imap_fetchbody($mailbox, $email_number, 2);

/* get mail structure */
$structure = imap_fetchstructure($mailbox, $email_number);
$attachments = array();


for($i = 0; $i < count($structure->parts); $i++) {
    echo $i;
}
?>

У меня есть 2 вложенияв одном письме, поэтому возвращаемый результат должен отображать 2, а не 3 или 012, который по-прежнему отображается 3. Я попытался найти ответ в Google, как я мог бы подсчитать значение для вложений в одном письме с помощью imap, ноЯ не могу этого сделать.

Не могли бы вы показать мне пример того, как я могу рассчитывать, сколько вложений я получил в одном письме?

Спасибо.

РЕДАКТИРОВАТЬ: Вот вывод для $ структуры-> частей:

Array ( [0] => stdClass Object ( [type] => 1 [encoding] => 0 [ifsubtype] => 1 [subtype] => 
ALTERNATIVE [ifdescription] => 0 [ifid] => 0 [ifdisposition] => 0 [ifdparameters] => 0 
[ifparameters] => 1 [parameters] => Array ( [0] => stdClass Object ( [attribute] => boundary 
[value] => 00000000000014af61058c780612 ) ) [parts] => Array ( [0] => stdClass Object ( [type] => 0 
[encoding] => 0 [ifsubtype] => 1 [subtype] => PLAIN [ifdescription] => 0 [ifid] => 0 [lines] => 3 
[bytes] => 42 [ifdisposition] => 0 [ifdparameters] => 0 [ifparameters] => 1 [parameters] => 
Array ( [0] => stdClass Object ( [attribute] => charset [value] => UTF-8 ) ) ) [1] => 
stdClass Object ( [type] => 0 [encoding] => 4 [ifsubtype] => 1 [subtype] => HTML [ifdescription] => 0 
[ifid] => 0 [lines] => 4 
[bytes] => 307 [ifdisposition] => 0 [ifdparameters] => 0 [ifparameters] => 1 [parameters] => 
Array ( [0] => stdClass Object ( [attribute] => charset [value] => UTF-8 ) ) ) ) ) [1] => 
stdClass Object ( [type] => 3 [encoding] => 3 [ifsubtype] => 1 [subtype] => OCTET-STREAM 
[ifdescription] => 0 [ifid] => 1 [id] => [bytes] => 99376 [ifdisposition] => 1 [disposition] => 
attachment [ifdparameters] => 1 [dparameters] => Array ( [0] => stdClass Object ( [attribute] => 
filename [value] => 2019-01-23 (1).rar ) ) [ifparameters] => 1 [parameters] => Array ( [0] => 
stdClass Object ( [attribute] => name [value] => 2019-01-23 (1).rar ) ) ) [2] => stdClass Object 
( [type] => 3 [encoding] => 3 [ifsubtype] => 1 [subtype] => X-ZIP-COMPRESSED [ifdescription] => 0 
[ifid] => 1 [id] => [bytes] => 250846 [ifdisposition] => 1 [disposition] => attachment 
[ifdparameters] => 1 [dparameters] => Array ( [0] => stdClass Object ( [attribute] => filename 
[value] => email.zip ) ) [ifparameters] => 1 [parameters] => Array ( [0] => 
stdClass Object ( [attribute] => name [value] => email.zip ) ) ) )

1 Ответ

2 голосов
/ 29 июня 2019

Пожалуйста, ознакомьтесь с содержанием $structure->parts.У вас есть массив из 3 частей, последние две из которых содержат следующие свойства:

[ifdisposition] => 1 
[disposition] => attachment

Поскольку первая часть содержит [ifdisposition] => 0, а свойство [disposition] не существует, мы можем заключить, что ifdisposition - это логическое значение, которое сообщает вам, доступен ли disposition.Мы можем убедиться в этом, проверив документацию PHP для imap_fetchstructure().

Чтобы найти все вложения, вы должны выполнить итерации по частям и сопоставить все случаи, где ifdisposition === true и disposition === 'attachment'.Если вы хотите быстро извлечь все это, вы можете сделать что-то вроде следующего:

$attachments = array_filter($structure->parts, function($part) {
    return $part->ifdisposition && $part->disposition === 'attachment';
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...