Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Zapisywanie podczepionych plików z maila
phpamator
post
Post #1





Grupa: Zarejestrowani
Postów: 328
Pomógł: 3
Dołączył: 10.07.2016
Skąd: UK-raine

Ostrzeżenie: (0%)
-----


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.
  1. <?php
  2.  
  3. function getSenderData($senderId)
  4. {
  5. $host = "localhost";
  6. $username = "moj_user";
  7. $password = "pasior";
  8. $dbname = "moja_baza";
  9.  
  10. try {
  11. $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
  12. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  13. $pdo->exec("SET NAMES utf8");
  14.  
  15. $query = "SELECT `email_address`, `email_password` FROM `cxo_senders` WHERE `email_id` = :senderId AND `email_status` = 1 AND `email_type` = 1";
  16. $stmt = $pdo->prepare($query);
  17. $stmt->execute(['senderId' => $senderId]);
  18. $result = $stmt->fetch(PDO::FETCH_ASSOC);
  19.  
  20. return $result;
  21. } catch (PDOException $e) {
  22. die("Connection failed: " . $e->getMessage());
  23. }
  24. }
  25.  
  26. function isFileProcessed($pdo, $fileName)
  27. {
  28. $fileNameWithoutExtension = preg_replace('/\.(gz|xml|zip)$/', '', $fileName);
  29. $query = "SELECT COUNT(*) as count FROM `emails_data` WHERE `file_name` = :fileName";
  30. $stmt = $pdo->prepare($query);
  31. $stmt->execute(['fileName' => $fileNameWithoutExtension]);
  32. $result = $stmt->fetch(PDO::FETCH_ASSOC);
  33. return $result && $result['count'] > 0;
  34. }
  35.  
  36. $senderData = getSenderData(1);
  37. if (!$senderData) {
  38. die('Sender data not found.');
  39. }
  40.  
  41. $username = $senderData['email_address'];
  42. $password = $senderData['email_password'];
  43. $hostname = '{imap.gmail.com:993/imap/ssl}';
  44.  
  45. $inbox = imap_open($hostname . 'INBOX', $username, $password);
  46. if (!$inbox) {
  47. die('Cannot connect to the mailbox: ' . imap_last_error());
  48. }
  49.  
  50. // Sprawdzamy ostatnich 7 dni
  51. $date = date('d-M-Y', strtotime('-7 days'));
  52. $emails = imap_search($inbox, 'SINCE "' . $date . '"');
  53.  
  54. if (!$emails) {
  55. die('No emails.');
  56. }
  57.  
  58. $host = "localhost";
  59. $username = "moj_user";
  60. $password = "pasior";
  61. $dbname = "moja_baza";
  62.  
  63. try {
  64. $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
  65. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  66. echo '<h1>' . count($emails) . '</h1>';
  67. foreach ($emails as $emailNumber) {
  68. $structure = imap_fetchstructure($inbox, $emailNumber);
  69. if (isset($structure->parts) && count($structure->parts)) {
  70. for ($i = 0; $i < count($structure->parts); $i++) {
  71. $part = $structure->parts[$i];
  72.  
  73. if ($part->ifdparameters) {
  74. foreach ($part->dparameters as $object) {
  75. if (strtolower($object->attribute) == 'filename') {
  76. $filename = $object->value;
  77. $fileExtension = pathinfo($filename, PATHINFO_EXTENSION);
  78. if (in_array($fileExtension, ['gz', 'xml', 'zip'])) {
  79. if (!isFileProcessed($pdo, $filename)) {
  80. $message = imap_fetchbody($inbox, $emailNumber, $i + 1);
  81.  
  82. if ($part->encoding == 3) {
  83. $message = base64_decode($message);
  84. } elseif ($part->encoding == 4) {
  85. $message = quoted_printable_decode($message);
  86. }
  87. echo 'Processed attachment: ' . $filename . "\n";
  88. $filePath = 'reports/' . $filename;
  89. file_put_contents($filePath, $message);
  90.  
  91. } else {
  92. echo 'Attachment already processed: ' . $filename . '<br>';
  93. }
  94. }
  95. }
  96. }
  97. }
  98. }
  99. }
  100. }
  101. imap_close($inbox);
  102.  
  103. echo "\nWszystkie nowe emails z attachmentami z ostatnich 7 dni zapisane.\n";
  104.  
  105. } catch (PDOException $e) {
  106. die("Connection failed: " . $e->getMessage());
  107. }
  108.  


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
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 15:06