Hej wszystkim,
Pomocy, nawet "GiePeTto" sobie nie radzi.
Jakiś czas temu napisałem skrypt który sprawdza maile (raporty dmarc), jeśli raport zapisany jest w formacie gz, wszystko śmiga jak należy, zbiera mi raporty, zapisuje, przetwarza itd.
Gorzej, że ostatnio zacząłem dostawać raporty w zipach. Zmodyfikowałem kod, żeby wykrywał zip, gz i xml gdyby taki się pojawił.
Niestety nie chce mi nic poza gz zapisywać i nie widzę nigdzie dlaczego.
<?php
function getSenderData($senderId)
{
$host = "localhost";
$username = "moj_user";
$password = "pasior";
$dbname = "moja_baza";
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec("SET NAMES utf8");
$query = "SELECT `email_address`, `email_password` FROM `cxo_senders` WHERE `email_id` = :senderId AND `email_status` = 1 AND `email_type` = 1";
$stmt = $pdo->prepare($query);
$stmt->execute(['senderId' => $senderId]);
$result = $stmt->fetch(PDO::FETCH_ASSOC);
return $result;
} catch (PDOException $e) {
die("Connection failed: " . $e->getMessage()); }
}
function isFileProcessed($pdo, $fileName)
{
$fileNameWithoutExtension = preg_replace('/\.(gz|xml|zip)$/', '', $fileName); $query = "SELECT COUNT(*) as count FROM `emails_data` WHERE `file_name` = :fileName";
$stmt = $pdo->prepare($query);
$stmt->execute(['fileName' => $fileNameWithoutExtension]);
$result = $stmt->fetch(PDO::FETCH_ASSOC);
return $result && $result['count'] > 0;
}
$senderData = getSenderData(1);
if (!$senderData) {
die('Sender data not found.'); }
$username = $senderData['email_address'];
$password = $senderData['email_password'];
$hostname = '{imap.gmail.com:993/imap/ssl}';
$inbox = imap_open($hostname . 'INBOX', $username, $password);
if (!$inbox) {
die('Cannot connect to the mailbox: ' . imap_last_error
()); }
// Sprawdzamy ostatnich 7 dni
$emails = imap_search($inbox, 'SINCE "' . $date . '"');
if (!$emails) {
}
$host = "localhost";
$username = "moj_user";
$password = "pasior";
$dbname = "moja_baza";
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
foreach ($emails as $emailNumber) {
$structure = imap_fetchstructure($inbox, $emailNumber);
if (isset($structure->parts) && count($structure->parts)) { for ($i = 0; $i < count($structure->parts); $i++) { $part = $structure->parts[$i];
if ($part->ifdparameters) {
foreach ($part->dparameters as $object) {
if (strtolower($object->attribute) == 'filename') { $filename = $object->value;
$fileExtension = pathinfo($filename, PATHINFO_EXTENSION
); if (in_array($fileExtension, ['gz', 'xml', 'zip'])) { if (!isFileProcessed($pdo, $filename)) {
$message = imap_fetchbody($inbox, $emailNumber, $i + 1);
if ($part->encoding == 3) {
} elseif ($part->encoding == 4) {
}
echo 'Processed attachment: ' . $filename . "\n"; $filePath = 'reports/' . $filename;
file_put_contents($filePath, $message);
} else {
echo 'Attachment already processed: ' . $filename . '<br>'; }
}
}
}
}
}
}
}
imap_close($inbox);
echo "\nWszystkie nowe emails z attachmentami z ostatnich 7 dni zapisane.\n";
} catch (PDOException $e) {
die("Connection failed: " . $e->getMessage()); }
Sprawdzam pliki czy już wcześniej były zapisane, żeby w bazie nie powielać wpisów
w kolejnym kroku analizuję raporty na potrzeby statystyki.
I wszystko działa super ale kurcze tylko z plikami gz .....
Nie słyszałem, żeby były jakieś ograniczenia w tej kwestii.
Pomóżcie.
Pozdrówka
Ten post edytował phpamator 22.08.2024, 12:52:08