{"id":27,"date":"2011-05-02T15:58:02","date_gmt":"2011-05-02T13:58:02","guid":{"rendered":"http:\/\/www.tenzione.it\/?p=27"},"modified":"2011-05-02T15:58:02","modified_gmt":"2011-05-02T13:58:02","slug":"repost-pop3-client-in-perl","status":"publish","type":"post","link":"https:\/\/www.tenzione.it\/?p=27","title":{"rendered":"[repost] POP3 client, in perl"},"content":{"rendered":"<p>Il codice che segue, torna utile per tutti quegli account che ci si ritrova, con poca capacit\u00e0 di gestione (leggi che hanno webmail discutibili), e che non avete mai avuto la voglia, o l&#8217;interesse di configurare seriamente nel vostro client di posta preferito.<\/p>\n<p>Il caso lampante, \u00e8 la mail assegnata d&#8217;ufficio dal gestore telefonico, ad esempio.<\/p>\n<p>Ho scritto al volo questo codice per cancellare i 1000 e rotti messaggi giacenti (onde evitare che un &#8220;invia ricevi&#8221; dal telefonino si traducesse in una strenna natalizia per il mio gestore telefonico), e poi, l&#8217;ho ritoccato un istante, per dargli una parvenza d&#8217;interfaccia. Si pu\u00f2 evolvere, anche se ha senso il giusto (se vi serve un client vero, conviene configurarne uno esistente, si fa prima), ma per scriptare\u00a0 un mass delete, pu\u00f2 essere utile.<\/p>\n<p>Bando alle ciance, il codice:<\/p>\n<p><code><br \/>\nuse Net::POP3;<\/code><\/p>\n<p><code>use strict;<\/code><\/p>\n<p><code># configure this!!!<\/p>\n<p>my $host = 'popmail.server.provider';<\/p>\n<p>my $user = 'username@provider';<\/p>\n<p>my $pass = 'password';<\/p>\n<p># end configure<\/p>\n<p>my $opt = shift;<\/p>\n<p>if (!defined($opt)) {<br \/>\nprintf (\"usage: \\n\");<\/p>\n<p>printf (\"      list: show subject messages\\n\");<\/p>\n<p>printf (\"      del: delete all messages\\n\");<\/p>\n<p>exit;<\/p>\n<p>}<\/p>\n<p>my $pop = Net::POP3-&gt;new($host) || die \"Can't connect to $host\\n\";<\/p>\n<p>$pop-&gt;login($user,$pass) || die \"Can't authenticate. Check your information\\n\";<\/p>\n<p>my @stat = $pop-&gt;popstat();<\/p>\n<p>my $kb = $stat[1]\/1000;<\/p>\n<p>print \"you have $stat[0] message\\n\";<\/p>\n<p>print \"and $kb Kbytes disk usage\\n\";<\/p>\n<p>if ($opt eq \"del\") {<br \/>\nmy $msgnums = $pop-&gt;list;<\/p>\n<p>foreach my $msgnum (keys %$msgnums) {<br \/>\n$pop-&gt;delete($msgnum);<\/p>\n<p>}<br \/>\n} else {<br \/>\nmy $msgnums = $pop-&gt;list;<\/p>\n<p>foreach my $msgnum (keys %$msgnums) {<br \/>\nmy $msg = $pop-&gt;get($msgnum);<\/p>\n<p>my @sbj = grep {\/^Subject\/} @$msg;<\/p>\n<p>print @sbj;<\/p>\n<p>}<br \/>\n}<\/p>\n<p>$pop-&gt;quit;<\/p>\n<p>if ($opt eq \"del\") {<br \/>\nprint \"deleted $stat[0] message\\n\";<\/p>\n<p><\/code><\/p>\n<p><code>}<br \/>\nprint \"done.\\n\";<\/code><\/p>\n<p>Manco a dirlo, le tre variabili $host, $user, e $pass vanno acconciate all&#8217;abbisogna. Ho un p\u00f2 truccato rispetto al parametro da passare: in realt\u00e0 qualunque parametro produce un listing tranne quello di cancellazione.<\/p>\n<p>Produce un risultato di tipo:<\/p>\n<p><code><br \/>\nmizio@haziel:~$ perl cleanvoda.pl list<br \/>\nyou have 0 message<br \/>\nand 0 Kbytes disk usage<br \/>\ndone.<br \/>\nmizio@haziel:~$ perl cleanvoda.pl del<br \/>\nyou have 0 message<br \/>\nand 0 Kbytes disk usage<br \/>\ndeleted 0 message<br \/>\ndone.<\/code><\/p>\n<p><code> <\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Il codice che segue, torna utile per tutti quegli account che ci si ritrova, con poca capacit\u00e0 di gestione (leggi che hanno webmail discutibili), e che non avete mai avuto la voglia, o l&#8217;interesse di configurare seriamente nel vostro client di posta preferito. Il caso lampante, \u00e8 la mail assegnata d&#8217;ufficio dal gestore telefonico, ad [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,12],"tags":[33,32,34,25,16],"class_list":["post-27","post","type-post","status-publish","format-standard","hentry","category-tensioni","category-ti-ricordi","tag-mail","tag-perl","tag-pop3","tag-programmazione","tag-vecchi-post"],"_links":{"self":[{"href":"https:\/\/www.tenzione.it\/index.php?rest_route=\/wp\/v2\/posts\/27","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tenzione.it\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tenzione.it\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tenzione.it\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tenzione.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=27"}],"version-history":[{"count":1,"href":"https:\/\/www.tenzione.it\/index.php?rest_route=\/wp\/v2\/posts\/27\/revisions"}],"predecessor-version":[{"id":28,"href":"https:\/\/www.tenzione.it\/index.php?rest_route=\/wp\/v2\/posts\/27\/revisions\/28"}],"wp:attachment":[{"href":"https:\/\/www.tenzione.it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=27"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tenzione.it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=27"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tenzione.it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=27"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}