Import załącznika tekstowego ze skrzynki pocztowej na FTP

0

Bazując na wątku: https://stackoverflow.com/questions/2649579/downloading-attachments-to-directory-with-imap-in-php-randomly-works

Udało mi się spiąć skrypt PHP z moją skrzynką pocztową.
Przeszukuje ją wg własnych kryteriów i jeśli pasujące wiadomości posiadają załącznik *.csv to chciałbym go przerzucić do siebie na FTP i tam dalej przetwarzać.

Całość wydawałoby się, że działa prawidłowo. Niestety plik, który zrzucany jest na FTP jest daleki od oryginału.

Struktura pliku oryginalnego:

"DISPATCH","PT2.0","20230606","1944","SOURCED","1892309"
"DEST","1892309","20230606","20230607","09:00","12:00","",""
"PRODUCT",1,1200,"Gasohol (Gasoline with Ethanol)","NEWARK, NJ",""
...

Struktura pliku pobranego przez PHP IMAP :

%PDF-1.7 
%âăĎÓ 
1 0 obj 
<< 
/Type /Catalog 
/Pages 2 0 R 
/PageMode /UseNone 
/ViewerPreferences << 
/FitWindow true 
/PageLayout /SinglePage 
/NonFullScreenPageMode /UseNone 
>> 
>> 
endobj 
5 0 obj 
<< 
/Length 3129 
/Filter [ /FlateDecode ] 
>> 
stream
xśÝY[wâČ~çWH¨],ˇVëŇm°
ƶ€aŚÇx<–wÖ»łł'9™äd_ň÷SŐI`<Ů“·Ä>€¤®®Ş®ţęÖ˘V˙>…H¬_żËŰŘúă÷Žş¸/;”[!|˛"·Â"Ë­?~ë|ęü˝“XKřü«“dłÂ<Ž¨Ey	+äq$©6&DÄłýŃBŔ·ŤŚF@“?ß;Ϣ˘ľ˙ŇEYśXíďͬĂ`„S+dyq9‘›śĄ†rP®Âş|čP˝n
Ü@¨÷đ˝3Ç«oײ»ń¬‡żv’8J2 }řÚq{ýAĺVžO‚Ę=ńĂĘőŁHQ=ąCŹnL˝gëaŮ	Ő¬RüÁ©	Ót©G…›áńÔ¤Ü+R·ŕBMÍpJÜ)	8ŤĎś‘śĘˇĎîŘ9]tĎÇănWR\?tţŮÉ…d «ăQa%hî	0ׯ°Âż|˙=¶¬«t> Ą4¬ě‚ş˛(ĎĚî¶LÄŇ(á4“&újeQҨgŁIşĹvŔ*R
#$ŠHiyB‹8ző•ç…Ű
...

Pełny skrypt: https://paste.bingner.com/paste/fdjhx/raw

Nakieruje mnie ktoś gdzie popełniam błąd?
Jakakolwiek sugestia będzie cenna.

Z góry dziękuję :)

3

Ale misiaczku - chcesz pobrać CSV, ale dostajesz z jakiegoś powodu PDF.
Nie wiem, co i jak robisz, ale problemem jest to, że albo pobierasz nieodpowiedni plik, albo w jakiś sposób jest on konwertowany do PDF.

To, co podałeś to jest zawartość/struktura typowa dla PDF. Taka mi przyszła do głowy myśl, że może gdzieś serwer pocztowy generuje podgląd tego CSV w bardziej czytelnej postaci i wypluwa jego zawartość jako PDF?

0

@cerrato
Otrzymywane emaile mają 2 załączniki.
Jednym z nich jest CSV (waży ok 3kb)
Drugim jest plik PDF (ok 73kb)

Filtruje te załączniki po nazwie (preg_match) aby wyłuskać tylko csv.
Idąc za Twoją sugestią pozbyłem się tego filtrowania i pobieram wszystkie załączniki. Niestety nie wiadomo dlaczego oba mają tę samą wagę, a csv (błędną) strukturę.
PDF działa prawidłowo
screenshot-20230624225645.png

Próbowałem więc wysłać wiadomość zawierającą tylko 1 załącznik - csv
Skrypt widzi załącznik, jest w stanie pobrać jego nazwę, ale zawartość jest pusta (pusty string).
To o tyle dziwne, że załącznik jest na mailu i da się go normalnie pobrać...

Array ( 
  [is_attachment] => 1 
  [filename] => testPTC-AK_CORP.-1892309.R1.csv 
  [name] => testPTC-AK_CORP.-1892309.R1.csv 
  [attachment] => 
);

edit:
mam błąd - nie wiem tylko z czego on wynika.
po zmianie
$attachment = imap_fetchbody($inbox, $email_number, $email_number+1);
na
$attachment = imap_fetchbody($inbox, $email_number, 2);

Wszystko działa.
Czym jest ten 3 parametr i czy mogę zostawić tam wartość 2?

wg dokumentacji:

section
The part number. It is a string of integers delimited by period which index into a body part list as per the IMAP4 specification

Ktoś napisze po ludzku co to jest i jak z tego parametru krzystać?

2

Ten fragment $email_number+1 wydawał mi się podejrzany, ale daaaaawno nie miałem do czynienia z imap_fetchbody, więc siedziałem cicho ;)

A co do tego, za co odpowiada trzeci parametr - zapytałem kumpla i GPT napisał coś takiego:

W funkcji imap_fetchbody języka PHP trzeci parametr odpowiada za określenie części wiadomości e-mail, którą chcesz pobrać. Funkcja imap_fetchbody służy do pobierania treści wiadomości e-mail z serwera IMAP.

Sygnatura funkcji imap_fetchbody wygląda następująco:

string imap_fetchbody ( resource $imap_stream , int $msg_number , string $section [, int $options = 0 ] )
  • $imap_stream: Jest to strumień połączenia z serwerem IMAP, zwrócony przez funkcję imap_open.
  • $msg_number: Numer wiadomości e-mail, którą chcesz pobrać.
  • $section: Określa część wiadomości, którą chcesz pobrać. Może to być np. "1" dla części tekstowej wiadomości, "2" dla pierwszego załącznika itp.
  • $options (opcjonalny): Dodatkowe opcje, które można przekazać do funkcji.

Trzeci parametr, $section, jest kluczowy, ponieważ pozwala określić, jaką część wiadomości chcesz pobrać. Może to być np. treść tekstowa, nagłówek, załącznik, część HTML itp. W zależności od wartości $section, funkcja imap_fetchbody pobierze i zwróci odpowiednią część wiadomości e-mail.

Na przykład, jeśli chcesz pobrać treść tekstową wiadomości, możesz użyć:

$text = imap_fetchbody($imap_stream, $msg_number, "1");

Gdzie $text będzie zawierać treść tekstową wiadomości o numerze $msg_number.

0

Dziękuję za pomoc :)

Problem rozwiązany. Tak jak wspominałem - wynikał on z trzeciego argumentu funkcji imap_fetchbody

1 użytkowników online, w tym zalogowanych: 0, gości: 1