portal Michała Hanćkowiaka
Begin main content
## pakiety imap4 oraz mime do zarzadzania skrzynka mailowa na serwerze...
#

lappend auto_path ~/tcl/tls1.5; package re tls
  #% 1.50
lappend auto_path ./imap4_tcl84; package re imap4
  #% 0.5.2

set imap4::use_ssl 1
set i1 [imap4::open imap.amu.edu.pl 993]
  #% sock5

set pass ???

imap4::login $i1 mhanckow $pass

#imap4::logout $i1
  # + zeby sie wylogowac TRZEBA byc w stanie SELECT (?!?)
#imap4::cleanup $i1

imap4::state $i1
  #% AUTH
  #% SELECT

join [imap4::folders $i1 -inline] \n
  # + wyswietla foldery na serwerze pocztowym

imap4::folderinfo $i1
  #% delim names flags match
  # + to dziala dopiero po wywolaniu folders!
imap4::folderinfo $i1 names
  # + wyswietla wartosc pola o podanej nazwie

imap4::select $i1 test1
  #% 0
  # + wybieramy jeden z folderow
#imap4::close $i1
  # + przed nastepnym select musi byc close!

imap4::mboxinfo $i1
  #% current perm exists uidnext uidval recent permflags flags
imap4::mboxinfo $i1 flags
  #% \Answered \Flagged \Deleted \Seen \Draft NonJunk

set q1 [imap4::fetch $i1 : -inline date: uid]; llength $q1
  #% 3
  # + w fetch podaje sie o ktore maile chodzi FROM:TO (chodzi o liczbe porzadkowa)
  #  oraz jakie pola chcemy zobaczyc, moga to byc naglowki np. "date:"
  #  lub pseudopola: uid, size, text
  # + opcja -inline powoduje ze wartosci pol zostana w tym miejscu podane
  #  bez -inline mozna je potem odczytywac przez msginfo
join $q1 \n
  #% {Wed, 15 Apr 2015 11:08:42 +0200    } 2
{Fri, 17 Apr 2015 12:42:31 +0200    } 4
{Fri, 17 Apr 2015 16:39:55 +0200    } 5
  # + wyswietlamy wszystkie maile (":") oraz pola "date:" i "uid"

set q2 [imap4::fetch $i1 : -inline uid]; llength $q1
expr {[lsearch $q2 4]+1}; # poszukiwanie uid-a; zwraca lp maila (od 1)
  #% 2

imap4::fetch $i1 3 date: from: content-type: subject: text
  #% 0
  # + przy fetch podaje sie lp maili ORAZ naglowki/pola, ktore maja byc sciagniete...

imap4::msginfo $i1 1
  #% uid date:
imap4::msginfo $i1 2
  #% uid date:
imap4::msginfo $i1 3
  #% content-type: date: text subject: from: uid
  # + pola sa widoczne dopiero PO sciagnieciu przez fetch !!!

imap4::msginfo $i1 3 subject:
  #% test3
  # + przez msginfo odczytuje sie dane maila po 1 polu!
  # + ew. mozna odczytac cala/fragment kolumny, np. "msginfo $i1 1:10 subject:"

# ...

lappend auto_path ~/tcl/tcllib; package re mime
  #% 1.5.4
  # + aby dalo sie uzywac mime z imap4
  #  trzeba skonstuowac "surowa" postac maila
  #  m.in. trzeba okreslic ktore pola/naglowki sa potrzebne ...
  # + 02.12.2021, nowa wersja imap4_for_mime,
  #  radzi sobie z nowa skrzynka mailowa,
  #  toleruje brakujace pola typu "from:"

proc imap4_for_mime {i1 mess_id} {
  set lista_pol {from: content-type: subject: text}
  imap4::fetch $i1 $mess_id {*}$lista_pol
  set _ ""
  foreach p [imap4::msginfo $i1 $mess_id] {
    if {[string match *: $p]} {append _ "$p [imap4::msginfo $i1 $mess_id $p]\n"}
  }
  append _ "\n"
  append _ [string map {\r\n \n} [imap4::msginfo $i1 $mess_id text]]
  return $_
}

set m1 [mime::initialize -string [imap4_for_mime $i1 1]]
mime::getproperty $m1 content
  #% multipart/alternative
set m2 [mime::getproperty $m1 parts]
  #% ::mime::1-1 ::mime::1-2
mime::getproperty [lindex $m2 0] content
  #% text/plain
mime::getbody [lindex $m2 0]
  # + wyswietla tresc tej czesci maila
mime::getproperty [lindex $m2 1] content
  #% multipart/related

mime::finalize $m1

uwaga: portal używa ciasteczek tylko do obsługi tzw. sesji...