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
 
Start new topic
Odpowiedzi
phpamator
post
Post #2





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

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


Zaraz mnie trafi, widzę tylko nazwę attachmentu, jeśli gz mogę się dobrać do raw i zdekodować
ale za chiny nie mogę się dobrać do zip'a ...


Cytat(nospor @ 22.08.2024, 15:09:19 ) *
no ale porobiles te dumpy? Patrzyles ktora dokladnie linijka sie wyklada?

Tak, ale tam się nic nie wykłada, wszystko działa tylko nie widzi zawartości. Jak jest GZ to spoko ale jak zip to już ni chuchu, nazwę widzi ale kontentu niema.
Nie wiem jak to ugryźć
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 13.10.2025 - 23:08