php posta imap olsun. PHP'de imap posta işlevleri. E-posta klasörleri

  • 20.06.2020

imap işlevlerinin olası bir kullanımı, kullanıcıların posta listenizden aboneliklerini ve aboneliklerini iptal etmelerini yönetecek bir posta arka plan programı oluşturmaktır. Bu görevi gerçekleştirmek için posta listelerinde genellikle iki yöntem kullanılır. Birincisi, kullanıcının belirli bir sayfaya gitmesi ve eylemlerini onaylaması gerektiğini varsayar, ikincisi bir e-posta göndermeyi gerektirir. İkincisi ayrıca komut dosyası işleyicisinin cron daemon-om tarafından düzenli olarak çalıştırılmasını gerektirir. Bu nedenle ilk yöntem kadar popüler değildir.

Ancak, gördüğünüz gibi, en ciddi postalar ikinci yöntemi kullanır. Yani cron kullanma seçeneğiniz varsa, onu kullanın.

Aslında, işlevleri anlamak zor değil. Komut dosyasının işleyeceği harflerin başlıklarını ayrıştırırken bazı zorluklar ortaya çıkabilir.

Komut dosyasının algoritmasını bulmak kolaydır. Daemon, posta sunucusuyla bir bağlantı kurar ve üzerindeki mesajları kontrol eder. Harf yoksa, komut dosyası durur. Harfler varsa, ilk harfin başlıkları ayrıştırılır. Kimden ve konu alanları aranır. Konu alanı iki geçerli başlık seçeneğinden birini içeriyorsa (abonelik veya abonelikten çıkma), o zaman başlangıç ​​alanının değerine karşılık gelen kayıt aktif hale gelir (onaylanır) veya tablodan kaldırılır. Her iki durumda da, komut dosyasının eylemleri hakkında ilgili bir bildirim, kimden alanında belirtilen adrese gönderilir. E-posta daha sonra silinmek üzere işaretlenir. Konu geçerli konular içermiyorsa bir hata bildirimi gönderilir ve e-posta da silinmek üzere işaretlenir. Komut dosyası daha sonra bir sonraki e-postaya geçer. Tüm harfleri ayrıştırmayı bitirdikten sonra kutuyu temizliyor.

Posta kutusunu açmak için imap_open işlevi kullanılır. PHP birden çok protokolü desteklediğinden, kutuyla çalışmak için hangi protokolün kullanılacağını açıkça belirtmek gerekir. Bizim durumumuzda bu, 110 numaralı bağlantı noktasındaki (standart) pop3'tür. Komut dosyasının yürütülmesinin sonucunu $my_box değişkenine atarız.

$my_box = imap_open("(you.pop.host/pop3:110)", "giriş", "şifre");

Daha sonra bu değişkenin hemen hemen tüm imap işlevlerinde kullanılacağını göreceksiniz. Ardından, mektuplar için posta kutusunu kontrol edin. Kontrol, imap_num_msg işlevi tarafından gerçekleştirilir.

$n = imap_num_msg($my_box);

Sonuç olarak, $n değişkeni posta kutusundaki harf sayısını içerecektir. Bu sayı sıfırdan büyük veya ona eşit olabilir (kutu boşsa). Harfler varsa, while döngüsünde harf sayısını sırayla artırarak harfleri ayrıştırırız. Kutudaki ilk harfin, dizinin ilk elemanı gibi 0 sayısına sahip olacağına dikkat edin. Harf sayısını artırmak için $m değişkenine 0 değerini atarız ve ardından döngü koşullarında bir $m++ arttırırız.

İlgilendiğimiz başlıkları ayrıştırmak için iki fonksiyon yeterlidir: imap_header ve imap_fetch_overview . Her birini gerçekleştirmek için kutuya ek olarak harfin numarasını da belirtmeniz gerekir. Bizim durumumuzda, döngü içinde $m değişkenine eşit olacaktır.

imap_header, yürütmenin bir sonucu olarak ileti başlığı hakkında ayrıntılı bilgi içeren bir nesne döndürür. Bu nesne, diğer şeylerin yanı sıra, dört değer içeren bir dizi içerir. Bunlar kişisel, adl, posta kutusu ve ana bilgisayardır. Bunlardan sadece posta kutusu ve ana bilgisayarla ilgileniyoruz. Bunları değiştirerek, mektubun gönderildiği adresi alacağız.

$h = imap_header($my_box, $m); $h = $h->dan; foreach ($h as $k => $v) ( $mailbox = $v->mailbox; $host = $v->host; $personal = $v->personal; $email = $mailbox . "@" . $ana bilgisayar;

imap_fetch_overview - mektubun konusunu bulmamızı sağlar. Aynı amaçlar için imap_header da kullanılabilir, ancak birkaç nedenden dolayı bu bazen çalışmayabilir. Bu işlevin döndürdüğü diziden yalnızca konu alanına ihtiyacımız var

$s = imap_fetch_overview($my_box, $m); foreach ($s as $k => $v) $subj = $v->subject;

Sonraki adımlarımız, e-postayı veritabanından çıkarmak ve varsa, bu girişin bulunduğu satırın tamamını olarak işaretleyin veya silin. Sitedeki mail formunu doldurduktan sonra aboneye 0 statüsü verildiğini ve aboneliği onayladıktan sonra 1 olarak değiştiğini varsayalım.

If ($subj == "abone ol") ( mysql_query("update abone seti stat=1 burada email=$my_email"); $del = imap_delete($my_box, $m); mail($email, $add_sbj, $add_text , $headers); ) else if ($subj == "abonelikten çık") ( mysql_query("e-posta = $my_emailim_email"); $del = imap_delete($my_box, $m); mail($email, $ del_sbj, $del_text, $headers); ) else ( $del = imap_delete($my_box, $m); mail($email, $err_sbj, $err_text, $headers); ) tüm işlemlerden sonra komut dosyası kutuyu temizler. $temizle = imap_expunge($my_box);

Bu en basit program, PHP'nin yalnızca dinamik olarak değişen siteleri değil, aynı zamanda kullanıcı tarafından hiç görünmeyen hizmetleri de yazabildiğinin bir göstergesidir.

Veritabanı bağlantı parametreleri hariç tüm programın listesi:

"config.php" içerir; // veritabanı bağlantısı $my_box = imap_open("(you.pop.host/pop3:110)", "login", "password"); $n = imap_num_msg($my_box); $m = 0; $add_text = "Aboneliğinizi onayladığınız için teşekkür ederiz"; $add_sbj = "eklediniz!"; $del_text = "Posta listesinden çıkarıldınız."; $del_sbj = "listeden sil"; $err_text = "Üzgünüm ama bu posta kutusu sadece posta listesi yönetimi için kullanılıyor"; $err_sbj = "hata"; $headers = "from: abone ol robot x-mailer: php4 içerik türü: metin/düz; charset=windows-1251 "; if($n != 0) ( while($m++)< $n) { $h = imap_header($my_box, $m); $s = imap_fetch_overview($my_box, $m); $h = $h->itibaren; foreach ($h as $k =>$v) ( $mailbox = $v->mailbox; $host = $v->host; $personal = $v->personal; $email = $mailbox . "@" . $host; $my_email = mysql_escape_string($email); ) foreach ($s as $k => $v) $subj = $v->subj; if ($subj == "abone ol") ( mysql_query("tablo setini güncelle stat=1 burada email=$my_email"); //print mysql_error(); $del = imap_delete($my_box, $m); mail($ email, $add_sbj, $add_text, $headers); ) else if ($subj == "abonelikten çık") ( mysql_query("e-postanın = $my_email olduğu tablodan sil"); $del = imap_delete($my_box, $m) ; mail($email, $del_sbj, $del_text, $headers); ) else ( $del = imap_delete($open_box, $m); mail($email, $err_sbj, $err_text, $headers); ) ) $clear = imap_expunge($my_box); )

Listede, win'den koi'ye olası bir dönüşüm, gönderenin posta kutusunun kontrol edilmesi vb. gibi bazı ayrıntılar eksik. Bunlar zaten herkesin gerektiği gibi ekleyebileceği işlevsel fazlalıklar.

imap işlevlerinin olası bir kullanımı, kullanıcıların posta listenizden aboneliklerini ve aboneliklerini iptal etmelerini yönetecek bir posta arka plan programı oluşturmaktır. Bu görevi gerçekleştirmek için posta listelerinde genellikle iki yöntem kullanılır. Birincisi, kullanıcının belirli bir sayfaya gitmesi ve eylemlerini onaylaması gerektiğini varsayar, ikincisi bir e-posta göndermeyi gerektirir. İkincisi ayrıca komut dosyası işleyicisinin cron daemon?om tarafından düzenli olarak çalıştırılmasını gerektirir. Bu nedenle ilk yöntem kadar popüler değildir.

Ancak, gördüğünüz gibi, en ciddi postalar ikinci yöntemi kullanır. Bu nedenle crond kullanma imkanınız varsa kullanın.

Aslında işlevleri anlamak o kadar da zor değil. Daha önce PHP için çalışmış bir kişi, onlarla nasıl çalışılacağını kolayca anlayacaktır. Komut dosyasının işleyeceği harflerin başlıklarını ayrıştırırken bazı zorluklar ortaya çıkabilir.

Komut dosyasının algoritmasını bulmak kolaydır. Daemon, posta sunucusuyla bir bağlantı kurar ve üzerindeki mesajları kontrol eder. Harf yoksa, komut dosyası durur.
Harfler varsa, ilk harfin başlıkları ayrıştırılır. Kimden ve konu alanları aranır. Konu alanı iki geçerli başlık seçeneğinden birini içeriyorsa (abonelik veya abonelikten çıkma), o zaman başlangıç ​​alanının değerine karşılık gelen kayıt aktif hale gelir (onaylanır) veya tablodan kaldırılır. Her iki durumda da, komut dosyasının eylemleri hakkında ilgili bir bildirim, kimden alanında belirtilen adrese gönderilir. E-posta daha sonra silinmek üzere işaretlenir. Konu geçerli konular içermiyorsa bir hata bildirimi gönderilir ve e-posta da silinmek üzere işaretlenir. Komut dosyası daha sonra bir sonraki e-postaya geçer.
Tüm harfleri ayrıştırmayı bitirdikten sonra kutuyu temizliyor.

Akış çizelgeleriyle okuyucuyu sıkmayacağım, o yüzden doğrudan konuya girelim. Posta kutusunu açmak için imap_open işlevi kullanılır. PHP birden çok protokolü desteklediğinden, kutuyla çalışmak için hangi protokolün kullanıldığını açıkça belirtmelisiniz. Bizim durumumuzda bu, 110 numaralı bağlantı noktasındaki POP3'tür (standart). Komut dosyasının yürütülmesinin sonucunu $my_box değişkenine atarız.


Daha sonra bu değişkenin hemen hemen tüm imap işlevlerinde kullanılacağını göreceksiniz. Ardından, mektuplar için posta kutusunu kontrol edin. Kontrol, imap_num_msg işlevi tarafından gerçekleştirilir.

$n = imap_num_msg ($my_box );

Sonuç olarak, $n değişkeni posta kutusundaki harf sayısını içerecektir. Bu sayı sıfırdan büyük veya ona eşit olabilir (kutu boşsa).
Harfler varsa, while döngüsünde harf sayısını sırayla artırarak harfleri ayrıştırırız. Kutudaki ilk harfin, dizinin ilk elemanı gibi 0 sayısına sahip olacağına dikkat edin.
Harf sayısını artırmak için $m değişkenine 0 değerini atarız ve ardından döngü koşullarında bir $m++ arttırırız.

İlgilendiğimiz başlıkları ayrıştırmak için iki fonksiyon yeterlidir: imap_header ve imap_fetch_overview. Her birini gerçekleştirmek için kutuya ek olarak harfin numarasını da belirtmeniz gerekir. Bizim durumumuzda, döngü içinde $m değişkenine eşit olacaktır.

Imap_header, yürütmenin bir sonucu olarak, ileti başlığı hakkında kapsamlı bilgi içeren bir nesne döndürür. Bu nesne, diğer şeylerin yanı sıra, dört değer içeren bir dizi içerir. Bunlar kişisel, adl, posta kutusu ve ana bilgisayardır. Bunlardan sadece posta kutusu ve ana bilgisayarla ilgileniyoruz. Bunları değiştirerek, mektubun gönderildiği adresi alacağız.


$h = $h -> gelen ;
a
foreach ($h as $k => $v ) (
$posta kutusu = $v -> posta kutusu;
$host = $v -> host ;
$kişisel = $v -> kişisel ;
$e-posta = $posta kutusu. ? @ ¬ . $ ana bilgisayar ;

imap_fetch_overview - e-postanın konusunu bize bildirir. Aynı amaçlar için imap_header da kullanılabilir, ancak birkaç nedenden dolayı bu bazen çalışmayabilir. Bu işlevin döndürdüğü diziden yalnızca konu alanına ihtiyacımız var


foreach ($s as $k => $v ) (
$subj = $v -> konu ;
}

Bir sonraki adımımız, e-postayı veritabanından çıkarmak ve varsa, bu girişin bulunduğu tüm satırı “doğrulandı” olarak işaretlemek veya silmek. Sitedeki mail formunu doldurduktan sonra aboneye 0 statüsü verildiğini ve aboneliği onayladıktan sonra 1 olarak değiştiğini varsayalım.

if ($subj == "ABONE OL" ) (
mysql_query( "GÜNCELLEME abone ol SET stat=1 WHERE e-posta=$my_email");

}
mysql_query( "NEREDE e-posta aboneliğinden SİL = $my_email");
$del = imap_delete ($my_box , $m );
}
başka(
$del = imap_delete ($my_box , $m );
}

yukarıda belirtildiği gibi, tüm eylemleri gerçekleştirdikten sonra komut dosyası kutuyu temizler.


Bu en basit program, PHP'de yalnızca dinamik olarak değişen siteleri değil, aynı zamanda kullanıcı tarafından hiç görünmeyen hizmetleri de yazabileceğinizin bir göstergesidir. Tabii ki, Shell betiği açısından PHP, rakibi Perl'den farklı olarak uygulanamaz, ancak yine de ...

Veritabanı bağlantı parametreleri (db.php) hariç tüm programın listesi:

"db.php" içerir;
$my_box = imap_open ("(you.pop.host/pop3:110)" , "giriş" , "şifre" );
$n = imap_num_msg ($my_box );
$m = 0 ;
$add_text="

Aboneliğinizi onayladığınız için teşekkür ederiz";
$add_sbj = "Sen ekledin!" ;
$del_metin = "

Üzgünüz, ama bu posta kutusu kullanımda.
sadece dağıtım yönetimi için" ;
$err_sbj = "Hata";
$başlıklar = Gönderen: Robota Abone Ol

Xmailer: PHP4

İçerik türü: metin/düz; karakter kümesi=UTF-8
" ;
if($n != 0 ) (
süre($m++< $n ) {
$h = imap_header ($my_box , $m );
$s = imap_fetch_overview ($my_box , $m );
$h = $h -> gelen ;
foreach ($h as $k => $v ) (
$posta kutusu = $v -> posta kutusu;
$host = $v -> host ;
$kişisel = $v -> kişisel ;
$e-posta = $posta kutusu. "@" . $ ana bilgisayar ;
$my_email = mysql_escape_string($email);
}
foreach ($s as $k => $v ) (
$subj = $v -> konu ;
}
if ($subj == "ABONE OL" ) (
mysql_query( "GÜNCELLEME tablosu SET stat=1 WHERE e-postası=$my_email");
//yazdır mysql_error();
$del = imap_delete ($my_box , $m );
posta ($email, $add_sbj, $add_text, $başlıklar);
}
elseif ($subj == "ABONE OL" ) (
mysql_query( "WHERE e-postası = $my_email tablosundan SİL");
$del = imap_delete ($my_box , $m );
posta ($email, $del_sbj, $del_text, $başlıklar);
}
başka(
$del = imap_delete ($open_box , $m );
posta ($e-posta, $err_sbj, $err_text, $başlıklar);
}
}
$temizle = imap_expunge($my_box);
}
?>

Bazı web uygulamaları, kullanıcı için belirli bir e-posta gerektirebilir. Böyle bir durumda kendi SquirrelMail veya Roundcube email kodumuzu yazabiliriz. Hangisini seçerseniz seçin, IMAP postasıyla nasıl çalışacağınızı bilmek yardımcı olacaktır.

PHP'de IMAP ile nasıl çalışılacağı iki sayfada anlatılmaktadır. İlk sayfada, posta sunucularına bağlanmak ve mesajları okumak için gerekli işlevler. İkinci sayfada e-posta ile çalışmaktan bahsedeceğiz, örneğin mesajları silmek, uygulamaları indirmek vb.

İşlevselliği göstermek için yerel posta istemcisi komut dosyalarını çalıştırmak için kullanılabilecek kod örnekleri kullanılacaktır.

Gerekli işlevleri çağırmak için URL parametreleri:

  • func - gerekli işlevin türü (örneğin: e-postayı oku, posta kutusunu görüntüle, mesajı sil)
  • klasör - bağlantı için posta kutusu klasör adı (örneğin: Gelen Kutusu, Gönderildi, spam)
  • kullanıcı kimliği - benzersiz e-posta tanımlayıcısı

Parametreler $_GET ile alınabilir ve switch uygun eylemleri çağırmak için kullanılabilir.

Bir IMAP sunucusuna bağlanma

IMAP sunucusuyla bağlantı kurmak için aşağıda gösterildiği gibi imap_connect() işlevini kullanırız:

Mesaj yolu, kullanıcı adı ve şifre sunucuya bağlanmak için gerekli parametrelerdir. Kılavuzdaki ek seçenekler hakkında bilgi edinebilirsiniz.

Posta kutusu yolu, sunucuyu tanımlayan bir dizedir ve süslü parantez içindeki bağlantı noktası, istenen posta klasörünün adını belirtir.

İşte klasör için bazı satırlar gelen kutusu posta hizmetleri:

  • Gmail (imap.gmail.com: 993/imap/ssl) GELEN KUTUSU
  • Yahoo (imap.mail.yahoo.com: 993/imap/ssl) GELEN KUTUSU
  • AOL (imap.aol.com: 993/imap/ssl) GELEN KUTUSU

Bazı sunucularda SSL etkin değildir, bu durumda satırdan "SSL"yi çıkarmanız gerekir. Diğer sunucular, "NOVALIDATE-CERT" eklemeniz gereken kendi sertifikalarını kullanabilir.

Posta sunucusu bağlantısı açıkken, artık aşağıdaki etkinlikler için kullanılan işlevlere göz atabiliriz:

  • E-posta hesabınızda bir posta kutusu klasör listesi görüntüleyin
  • Bir klasördeki e-posta mesajlarının listesini görüntüleyin
  • Bir yazarın e-postasının içeriğini görüntüleyin

E-posta klasörleri

gelen kutusu , Gönderilmiş , Çöp ve İstenmeyen e-posta- Bu klasörler hemen hemen her e-posta hesabında görünür ve kullanıcılar genellikle kendi klasörlerini oluşturabilir. Bu klasörlerdeki mesajları görebilmek için bağlantı dizimizi değiştirmemiz gerekiyor. Örneğin, daha önce yol dizesine "INBOX" (Gelen Kutusu) uygulayın. İstenmeyen posta klasörünüze bağlanmanız gerekiyorsa, bunun yerine "Spam" gibi bir şey kullanın. Ancak şu şekilde sıralanabilirken İstenmeyen e-posta bir e-posta hesabına, bir e-posta istemcisi aracılığıyla görüntülendiğinde, arka planda klasörlerin gerçek adı farklı olabilir. imap_list() kullanarak bir hesaptaki mevcut tüm klasörleri listeleyebiliriz.

"; foreach ($klasör olarak $klasör) ( $klasör = str_replace("(imap.gmail..php?klasör=" . $klasör . "&func=view">" . $klasör . ""; ) Eko "";

imap_open() öğesinden elde edilen bağlantı tanıtıcısını ilk parametre olarak imap_list() öğesine iletmeliyiz. Ayrıca yolu geçmemiz gerekiyor (klasör olmadan, örneğin "INBOX"). Üçüncü parametre olarak, mevcut tüm klasörleri isteyin.

Mesaj bildirimi

Her klasör mevcut e-posta mesajlarının bir listesini içerir, bu yüzden posta kutumuzda nasıl bir mesaj listesi oluşturabileceğimizi görelim.

İlk önce imap_num_msg() ile kullanılabilen mesaj sayısını almanız gerekir. Daha sonra her mesajın başlığı için bilgi almak için imap_header() işlevini kullanabiliriz.

Diyelim ki son 20 e-postayı istiyorsak:

($numMessages - 20); $i--) ( $başlık = imap_header($imap, $i); $fromInfo = $başlık->from; $replyInfo = $başlık->reply_to; $details = array("fromAddr" => (isset($) fromInfo->mailbox) && isset($fromInfo->host)) ?$fromInfo->mailbox ."@" .$fromInfo->host: "", "fromName" => (isset($fromInfo->kişisel)) ?$fromInfo->personal: "", "replyAddr" => (isset($replyInfo->mailbox) && isset($replyInfo->host)) ?$replyInfo->mailbox . "@" . $replyInfo->host : "", "replyName" => (isset($replyTo->kişisel)) ? $replyto->kişisel: "", "konu" => (isset($başlık->konu)) ? $başlık->konu : "", "udate" => (isset($header->udate)) ? $header->udate: ""); $uid = imap_uid($imap, $i); echo "

    "; Eko "
  • İtibaren:" . $detaylar["adından"]; echo " " . $detaylar["Addr'dan"] . "
  • "; Eko "
  • Ders:" .$detaylar["konu"] ..php?klasör=" . $ klasörü. "&id=" . $uid ..php?folder=" . $klasör . "&uid=" . $uid . "&func=delete">Sil
  • "; Eko "
"; }

$Imap bağlantıları doğru klasörde açılmalıdır. Daha sonra imap_num_msg() tarafından alınan mesaj sayısını kullanarak son 20 e-posta arasında dolaşabiliriz. Bağlantı ve e-posta numarası, daha sonra gönderenden, e-posta adresinden, addan, konudan vb. ilginç bilgilerle karıştırılabilecek başlık bilgilerini almak için imap_header() öğesine verilir.

Lütfen toplam mesaj sayısından e-posta numarasının mesaj için benzersiz bir tanımlayıcı olmadığını unutmayın. Posta kutunuzda 100 e-postanız varsa, son numara 100, önceki numara 99 vb. 100 numaralı mesajı siler ve ardından yeni bir mesaj alırsanız, numarası 100 olacaktır.

Aşağıdaki adımlarla devam etmek için e-posta için benzersiz bir tanımlayıcı almanız gerekir. Her e-postanın, e-posta sağlayarak alabileceğimiz UID adında benzersiz bir kimliği vardır, imap_uid() UID numarasının işlevi benzersizdir ve zamanla değişmez.

Bir mesajın içeriğini görüntüleme

E-posta okumak, önceki görevler kadar kolay değildir, bu nedenle Mitul Koradia tarafından geliştirilen Posta Sınıflarını kullanmanız gerekir. Sınıf, aşağıdaki örneğimiz için aşağıdaki üç işlevi uyarladı:

kodlama) ( durum 3: dönüş imap_base64($metin); durum 4: dönüş imap_qprint($metin); varsayılan: dönüş $metin; ) ) // çok parçalı if ($yapı->tür == 1) ( foreach ($yapı) ->parts as $index => $subStruct) ( $prefix = ""; if ($partNumber) ( $prefix = $partNumber. "."; ) $data = get_part($imap, $uid, $mimetype, $ subStruct, $prefix .($index + 1)); if ($veri) ( return $veri; ) ) ) ) false döndür; ) function get_mime_type($yapı) ( $primaryMimetype = dizi("METİN", "ÇOKLU", "MESAJ", "UYGULAMA", "SES", "GÖRÜNTÜ", "VİDEO", "DİĞER"); if ($yapı ->alt tür) ( $birincilMimetipi[(int)$yapı->tür] döndürür. "/" . $yapı->alttür; ) "METİN/DÜZ" döndürür;)

GetBody() işlevi, e-postanın içeriğini UID ve IMAP bağlantısını ileterek alır. Fonksiyonun içinde metin/HTML olarak içerik türü ile get_part() fonksiyonunu çağırıyoruz. Düz metin e-posta mesajlarının okunması çok daha kolaydır. Bu yüzden önce e-postanın içindeki HTML içeriğini bulmaya çalışıyoruz.

Daha sonra imap_fetchstructure() işlevini kullanarak e-posta yapısını okuruz. FT_UID'yi her zaman geçmek yerine UID'yi kullanmak için kitaplık işlevlerini değiştirdik.

Daha sonra get_mime_type() işlevini kullanarak e-posta mesajının MIME türünü alırız. Bu işlev tarafından tamsayı olarak döndürülen sekiz MIME türü vardır:

  • 0-METİN
  • 1 - ÇOKLU PARÇA
  • 2 - MESAJ
  • 3 – UYGULAMA
  • 4-SES
  • 5 - GÖRÜNTÜ
  • 6 - VİDEO
  • 7-DİĞER

MIME türlerinin dizilerini kullanarak dönüşü, dizenin gerçek MIME türüne dönüştürüyoruz.

Bileşik iletilerin çok sayıda alt türü olabilir, bu nedenle sayı bölümünü kullanarak tüm alt türleri tekrar tekrar gözden geçirir ve mime türü kullanılarak doğru olanı bulunduğunda imap_fetchBody() kullanarak e-postayı alırız.

Daha sonra mesaj tipi kodlamasına göre uygun kod çözme fonksiyonunu kullanırız ve içeriği döndürürüz. Kullanılabilir kodlama türlerinin tam listesi:

  • 0-7bit
  • 1-8 bit
  • 2-İkili
  • 3-BASE64
  • 4 - TEKLİFLİ-YAZDIRILABİLİR
  • 5-DİĞER

Çözüm

Bir IMAP sunucusuna bağlanmanın temellerini gözden geçirmeyi, mesajları mevcut klasörler içinde listelemeyi ve bir e-posta mesajının içeriğini okumayı bitirdik. Gönderinin sonraki sayfasında, mesajları silme ve ekleri işleme gibi posta istemcisinin ek işlevlerini uygulamak için kullanılabilecek işlevlerden bahsedeceğiz.

Geçen gün, gelen postayla çalışmama izin verecek küçük bir PHP modülü yazma görevi aldım. Biraz araştırınca protokollerden birinin bu görev için bana uygun olduğunu gördüm. POP3 ve IMAP.
Ancak seçim, POP3 protokolünden daha işlevsel ve daha modern olduğu için IMAP kullanmamdı.

Şimdi IMAP protokolleriyle nasıl çalışılacağını, Yandex/Google posta sunucusundan nasıl mektup alınacağını hızlıca çözmem gerekiyordu.

Daha rahat çalışma için kütüphaneyi seçtim PhpImap, ihtiyacım olan tüm görevleri hızlı ve kolay bir şekilde uygulayabildiği için.

Bir posta sunucusuna bağlanma.

Artık protokol seçimine ve kütüphane seçimine karar verdiğimize göre, posta sunucusuna bağlanmaya çalışacağız.

PHP'nin IMAP protokolüyle tam olarak çalışması için uzantıyı bağlamanız gerekir. php_imap.dll/imap.so php.ini dosyasında.

Başlamak için, en az sorun yaşadığım için Yandex postasına bağlanmayı deneyelim.

//Kitaplıkları dahil et include("/phpImap/Mailbox.php"); include("/phpImap/IncomingMail.php"); //Kolaylık olması için posta sunucusuna bağlanmak için sabitler oluşturalım. define("MAIL_IMAP_SERVER", "imap.yandex.ru"); define("MAIL_IMAP_SERVER_PORT", 993); define("MAIL_IMAP_LOGIN", " "); define("MAIL_IMAP_PASS", "example_pass"); define("MAIL_IMAP_PATH", "(".MAIL_IMAP_SERVER.":".MAIL_IMAP_SERVER_PORT."/imap/ssl)INBOX"); $mailbox = new PhpImap\Mailbox(MAIL_IMAP_PATH, MAIL_IMAP_LOGIN, MAIL_IMAP_PASS, __DIR__); try ( $mailbox->getImapStream(); ) catch (Exception $e) ( die($e->getMessage()); )

Sınıf yapıcısını nasıl görüyoruz? Posta kutusu aşağıdaki argümanları alır:

  • MAIL_IMAP_PATH- Sunucu adresini (MAIL_IMAP_SERVER), bağlantı portunu (MAIL_IMAP_SERVER_PORT), bağlantı tipini (imap) içerir ve bağlantının şifreleneceğini (ssl) belirtir. Kıvrımlı parantezlerden sonra bu durumda gelen mesajlara (INBOX) bağlanacağımız klasörü belirtiyoruz.
  • MAIL_IMAP_LOGIN- Bağlanacağımız posta kutusu.
  • MAIL_IMAP_PASS- Şifre (çoğunlukla bu, posta kutusundan gelen şifredir).
  • __DIR__- Bu, eklerin ve posta mesajlarının kaydedileceği klasörün yoludur.

Bundan sonra, bağlantımızın yöntem aracılığıyla oluşturulup oluşturulmadığını kontrol edeceğiz. getImapStream() herhangi bir nedenle bağlantı oluşturulmazsa, uygulama başarısız bağlantının nedeni ile istisnalar atar.

Yandex posta ayarlarında, devre dışı bırakılmış IMAP protokolünü kullanarak bağlanma olanağına sahip olabileceğiniz gerçeğini dikkate almak önemlidir.

Şimdi bağlantıyı Gmail postasıyla karşılaştıralım.

Define("MAIL_IMAP_SERVER", "imap.gmail.com"); define("MAIL_IMAP_SERVER_PORT", 993); define("MAIL_IMAP_LOGIN", " "); define("MAIL_IMAP_PASS", "example_pass"); define("MAIL_IMAP_PATH", "(".MAIL_IMAP_SERVER.":".MAIL_IMAP_SERVER_PORT."/imap/ssl)INBOX");

Gördüğümüz gibi, pratik olarak önceki bağlantıdan farklı değil, ancak büyük olasılıkla sunucuya bağlanırken bir istisna alacaksınız.
Bu sorun şu gerçeğiyle ilgilidir: Gmail IMAP protokolü varsayılan olarak devre dışı bırakıldı. IMAP Erişimi ⇒ IMAP'yi Etkinleştir seçeneğindeki Yönlendirme ve POP/IMAP sekmesindeki ayarlarda etkinleştirebilirsiniz.

IMAP protokolünü etkinleştirdikten sonra, uygulama şifresi oluştur. Oluşturabilmemiz için bu profile iki faktörlü bir yetkilendirme yapmamız gerekiyor. Sonra oluşturmaya başlayabilirsiniz. Uygulama için yeni bir şifre oluşturduğumuzda, sunucuya bağlanmak için MAIL_IMAP_PASS sabitine girmemiz gerekecek.

Lütfen bir uygulama şifresi oluştururken sunucuya bağlanamayabilirsiniz, bunun nedeni bu şifrenin henüz Gmail hizmetine tam olarak uygulanmamasından kaynaklanmaktadır, genellikle 5-60 dakika sürer.

Veri örnekleme

Başarılı bir bağlantıdan sonra, sunucudan akış mesajları almak için bir istek yürütebiliriz. Bunun için şu yöntemi kullanacağız. searchMailBox(dize $ ölçüt) esasen bir yöntem sarmalayıcı olan imap_search. Burada $kriter argümanının ihtiyacımız olan mesajları bulmak için belirli bir kriter olduğunu anlamak önemlidir, yöntemin kendisi, daha sonra posta mesajı hakkında ayrıntılı bilgi almak için bize faydalı olacak öğelerin tanımlayıcılarını döndürür.

$mailsIds = $mailbox->searchMailBox("ALL");

Tahmin edebileceğiniz gibi, burada tüm mesajları alıyoruz.
Ve şimdi eşit derecede önemli diğer arama kriterleriyle ilgilenmeye çalışalım:

// 3 gün boyunca tüm mesajlar. $mailsIds = $mailbox->searchMailBox("BERİ "".date("d-M-Y",strtotime("-3 gün"))."""); //3 gün boyunca okunmamış mesajlar. $mailsIds = $mailbox->searchMailBox("BERİ GÖRÜNMEYEN "".date("d-M-Y",strtotime("-3 gün"))."""); // TEXT başlığında bu eşleşmeye sahip mesajları arayın. $mailsIds = $mailbox->searchMailBox("METİN "Bülten""); //BODY başlığında bu eşleşmeye sahip mesajları arayın. $mailsIds = $mailbox->searchMailBox("BODY "Bilgi Mesajı""); //Gönderenin e-postasına göre arama yapın. $mailsIds = $mailbox->searchMailBox("FROM " ""); //SUBJECT başlığına göre mesajları alın $mailsIds = $mailbox->searchMailBox("SUBJECT "Telefonunuz için güncellemeler yayınlandı"");

Bu örnek, arama ölçütlerini iyi kullanmanın temellerini yakalar.

bilgi alma

Artık bir dizi mesaj kimliğimiz olduğuna göre, onu işlemeye hazırız:

// Diziden son mesajın kimliğini al. $id = bitiş($mailsIds); //Mesaj hakkında bilgi içeren IncomingMail sınıfı nesnesinin bir örneğini alın. $mail = $mailbox->getMail($id); //Varsa bu mesaja ekli dosyaları alın. $mail->getAttachments(); //Mesajları göster. echo $mail->textHtml;

Böylece mektubumuzdan ve eklerinden sorunsuz bir şekilde mesajlar aldık.

Ek özellikler.

Bu kitaplık ayrıca, posta iletileriyle daha rahat çalışma için bir dizi yararlı yöntem içerir:

Mesajları kimliğine göre kaydederiz.

$mailbox->saveMail($id,$id.".eml");

Mesajları kimliklerine göre okunmamış olarak ayarlayın.

$mailbox->markMailAsUnread($id);

Mesajları kimliklerine göre okunacak şekilde ayarlayın.

$mailbox->markMailAsRead($id);

Mesajın üzerine kimliğine göre bir işaret koyduk.

$mailbox->markMailAsImportant($id);

Mesajları kimliklerine göre silin.


E-posta, bilgi alışverişi için en önemli araçtır ve onu iş için kullanıyorsanız, bir durumla karşılaşmış olmalısınız: Postaya, bir komut dosyası tarafından işlenmek için gerekli verileri içeren bir mektup gelir. Yandex postası hakkında konuşacağız - bu yazıda sizinle paylaşacağım sevgili okuyucular, mektupların posta kutusundan nasıl çıkarılacağına dair deneyimi, ayrıca mektubun ekli bir dosyası olduğunda seçeneği - nasıl tespit edileceğini ve sonunda üzerinde daha fazla manipülasyon için indirin.

Bu görevle uzun zaman önce kendim karşılaştım ve daha sonra Yandex posta programlarıyla çok az deneyimim olduğu için istenen sonucu elde etmek için çok zaman ve sinir harcadım. İlk hatam, birçok web geliştiricisi gibi, web'de yoğun bir şekilde benzer örnekler aramaya başladım, ancak Yandex yardımını (yardım) kullanmadım. Evet, çok küçük olmasına rağmen orada yararlı bilgiler var, ancak bu tür bir komut dosyası yazmak için yeterince önemlidir (daha fazlası aşağıda). O zaman, özü olan bir komut dosyası yazmak gerekiyordu: xls formatında malların fiyat listesini içeren bir mektup, müşterinin Yandex postasına günde bir kez gönderildi, işlenmesi gerekiyordu (ayrıştırıldı ve karşılaştırıldı) çevrimiçi mağazanın veritabanındaki verilerle ve sonuca bağlı olarak, bir şey bir yerde güncellenir, devre dışı bırakılır veya etkinleştirilir).

Ve senaryoyu yazmadan önce yapacağımız ilk şey, dokuz noktadan oluşacak eylem planımızın ana hatlarını çizmek:

  1. Posta protokolleri aracılığıyla erişim elde etmek için postayı ayarlayın;
  2. PHP uygulamasının yapısını ana hatlarıyla belirleyelim ve dosya kodlamasına karar verelim;
  3. IMAP posta protokolünü ve yeteneklerini tanıyalım;
  4. Hesap girişi ve şifre ile Yandex postasına bağlanın ve bu aşamadaki hataları izleyin;
  5. Mektubun başlığını işleyelim;
  6. Mektubun gövdesini alır ve işleriz;
  7. Ekli dosyaları alın ve kaydedin;
  8. Yapılan işi görselleştiriyoruz;
  9. Sonuç çıkaralım.

Konu oldukça hacimli, ancak her şeyi mümkün olduğunca kompakt ve net bir şekilde ifade etmeye çalışacağım. Belki başlayalım.

Posta kurulumu

Postanıza gidin ve aşağıdaki ekran görüntüsünde gösterildiği gibi ayarlara gidin:



Şimdi IMAP ve POP3 protokolleri aracılığıyla posta ayarlarına girdik:


Burada birçok kişi yukarıdaki resimdeki gibi bir resim görecek, ancak erişim devre dışı bırakıldığında ve bir kereden fazla karşılaştım. Bu nedenle, ayarlarınız farklıysa ekran görüntüsündeki gibi kutuları işaretleyin, bizim için asıl olan IMAP protokolü üzerinden erişime izin vermektir.

Uygulama yapısı ve kodlaması

Bu örnekte, gerekli olmadığı için karmaşık bir uygulama yapısı ile karşılaşmayacağız, sadece gerekli olanı ekleyeceğiz (Sublime Text editöründe çalışıyorum):


  • tmp - varsa mektuptan ekleri yükleyeceğimiz klasör;
  • .htaccess - bir apache sunucunuz varsa sunucu tarafı ayarı;
  • function.php - fonksiyonlarımızı buraya ekleyeceğiz;
  • main.css - stil dosyası;
  • index.php - uygulama giriş noktası;

UTF-8 kodlamasını kullanacağız ve bu nedenle .htaccess dosyasını hemen aşağıdaki satırlarla dolduracağız:

AddDefaultCharset utf-8 AddCharset utf-8 * CharsetSourceEnc utf-8 CharsetDefault utf-8

IMAP protokolü

İlk noktaya dönersek, POP3 protokolü üzerinden Yandex posta ile de çalışabileceğiniz açıktır. Peki neden tam olarak IMAP? İkisinden IMAP, POP3'e daha yeni ve alternatiftir, bu nedenle bir takım avantajları vardır (ki bunlar wikipedia'da bulunabilir), ancak bizim durumumuzda seçim yalnızca daha yeni olduğu gerçeğinden etkilenmiştir. Şahsen, belirli bir mektup alma görevi için ne kullanılacağı konusunda pek bir fark görmüyorum. Herhangi bir nedenle POP3 protokolünü kullanmanız gerekiyorsa, IMAP için geçerli olan tüm işlevler onun için çalışacaktır.

IMAP protokolünü kullanarak Yandex postasına bağlanma

Maile bağlanmak için üç parametreyi bilmemiz gerekiyor: mail login, şifresi ve mail server adresi. İki parametrede sorun yoksa, ikincisi Yandex'de bulunabilir. Bunu (benim yaşadığım sorunu) yukarıda yazdım ve ağda üçüncü parametrenin doğru belirtilmediği birçok örnek yazdım ve hataların zaten bağlantı aşamasında olduğunu hayal edin - bu en azından tatsız. Çalıların etrafında dolanmayacağım ve hemen Yandex sayfasına doğrudan bir bağlantı vermeyeceğim - posta programı ayarları. İşte bağlamamız gerekenler:


Şimdi doğrudan kodun kendisine gidebilirsiniz:

Header("Content-Type: text/html; charset=utf-8"); error_reporting(0); require_once("işlevler.php"); $mail_login = "yandex_mail"; $mail_password = "mail_password"; $mail_imap = "(imap.yandex.ru:993/imap/ssl)"; // Dikkate alınacak dosya türlerinin listesi $mail_filetypes = array("MSWORD"); $bağlantı = imap_open($mail_imap, $mail_login, $mail_password); if(!$connection)( echo("Posta bağlantısı başarısız - ".$mail_login); çıkış; )else( $msg_num = imap_num_msg($bağlantı); $mails_data = array(); for($i = 1; $ i<= $msg_num; $i++){ /* Работать с каждым письмом из IMAP-потока будем тут */ } } imap_close($connection);

Her şeyden önce, başlığı kullanarak ek olarak UTF-8 kodlamasını belirliyoruz ve hataların görüntülenmesini kapatıyoruz. Functions.php dosyasını bağlarız ve yukarıda tartışılan ayarları belirtiriz. $mail_filetypes dizisinde ihtiyacımız olan dosya formatlarını belirtiyoruz. Gereksiz çöpleri ayıklamak ve belirli dosyaları almak için böyle yapılmasına karar verildi. Postaya bağlantı, başarılı olduğunda bir IMAP akışı, başarısızlık durumunda false döndüren imap_open() işlevi kullanılarak yapılır (ancak hata görüntülemeyi etkinleştirirseniz durum böyle olmaz). imap_close () işlevini kullanarak akışlarla çalışmayı bir bağlantı göstergesi ileterek bitiriyoruz. Bu iki fonksiyon arasında sıradan bir koşullu operatör vardır.

Bağlantı başarılı olursa, imap_num_msg() kullanarak postadaki harf sayısını bulur ve akıştan ihtiyacımız olan tüm verileri koyacağımız bir dizi ekleriz. Bunu, her harfin kendi numarasıyla (1'den başlayarak numaralandırma) ayrı ayrı işleneceği bir döngü izler.

E-posta başlığı işleme

E-posta başlığını almak için, ikinci parametresi e-posta numarası olan imap_header() işlevini kullanmanız gerekir:

// E-posta başlığı $msg_header = imap_header($bağlantı, $i);

Bu aşamada ihtiyacımız olan veriyi çekeceğimiz bir nesne alacağız ve onu $mails_data dizisine kaydedeceğiz. İşte mektuplardan birine bir örnek:

Bu ekran görüntüsü, tüm verilerin kopyalandığını gösteriyor, ancak bu özel bir rol oynamıyor, daha uygun olanı çekiyoruz. Çok daha önemli olan konu satırının kodlanmasıdır. Her şey olabilir ve bu an kontrol edilmelidir. Aynı durum mektubun gövdesi ve ekli dosyalar için de geçerlidir.

$mails_data[$i]["zaman"] = zaman($msg_header->MailDate); $mails_data[$i]["date"] = $msg_header->MailDate; foreach($msg_header->to as $data)( $mails_data[$i]["to"] = $data->mailbox."@".$data->host; ) foreach($msg_header->from $ olarak data)( $mails_data[$i]["from"] = $data->mailbox."@".$data->host; )

Dizimizde saklıyoruz: bir zaman damgası, mektubun alındığı tarih, alıcının ve gönderenin e-postası ve mektubun konusunu almaya devam ediyoruz. Bunu yapmak için önce function.php dosyasına üç fonksiyon eklememiz gerekiyor:

function check_utf8($charset)( if(strtolower($charset) != "utf-8")( return false; ) return true; ) function convert_to_utf8($in_charset, $str)( return iconv(strtolower($in_charset), "utf-8", $str); ) function get_imap_title($str)( $mime = imap_mime_header_decode($str); $title = ""; foreach($mime as $key => $m)( if(!check_utf8) ($m->charset))( $title .= convert_to_utf8($m->charset, $m->text); )else( $title .= $m->text; ) ) return $title; )

İsimler kendiliğinden açıklayıcıdır ve bence sadece son işlevi açıklamaya değer. Kodlanmış bir dize alır ve her biri iki özellik karakter kümesi (kodlama) ve metin (tema metni) olan bir nesne dizisini döndüren imap_mime_header_decode() işlevini kullanarak kodunu çözer. O zaman her şey basit: bir döngüde, kodlamayı kontrol ederek, onu UTF-8'e dönüştürüyoruz ve konuyu tek bir başlığa yapıştırıyoruz ve geri döndürüyoruz.

Şimdi index.php dosyasına geri dönelim ve son parametreyi çıkaralım:

$mails_data[$i]["title"] = get_imap_title($msg_header->subject);

Bu, harf başlığının işlenmesini tamamlar.

Mektubun gövdesiyle çalışmak

İşlenen e-posta verileriyle dizimizi kademeli olarak oluşturmaya devam ediyoruz ve şimdi gövdeyi almak için iki işlev kullanmamız gerekiyor:

// Mesaj gövdesi $msg_structure = imap_fetchstructure($bağlantı, $i); $msg_body = imap_fetchbody($bağlantı, $i, 1);

İlk $msg_structure değişkeni mesaj yapısını içerir - bu, birçok yararlı bilgi bulabileceğiniz bir nesnedir, bu nesnenin bir parçasının bir örneği aşağıda sunulmuştur:

Sorunumuzu çözmek için önemli olan:

  • type - mektup gövdesinin birincil türü, postada bize ne geldiğine bağlı olarak 0 ila 7 arasında değişebilir (her basamak, mektubun gövdesinde bulunan kendi içerik türünü önerir);
  • kodlama - gövde aktarımı kodlaması, 0 ile 5 arasında değişir (0 - 7BIT, 1 - 8BIT, 2 - İKİLİ, 3 - BASE64, 4 - KILINTI-YAZDIRILABİLİR, 5 - DİĞER);
  • parçalar, bir seviye yukarı nesnenin yapısına karşılık gelen bir harf parçaları dizisidir.

Parça özelliklerine daha yakından bakalım. Söylenecek ilk şey, bu dizinin sıfır hücresinde, mektubun metnine tam olarak karşılık gelen ve ilkinden başlayarak - ekli dosyalara kadar bilgi olduğudur. Ayrıca, her nesne tipinde belirtilir ve parametrelerde kodlama açık ve örtüktür.

Mektubun yapısı istediğiniz kadar iç içe olabilir, en azından dört veya beş seviyeye ulaştığı durumlar oldu, bu yüzden onu rahatsız etmek için dedikleri gibi, gelecekte özyinelemeli bir fonksiyon yazmamız gerekecek.

İkinci imap_fetchbody() işlevi, çoğunlukla kodlanmış biçimde e-postanın belirli bir bölümünü getirir.

Şimdi mektubun gövdesinin işlenmiş halini kaydedeceğimiz bir değişken ekleyelim:

$vücut = "";

Function.php dosyasına geri dönelim ve özyinelemeli bir fonksiyon yazalım:

function recursive_search($structure)( $encoding = ""; if($structure->subtype == "HTML" || $structure->type == 0)( if($structure->parameters->attribute == " karakter kümesi")( $karakter kümesi = $yapı->parametreler->değer; ) dönüş dizisi("kodlama" => $yapı->kodlama, "karakter kümesi" => strtolower($karakter kümesi), "alt tür" => $yapı- >subtype); )else( if(isset($structure->parts))( return recursive_search($structure->parts); )else( if($structure->parameters->attribute == "charset")( $ karakter kümesi = $yapı->parametreler->değer; ) return array("encoding" => $structure->encoding, "charset" => strtolower($charset), "subtype" => $structure->subtype); ) ))

recursive_search() işlevi bir parametre alır - mektubun yapısı, özellikleri sırayla kontrol eder ve üç parametre alır: kodlama, karakter kümesi, alt tür. Özyinelemeden çıkış noktası, sıfır hücreli parça özelliğinin olmamasıdır. Burada anlatılacak başka bir şey yok, sanırım kodlardan ne olduğu ve nasıl olduğu anlaşılıyor.

Mektubun gövdesini dönüştürmek için gelecekte ihtiyaç duyacağımız bir fonksiyon daha ekleyelim:

function Structure_encoding($encoding, $msg_body)( switch((int) $encoding)( case 4: $body = imap_qprint($msg_body); break; case 3: $body = imap_base64($msg_body); break; durum 2: $body = imap_binary($msg_body); break; durum 1: $body = imap_8bit($msg_body); break; case 0: $body = $msg_body; break; varsayılan: $body = ""; break; ) return $body ; )

$recursive_data = recursive_search($msg_structure); if($recursive_data["encoding"] == 0 || $recursive_data["encoding"] == 1)( $body = $msg_body; ) if($recursive_data["encoding"] == 4)( $body = Structure_encoding($recursive_data["encoding"], $msg_body); ) if($recursive_data["encoding"] == 3)( $body = Structure_encoding($recursive_data["encoding"], $msg_body); ) if($ recursive_data["encoding"] == 2)( $body = Structure_encoding($recursive_data["encoding"], $msg_body); ) if(!check_utf8($recursive_data["charset"]))( $body = convert_to_utf8($ recursive_data["karakter kümesi"], $msg_body); )

Özyinelemeden veriyi aldıktan sonra yavaş yavaş transfer kodlamasını kontrol ediyoruz ve buna bağlı olarak uygun parametrelerle Structure_encoding() fonksiyonunu çağırıyoruz. Son koşullu operatörde UTF-8'de çalıştığımızı ve tüm manipülasyonlardan sonra kodlamadan farklı bir şey elde edersek onu yeniden kodlayacağız.

Bir çizgi çizmek için kalır:

$mails_data[$i]["body"] = base64_encode($body);

Mektubun gövdesi, kendi stilleriyle hem düz metin hem de HTML işaretlemesi içerebilir. Render sırasında mizanpajımızın yanlış gitmemesi için BASE64 ile kodluyoruz.

Ekli dosyalar

Burada yavaş yavaş uygulamamızı yazmanın sonuna geliyoruz:

// İç içe dosyalar if(isset($msg_structure->parts))( for($j = 1, $f = 2; $j< count($msg_structure->parçalar); $j++, $f++)( if(in_array($msg_structure->parts[$j]->subtype, $mail_filetypes))( $mails_data[$i]["ekler"][$j]["type"] = $msg_structure->parts[$j]->subtype; $mails_data[$i]["attachs"][$j]["size"] = $msg_structure->parts[$j]->bytes; $mails_data[ $i]["attachs"][$j]["name"] = get_imap_title($msg_structure->parts[$j]->parameters->value); $mails_data[$i]["ekler"][$ j]["file"] = Structure_encoding($msg_structure->parts[$j]->encoding, imap_fetchbody($connection, $i, $f)); file_put_contents("tmp/".iconv("utf-8") , "cp1251", $mails_data[$i]["ekler"][$j]["ad"]), $mails_data[$i]["ekler"][$j]["dosya"]); ) ))

Ekli dosyanın işlenmesinden sorumlu parça çok daha küçüktür ve şimdi - neden tam olarak. Bir dosya ile çalışma prensibi, bir harfin gövdesi ile çalışmaya benzer, ancak bu aşama onun parça özelliği dizisindeki varlığı ile başlar. Tür listesine bakarak gereksiz olanları filtrelemeyi unutmayın. Basit file_put_contents() fonksiyonunu kullanarak dosyamızı tmp klasöründeki sunucumuza kaydediyoruz.

Sonucu görmek istiyorum!

Çalışma sırasında $mails_data verileriyle bir dizi oluşturduk ve görselleştirme için zaten doğrudan onunla çalışacağız. Bu yazıda, postada bulunan bir test mektubunu kullandım, bakalım sonunda ne elde ettik:


Ne tür bir dizi almalısın, ne yazık ki, kişisel nedenlerle dosyanın içeriğini gizlemek zorunda kaldım. Şimdi HTML işaretlememize geçelim:

Yandex Posta |<?php echo($mail_login);?>

Yandex Posta (Gelen Kutusu) |

Harf sayısı:

harf yok
$posta):?>
Zaman damgası:
Tarih:
Kime:
İtibaren:
Başlık:
Base64'teki mektup:
Ekli dosyalar:
$ek):?>
Bir çeşit:
Boyut (bayt olarak):
İsim:
Gövde:


Sonuç olarak özel bir rol oynamadıkları için buraya stil eklemeyeceğim:


Ve tmp klasöründeki sunucuda bir dosyanız olacak.

Çözüm

Makaledeki tüm adımları tamamladıktan sonra, doğru sonucu elde edeceksiniz, ancak her şey göründüğü kadar basit değil - dikkate alınması gereken tuzaklar var. Belirli bir görev için bir komut dosyası yazarken, her aşamada kodlamayı takip etmek gerekir, her biri kendi nüanslarına sahip olabilecek farklı postalardan mektuplar gelebilir. Yandex postasının ve belgelerinin periyodik olarak güncellendiğini dikkate almak da önemli olacaktır, bu nedenle posta programlarıyla çalışmak için çeşitli alt öğeler görünebilir. Benim için bu kadar, umarım bu makaleyi Yandex postasının daha düşük seviyeli bir sürümüyle çalışırken faydalı bulursunuz.

Ekli e-posta alınamıyor
posta bir dosyayla gönderilirse - herhangi biri - mektubun metni kaybolur

bana yardım et lütfen

Açıktır ... Yandex'den Yandex'e posta aktarırsanız, her şey yolunda gider ...
bir nevi anladı
ama bu betik bu yüzden Word dışında başka dosyaları kabul etmiyor, net değil ... yanında bir MSWORD satırı var, virgülle ayrılmış, hem PDF hem de JPG ve PNG koydu - sadece Word normal bir şekilde okur ve kaydeder ... . bunun gibi bir şey