EASYLCD/ESP8266-01/Nodemcu/PHP ile Maillerinizin kontrolü.

Yeni mailleriniz var mı diye, bilgisayarınızdan ya da telefonunuzdan program açmanıza gerek kalmadan, devamlı sizin yerinize ESP8266-01 Kontrol etsin. EASYLCD modül kullanan LCD nize, okunmamış maillerinizin, hem adedini hem de konu başlıklarını yazsın ister misiniz?

Not: Bu mail hesabı deneme olarak açılmıştır. 1 aylığına açık kalacaktır. Yanlış kullanımlardan, Kullanan kişiler sorumludur. Sadece şunu hatırlatmak isterim. iyi niyetle bile olsa birilerine, bu e-maili kullanarak mesaj gönderirseniz, Mutlaka kullandığınız zaman parametrelerine bakıp sizi bulacaklardır. Bundan dolayı Lütfen iyi niyeti suistimal etmeyin.

Burada açıklamaya çalışacağım sistem, PC nize bağlı kalmaksızın PHP dosyasını yükleyebileceğiniz bir siteniz varsa, mail kontrolünü nasıl yapabileceğinizi gösterecek.
Öncelikle ESP8266-01 modülünüzü buradaki yazı ile NODEMCU moduna geçirmelisiniz.
Ayrıca ESP8266-01 modülünün bağlantı şeması için bu yazıma bakabilirsiniz.

Aklınıza şu gelebilir. Neden PHP ye ihtiyacımız olsun. O olmadan da ESP bu işi çözebilir. Ben de başlarken bu şekilde başladım. Fakat e-mail sunucuları gibi güvenli sitelerden bilgi almak çok kolay olmuyor. Araştırdım, Nodemcu LUA olarak program yazarken ESP-01 ile yapılamayacağı konusuna kanaat getirdim. Belki arduino ve esp kullanılarak çözümler bulabilirsiniz. Fakat nodemcu olarak ben çalışan örneklere rastlayamadım. Hatta bunun yapılamayacağı yönünde bilgiler de okudum. Belki yeni versiyonlarda bu düzeltilmiş olabilir.
Tabii ki PHP kullanmamın bir başka amacı daha var. LCD yi koyup sadece mail mi kontrol edeyim.
Tabii ki HAYIR. Gelecekte, bu php dosyasına mail bilgilerini, döviz bilgilerini ,hava durumu gibi bilgileri aktarıp, hepsini bu LCD de ya da farklı bir görüntüleme cihazında, sadece ESP-01 kullanarak gösterebileyim diye düşündüm.

Buraya kadar hazırlıkları yaptıktan sonra bir de PHP kısmına bakalım.
1. program mail sunucusundan toplam mail ve toplam okunmamış mail adetlerini alır. Buradaki imap_open satırı şifreleri verdiğimiz gmail sunucusundan bilgiyi almamızı sağlar. 993 veya bazen 443 gibi port numaraları görürsünüz bunlar. POP ve IMAP port numaralarıdır. Bunlar hangi şekilde bilgiyi alacağınıza göre değişecektir.

<?php

$mbox = imap_open("{imap.gmail.com:993/imap/ssl}INBOX", "denesildeneme", "denek123")
      or die("can't connect: " . imap_last_error());

$check = imap_mailboxmsginfo($mbox);

if ($check) {
        echo "basla"."<br/>\n";
    //echo "Date: "     . $check->Date    . "<br/>" ;
    //echo "Driver: "   . $check->Driver  . "<br/>" ;
    //echo "Mailbox: "  . $check->Mailbox . "<br/>" ;
    echo "Messages: " . $check->Nmsgs   . "<br/>" ;
    //echo "Recent: "   . $check->Recent  . "<br/>" ;
    echo "Unread: "   . $check->Unread  . "<br/>" ;
    echo $check->Date    . "<br/>" ;
   // echo "Deleted: "  . $check->Deleted . "<br/>" ;
    //echo "Size: "     . $check->Size    . "<br/>" ;
} else {
    echo "imap_mailboxmsginfo() failed: " . imap_last_error() . "<br />\n";
}

imap_close($mbox);

?>

2. program ise mail sunucusundan okunmamış maillerinizin konu başlıklarını alır.
Burada dikkat edeceğiniz kısım, gelen maillerde konularda görünen türkçe karakterler LCD ye gönderilirse sorun olacağından, baştaki $bulunacak, ve $değiştir tabloları arasında türkçe karakterleri ingilizce karakterlere dönüştürmemiz gerekir. Bunu yapmak için 60. ve 62. satıra bakınız. Artık türkçe karakter sorunu da kalmadı.
Ayrıca 20. satırla başlayan parametreler mail alırken size yardımcı olacaktır. Ben sadece okunmamışları istediğim için “UNSEEN” parametresini kullandım. Sizler diğer parametreleri de kullanabilirsiniz. 46. satırda bu parametreyi görebilirsiniz.

<?php


//$mbox = imap_open("{imap.gmail.com:993/imap/ssl}INBOX", "denesildeneme", "denek123")
   //   or die("can't connect: " . imap_last_error());
$bulunacak = array('ç','Ç','ı','İ','ğ','Ğ','ü','ö','Ş','ş','Ö','Ü',',',' ','(',')','[',']'); 
$degistir  = array('c','C','i','I','g','G','u','o','S','s','O','U','','_','','','',''); 


set_time_limit(4000); 
 
// Connect to gmail
$imapPath = '{imap.gmail.com:993/imap/ssl}INBOX';
$username = 'denesildeneme';
$password = 'denek123';
 
// try to connect 
$inbox = imap_open($imapPath,$username,$password) or die('Cannot connect to Gmail: ' . imap_last_error());
 
   /* ALL - return all messages matching the rest of the criteria
    ANSWERED - match messages with the \\ANSWERED flag set
    BCC "string" - match messages with "string" in the Bcc: field
    BEFORE "date" - match messages with Date: before "date"
    BODY "string" - match messages with "string" in the body of the message
    CC "string" - match messages with "string" in the Cc: field
    DELETED - match deleted messages
    FLAGGED - match messages with the \\FLAGGED (sometimes referred to as Important or Urgent) flag set
    FROM "string" - match messages with "string" in the From: field
    KEYWORD "string" - match messages with "string" as a keyword
    NEW - match new messages
    OLD - match old messages
    ON "date" - match messages with Date: matching "date"
    RECENT - match messages with the \\RECENT flag set
    SEEN - match messages that have been read (the \\SEEN flag is set)
    SINCE "date" - match messages with Date: after "date"
    SUBJECT "string" - match messages with "string" in the Subject:
    TEXT "string" - match messages with text "string"
    TO "string" - match messages with "string" in the To:
    UNANSWERED - match messages that have not been answered
    UNDELETED - match messages that are not deleted
    UNFLAGGED - match messages that are not flagged
    UNKEYWORD "string" - match messages that do not have the keyword "string"
    UNSEEN - match messages which have not been read yet*/
 
// search and get unseen emails, function will return email ids
$emails = imap_search($inbox,'UNSEEN');
 
$output = '';
 
foreach($emails as $mail) {
    
    $headerInfo = imap_headerinfo($inbox,$mail);
      $ssubject = iconv_mime_decode ($headerInfo->subject, 0,'ISO-8859-9');// alttaki ile beraber 2 satır gelen türkçe karakter kodunu ayarlıyor
      $ssubject = mb_convert_encoding($ssubject, 'UTF-8', 'ISO-8859-9');    //
    
    $output .="basla".'<br/>';


    // $bul=$headerInfo->subject;
    $bul=$ssubject;
    // echo $bul.'<br/>';
     $sonuc=str_replace($bulunacak, $degistir,$ssubject); // yukarıda utf-8 olarak ayarlanan kod türkçe karakterleri ingilizce karakterlere ceviriyor. LCD için.
    $output .= $sonuc.'<br/>';
   // $output .= $headerInfo->subject.'<br/>';
 //   $output .= $headerInfo->toaddress.'<br/>';
    $output .= $headerInfo->date.'<br/>';
 //   $output .= $headerInfo->fromaddress.'<br/>';
 //   $output .= $headerInfo->reply_toaddress.'<br/>';

    $emailStructure = imap_fetchstructure($inbox,$mail);
    
    if(!isset($emailStructure->parts)) {
         $output .= imap_body($inbox, $mail, FT_PEEK); 
    } else {
        //    
    }

   echo $output;
  
   $output = '';
}
 
// colse the connection
imap_expunge($inbox);
imap_close($inbox);
?>

Nodemcu programı ile de gelen bilgileri alıp LCD ye yazdırmamız lazım. Tabii ki LCD 2 satır veya 4 satır olabilir. Ben 2 satıra göre ayarladım. Sizler 4 satıra göre verileri yazdırabilirsiniz. LCD nin sütun ayarı ise 16 karakter 20 karakter ya da daha fazla olabilir.
İsterseniz gelen konu başlıklarını direkt yazdırabilirsiniz. Fakat uzun satırlar sorun olabileceğinden, Nodemcu programında ilk 20 karakteri ayırarak LCD ye gönderdim.

Bu şekilde ekranda daha düzgün bir görünüm elde edildi. Ekranınız 16 sütundan oluşuyorsa 16 karakter görürsünüz, 20 karakterden oluşuyorsa 20 karakter görürsünüz. Daha fazla sütun isterseniz programdan kolaylıkla ayarlayabilirsiniz.
Değiştirmeniz gereken satırlar.
160. ve 161. satırlarda modeminizin internet adı ve şifresi. Ayrıca 187 ve 191. satırlardaki bilgiler benim PHP dosyamın bulunduğu yerdir. Buraya sizin PHP dosyanızın bulunduğu yeri yazmalısınız. 196. satıra ise bulunduğu sunucunun ismi yazılacak.
NOT: LCD ile başlayan tüm LCD komutları EASYLCD komutlarıdır.
EASYLCD kullanmayacaksanız kendi LCD modülünüze göre komutları değiştirirsiniz.

temps={}
subtemp={}
datetemp={}
madet={}
timesa={}
msay=1
kont=1
temp=0
zamisim="basla"
unread=0
mesaj=0


function yazdir()
if (unread==0) then
	uart.write(0, "LCDWR 1,1-NO MESSAGE     ")
	tmr.delay(50000)
	uart.write(0, "LCDWR 2,1-",madet[3])
	tmr.delay(50000)	
else
	uart.write(0, "LCDWR 1,1-Messages ",string.format("%d", unread)," / ",string.format("%d", mesaj),"    ")
	tmr.delay(50000)
	--uart.write(0, "LCDWR 1,15- / ",string.format("%d", mesaj),"    ")
	--tmr.delay(50000)
	
	for i=1,unread do   --  okunmamış olanları teker teker 2. satıra yazıp sola kaydıracak. tarih görünsün diye. arkasından home yapacak.
	uart.write(0, "LCDWR 2,1-",subtemp[i],"            ")
	--tmr.delay(50000)
	--uart.write(0, "LCDWR 2,21-",datetemp[i])
	
	tmr.delay(5000000)
	end
end
tmr.delay(1000000)

end


function kurayar(c)  -- mesaj toplamlarını alır.

--print (i,j,k,l)

i=0
j=0
k=0
l=0
--print (kont)
--print (c)

i,j=string.find(c,zamisim)

--print (i,j)

if (i>0) then 
	k,l=string.find(c,"<br/>",j)
	i,j=string.find(c,"<br/>",l)
	if (k>0) then 
	madet[1]=string.sub(c,l+1,i-1)
	end
	
	k,l=string.find(c,"<br/>",j)
	madet[2]=string.sub(c,j+1,k-1)
	--print (madet[2])
	i=k j=l 
--	print (i,"  ",j)
	
		k,l=string.find(c,"<br/>",j)

	madet[3]=string.sub(c,j+1,k-1)  -- tarih kısmını alıyor. yeni mesaj yoksa 2. satıra yaz. 
	
	
	mesaj=string.len(madet[1])
	
	mesaj=string.sub(madet[1],11)
	--mesaj=tonumber(mesaj)

	unread=string.sub(madet[2],8)
	unread=tonumber(unread)

	--print (unread," ",mesaj,"  ",madet[1],"  ",madet[2])
	if (unread==0) then
		yazdir()
	end
end	
madet[1]= string.sub(madet[1],2)
tmr.delay(1000000)

end

function timeayar(c)  -- mail konu satırındaki bilgileri alır. 

srv:close()

--print (i,j,k,l)
--print (c)
i=0
j=0
k=0
l=0
msay=1
--print (kont)
--print (c)
 
i,j=string.find(c,zamisim,j)

--print (i,j)
if (i==nil) then 
tmr.delay(10000000)
	return
	end 
while (i>0)
do
if (i>0) then 
	k,l=string.find(c,"<br/>",j)
	i,j=string.find(c,"<br/>",l)
	if (k>0) then 
	timesa[1]=string.sub(c,l+1,i-1)   -- konu
	end
	--	print (timesa[1])
		--print ( k," ",l,"  ",i,"  ",j)
	
	k,l=string.find(c,"<br/>",j)
	timesa[2]=string.sub(c,j+1,k-1)   -- tarih
	--print (timesa[2])
	--print ( k," ",l,"  ",i,"  ",j)
	i=k j=l 
--	print (i,"  ",j)
--temp=string.len(timesa[1])
--print ("karakter : ",temp)

	subtemp[msay]=string.sub(timesa[1], 1, 20)
	--print (" Subject  ",subtemp[msay])
	datetemp[msay]=string.sub(timesa[2], 1, 17)
--	print (" Date  ",temps[2])
-- display kaydırma ekle sonunda HOME yap ve varsa 2. değişkeni yaz. yoksa bitir.
	--yazdir()
	-- print (timesa[1])
	-- print (timesa[2])
end	
i,j=string.find(c,zamisim,j)
--print ("son : ",i,"  ",j)
if (i==nil) then 
	break
	end 
	msay=msay+1
	
end
		yazdir()
tmr.delay(1000000)

end







-- Your access point's SSID and password*****************************************
local SSID = "Your SSID Name"
local SSID_PASSWORD = "Your Password"

-- configure ESP as a station
wifi.setmode(wifi.STATION)
wifi.sta.config(SSID,SSID_PASSWORD)
wifi.sta.autoconnect(1)   -- otomatik bağlantı kuruyor. 0 manual bağlantı gerektiriyor
uart.setup(0,9600,8,0,1,0)
uart.write(0, "LCDDD") -- ******************** "\r\n" gerçek devrede olmayacak burada satir olarak görünsün diye verildi. ***********************
			tmr.delay(50000)
uart.write(0, "LCDBL 9-") -- LCD backlight ışığının seviyesini ayarlar.
			tmr.delay(50000)
	uart.write(0, "LCDWR 1,2-EASYLCD MODULE")
	tmr.delay(50000)
	uart.write(0, "LCDWR 2,2-ESP-01_Nodemcu")
	tmr.delay(50000)
function sendTS()
 srv = net.createConnection(net.TCP, 0)
srv:on("receive", function(sck, c) --print(c)
if (kont==0) then kurayar(c) end
if (kont==1) then timeayar(c) end

end)

srv:on("connection", function(sck)
  print("Wait for connection before sending.")
  if (kont==0) then
	sck:send("GET http://www.mikrobotik.com/api/email/email_check.php HTTP/1.1\r\nHost: www.mikrobotik.com\r\nConnection: close\r\nAccept: */*\r\n\r\n")
	
	end
  if (kont==1) then
	sck:send("GET http://www.mikrobotik.com/api/email/mail2.php HTTP/1.1\r\nHost: www.mikrobotik.com\r\nConnection: close\r\nAccept: */*\r\n\r\n")
	
	end	
	--srv:close()
 end)
srv:connect(80,"www.mikrobotik.com")

srv:close()

kont=kont+1
if kont==2 then kont=0 end

end

function check_wifi()
 local ip = wifi.sta.getip()

 if(ip==nil) then
   print("Connecting...")
   print("baglanti yapiliyor\r\n")
 else
  
  print("Connected to AP!")
  print(ip)
 print("baglanti tamam\r\n")
 
 end


end

check_wifi()
sendTS()
--srv:close()

--tmr.alarm(0,17000,1,sendTS)
--tmr.alarm(0,10000,tmr.ALARM_SEMI,check_wifi)
tmr.alarm(0, 10000, 1, function ()
check_wifi()
sendTS()

end)

Yukarıdaki programlardaki değişiklikleri yapmak kolaydır. PHP IMAP örnekleri internette mevcuttur.
Herkes Gmail kullanmıyordur. Kendi e-mail sunucunuza PHP olarak nasıl bağlanacağınızı bulduğunuzda, Nodemcu programınızla, tüm e-mail hesaplarınızı,PHP ile kontrol edebilirsiniz.

Ayrıca çalışma sırasında gelen verileri neye göre ayıkladığımı belirtmek istiyorum.
ESP nin aldığı veri aşağıdaki gibidir. 12e kısmından sonra <br/> dizilimini arıyorum. Bu şekilde 2 <br/> dizilimi arasındaki veriyi ayıklamış oluyorum. Başlangıçta <br/> dizilimi yok. Bundan dolayı PHP dosyasına “basla” diye bir dizilim verdim. ilk kelime bu olduğu için basla kelimesini bulacak, sonrasında <br/> dizilimini arayıp “basla” ve <br/> arasındaki kayıt başlangıç kaydı olacaktır.
NOT : <br/> dizilimi HTML ve PHP dosyalarında, satır sonu enter ve line feed görevi görür. Yani arduinoya göre karşılaştırırsak. Bu komuta karşılık gelir.
\n = LF (Line Feed)  Bundan dolayı aşağıdaki web sayfasından alınan çıktılar satır şeklinde görünmüştür.
=======================================

+IPD,0,465:HTTP/1.1 200 OK
Date: Sat, 16 Mar 2019 21:47:18 GMT
Server: Apache
X-Powered-By: PHP/5.5.38
Transfer-Encoding: chunked
Content-Type: text/html

12e
mail 1 ornek<br/>date<br/>
===============================================

Tabii ki tüm mail konuları gönderilirken aşağıdaki şekilde olduğu gibi “basla “kelimesi ile başlayacaktır. Bu da ayrı maillerdeki konu bilgisini ayrı ayrı alabilmemizi sağlayacaktır. Sizler de verilerinizi düzenlerken PHP dosyasına belirteç koyabilirsiniz.

Aşağıda PHP dosyasından gelen veri görünmektedir. 
email_check.php web sayfası çıktısı.
============================
basla
Messages: 4
Unread: 4
Wed, 20 Mar 2019 18:23:19 +0300 (+03)
===================================
Mail2.php web sayfası çıktısı.
==============================
basla
mail_php_dene
Fri, 15 Mar 2019 12:46:23 +0000
basla
e-mail_1_ornek
Wed, 20 Mar 2019 14:22:58 +0200
basla
E-MAIL_2_Ornek
Wed, 20 Mar 2019 14:24:06 +0200
basla
EASYLCD_Ornek_3
Wed, 20 Mar 2019 14:24:46 +0200
================================

UYARI : 
Bu program eski nodemcu programı ile çalışabilmektedir. Fakat Nodemcu programındaki hata nedeniyle bazı özellikler devre dışı bırakılmıştır. Bu özellikleri görüp, yeni Nodemcu programını yüklemek için Bu adrese gidip okumanızı tavsiye ederim. 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.