I can process statistics from machine generated alert E-mails, rebroadcast E-mails and generate pages from them based on there content.
I was using a the IMAPClient library in Perl for this, but when my IMAP Mail server was migrate to an SSL based TLS/IMAP everything broke.
TLS encrypted port 993 RFC2595 RFC3501
After many long hours of struggling to get IMAPClient to work over SSL I just had to give up. It looks like something is just broken in that lib, I tried opening my own SSL socket then passing it to the lib, I tried having the lib itself connect to the SSL socket, no luck.
The Ruby net/imap just seems better written and it does work. Unfortunately it's lacking the message_to_file function which I had to replace that functionality.
A small change in the scripts below could also simulate .forward also or support mail dir.
If you do that, please send me a copy
In Perl for Non-secure IMAP
#!/usr/bin/perl use Mail::IMAPClient; my $imap = Mail::IMAPClient->new( Server => 'mail.yourdomain:143', User => 'jsokol', Password => 'yea-right') or die "IMAP Failure: $@"; foreach my $box qw( alarmpoint ) { my $file = "/uhome/jsokol/crapmail/". $box; $imap->select($box); my @msgs = $imap->search('ALL') or die "Couldn't get all messages\n"; foreach my $msg (@msgs) { open my $pipe, "| formail >> $file" or die("Formail Open Pipe Error: $!"); $imap->message_to_file($pipe, $msg); close $pipe or die("Formail Close Pipe Error: $!"); $imap->delete_message($msg); } # Now expunge the messages and close the folder $imap->expunge($box); $imap->close($box); } $imap->logout();
I am just learning Ruby, so please excuse some of this code.
In Ruby secure TLS/IMAP
#!/usr/bin/ruby require 'net/imap' server = "mail.yourdomain.com" port = 993 ssl = true username = "jsokol" password = "yea-right" Net::IMAP.debug = false conn = Net::IMAP.new(server, port, ssl) resp = conn.login(username, password) conn.select('test') conn.search(['ALL']).each do |sequence| env = conn.fetch( sequence,"ENVELOPE")[0].attr['ENVELOPE'] xdate = env.date.split(" "); wkday = xdate[0].sub(/,/,"") day = xdate[1] month = xdate[2] year = xdate[3] time = xdate[4] if (day.length < 2) day = "0" + day end box = env.from[0].mailbox + "@" + env.from[0].host + " " + wkday + " " + month + " " + day + " " + time + " " + year fetch_result = conn.fetch( sequence, "RFC822")[0].attr['RFC822'] if fetch_result File.open( "MAILOUT" , "a") {|file| file.write ("From #{box}\n#{fetch_result}\n\n\n") } end conn.store(sequence , "+FLAGS", [:Deleted]) # remove this line if you don't want to deltete these E-mails. end conn.expunge # remove this line if you don't want to deltete these E-mails. conn.logout conn.disconnect
No comments:
Post a Comment