Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wyciąganie adresów e-mail za pomocą imap problem z tablicą
maraska
post
Post #1





Grupa: Zarejestrowani
Postów: 143
Pomógł: 0
Dołączył: 9.04.2013

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


Witam. Chciałem wyciągnąć i zapisać do bazy adresy e-mail znajdujące się w body przychodzących wiadomości.
W ten sposób
  1. .....
  2. $emails = imap_search($inbox,'ALL');
  3.  
  4. if($emails) {
  5. foreach($emails as $email_number) {
  6.  
  7. $message = imap_fetchbody($inbox,$email_number,1.2);
  8. preg_match_all("/([w.+-]+)@([a-zA-z0-9.-]+).(w{2,6})/", $message, $wynik);
  9.  
  10. foreach ($wynik as &$value){
  11. echo '<pre>';
  12. print_r($value);
  13. echo '</pre>';
  14.  
  15. //zapis do bazy


Łączy się ze skrzynką, zlicza maile ale nie wiem jak rozwiązać problem tablic w pętli.
W body każdej wiadomości może być kilka adresów e-mail.

print_r($value); daje:

<pre>Array
(
)
</pre><pre>Array
(
)
</pre><pre>Array
.......

Z góry dziękuję za pomoc
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
maraska
post
Post #2





Grupa: Zarejestrowani
Postów: 143
Pomógł: 0
Dołączył: 9.04.2013

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


Cytat(trzczy @ 14.12.2017, 05:18:53 ) *
Czekaj... jak masz tablicę stringów, to wewnątrz pętli foreach jest dostęp do każdego stringa jako stringa. Może powinieneś robić zapytanie w środku pętli, a nie czekając na jej koniec.


No jasne, wyniki print_r mnie zmyliły.

Poniżej zamieszczam działający skrypt, który wyciąga adresy e-mail z Undelivery i oznacza te adresy w bazie danych jako złe.

Adresy e-mail, które zostały po naszej wysyłce odrzucone - Undelivery są ukryte w body wiadomości.
Jest tam na raz kilka postaci adresów, w tym nasz. Przykład:
[0] => bok@anonse.eu
[1] => jan.piotrow.zurm@wp.pl
[2] => rfc822;jan.piotrow.zurm@wp.pl
[3] => "jan.piotrow.zurm@wp.pl":

Z przejrzenia iluś tam setek wyników wychodzi, że adres o który nam chodzi można identyfikować po "rfc822;" i tak też filtruje ten skrypt.
Być może na innym serwerze jest inaczej, stąd zostawione print_r i echo do testów.
Powyższy "czysty" przykład jest z parsowania body z parametrem "2", dla "1.2" było dużo gorzej.
Wskazany jest podfolder Drafts, bo tam zostały zrzucone do testów wiadomości Undelivery.

Dzięki za pomoc wszystkim z tego tematu


  1. // Skryt do wyciągania adresów e-mail z body zwrotek Undelivery i oznaczania tych adresów w bazie danych jako zły adres.
  2.  
  3. error_reporting(E_ALL & ~E_NOTICE & ~E_USER_NOTICE);
  4.  
  5. require 'cat_name.php'; //tam jest połączenie z bazą danych
  6.  
  7.  
  8. //Połaczenie z kontem email
  9.  
  10. $imap = imap_open("{domena.eu:143}INBOX.Drafts", "bok@domena.eu", "passwd") OR die ("can't connect: " . imap_last_error());
  11.  
  12. /* Odchaszowanie tego wyświetli strukturę INBOX z czego będziemy wiedzieli do jakiego podfolderu chcemy wejść w $imap bo czasami Kosz to naprawdę jest Trash
  13. echo "<h1>Mailboxes</h1>\n";
  14. $folders = imap_listmailbox($imap, "{user@domena.eu:143}", "INBOX");
  15. */
  16.  
  17. //Wyciągnięcie body maili
  18.  
  19. $emails = imap_search($imap,'ALL'); //zamaiast ALL można ustawić nieprzeczytane itp. zob. manual imap
  20.  
  21. if($emails) {
  22. foreach($emails as $email_number) {
  23.  
  24. $message = imap_fetchbody($imap,$email_number,2); //zamiast "2" można testować "1.2", u mnie "2" działa najlepiej
  25.  
  26. $pattern='/\S+@\S+\.\S{1,6}/';
  27.  
  28. preg_match_all($pattern, $message, $matchArray);
  29.  
  30. echo 'print_r($matchArray'; // dotestów
  31. print_r($matchArray[0]); // dotestów
  32.  
  33. foreach ($matchArray[0] as $value){
  34. if(strstr($value, "rfc822;")!==False){
  35. $value = str_replace("rfc822;",'', $value);
  36. echo "echo Svalue = $value\n"; // dotestów
  37.  
  38. $qry = mysql_query("UPDATE `tabela` SET `zly_email` = 1 WHERE `email` LIKE '$value'");
  39. }
  40. }
  41. }
  42. }
  43.  
  44. /* zamykamy połączenie */
  45. //imap_delete($imap,'1:*'); // !!!!!!!!!!! Uwaga, czyścimy całą zawartość skrzynki, tu Drafts, bo tam były same Undelivery
  46. imap_errors();
  47. imap_alerts();
  48. imap_close($imap, CL_EXPUNGE);


Ten post edytował maraska 14.12.2017, 13:05:32
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: 4.10.2025 - 14:06