Script to automaticly get emails from pop3 servers using getmail allows multiple downloads, auto search.
Requirements:
- Perl, Perl Regexp::Trie and Net::POP3. Both can be easly installed via cpan interface or Download from here
- Create a special user account called downmx
- Requires skeleton file (default to skel.txt ) to auto build getmail configuration scripts
skel_file.txt
[retriever]
type = SimplePOP3Retriever
server = var1
username = var2
port = 110
password = var3
use_apop = false
timeout = 90
delete_dup_msgids = true
dont-delete = true
[destination]
type = Maildir
path = /home/Mailbox/var4/
- Edit script to point to Required text files.
- Install getmail : apt-get install getmail4 or from here
Version : 3.0 The basic functions are: 1. Open .txt file and read parameters, User,Pass,MailServer Example of text file: users.txt - ( username@domain.com,password123,mail.domain.com ) - credential file phrases.txt - ( important n trips n lost ) - one word per line, these are key words to search for! 2. Test if mail server and credentials, if ok save to file popOK.txt #TO IMPROVE -> SHOULD COUNT HOW MANY EMAILS, IF 0 DONT START DOWNLOAD (avoid creating empty folders) 3. Download mailbox using getmail #TO IMPROVE -> SHOUOLD BE IN QUITE MODE, AND ADD FILTERS, NO ATTACHMENTS 3.a Create the config file and the folders, 4. Search Strings in Mailbox #TO IMPROVE -> WHEN FINDS MATCHS, CP EMAILS TO INTERSTING FOLDER
So far Its my coolest script in Perl:
Download Script
Thanks once again to Charles Cazabon who developed getmail in python.
Here is the script:
#!/usr/bin/perl -w # Script to automaticly get emails from pop3 servers using getmail # Author: Felipe Ferreira Date: 14/11/08, UP 20/11/08 # Version : 3.0 # 1. Open .txt file and read parameters, User,Pass,MailServer # 2. test if mail server and credentials, OK #### SHOULD COUNT, IF 0 DONT START DOWNLOAD (avoid creating empty folders!) # 3. Download mailbox using getmail, OK #### SHOUOLD BE IN QUITE MODE # 3.a Create the config file and the folders # 4. Search Strings in Mailbox #### WHEN FINDS MATCHS, CP EMAILS TO INTERSTING FOLDER #use strict; use warnings; use Regexp::Trie; use Net::POP3; my $fileSkel = "new($mailserver,Timeout => 5) or ($testpop = 1); if ($testpop ne 1) { $tot_msg = $pop3->login($user,$pass) or ($testpop = 1); } if ($tot_msg gt 0) { # printf("\n->There are $tot_msg messages\n\n"); #Log to Text file open FILEOUT, "+>>", "/scripts/popOK.txt" or die $!; print FILEOUT $user . ";" . $pass .";". $mailserver . "\n"; close FILEOUT; $countfound++; $testpop = 0; } else { $testpop = 1; } $tot_msg = 0; } #creates folders, and download emails sub downloadmx() { my @lines; my $line; #Must get only left part of email, to create folders. if ($user =~ /@/) { $user =~ s/@/\@/; (split "@", $user); $userP = $_[0]; } else { $userP = $user; } $homeMXfolder = "/home/Mailbox/".$userP; #Create Folder structure where to Download system("mkdir $homeMXfolder"); system("mkdir $homeMXfolder/cur"); system("mkdir $homeMXfolder/tmp"); system("mkdir $homeMXfolder/new"); my $fileout = $homeMXfolder."/config.txt"; ##Open skeleton file in Read mode and parse it open FILE, $fileSkel or die $!; @lines =; #assigns lines to array close FILE; open FILEOUT, "+>".$fileout or die $!; foreach $line (@lines) #go through each line in file { #regex to substitute var1,var2,var3 to server,user,pass $line =~ s/var1/$mailserver/g; $line =~ s/var2/$user/g; $line =~ s/var3/$pass/g; $line =~ s/var4/$userP/g; print FILEOUT $line; } close FILEOUT; print "\n saved to: ". $fileout."\n"; $homeMXfolder = $homeMXfolder."/"; print "Downloading mails to: " . $homeMXfolder ."\n"; #set folder perimssions system("chown downmx -R /home/Mailbox/"); #download using downmx user account, since from root its not allowed system("su -c 'getmail --rcfile $fileout --getmaildir $homeMXfolder' downmx"); } #Search for strings inside \new DIR sub search() { my $Mcounter = 0; # Matches Found counter my $Fcounter = 0; # Files Searched counter my $REGEX2 = "\b(?:\\d[ -]*){13,16}\b"; #my $homeMXfolder = "/home/Mailbox/ogigant81/new/"; my @allfiles; my $file; my $filename; my @Slines; my $Sline; $homeMXfolder = $homeMXfolder."new/"; #should do a for loop in entire directory @allfiles = `ls $homeMXfolder`; foreach $file (@allfiles) { $filename = "<". $homeMXfolder . $file; #print "Searching in: ".$filename ."\n"; open SEARCHFILE, $filename or die $!; @Slines = ; #assigns lines to array foreach $Sline (@Slines) { if (($Sline =~ qr(\b$REGEX\b)) || ($Sline =~ /$REGEX2/)) { print "Match in: " .$filename. "\n"; print $Sline ."\n"; print "_______________________________________________________________________________\n"; $Mcounter++; #SHOULD CP EMAILS TO ANOTHER FOLDER CALLED INTERESTING } # each regex MATCHES found } # each LINE loop close SEARCHFILE; $Fcounter++; } # loop thru each file in DIR print "\n Found " . $Mcounter . " matches in ". $Fcounter. " files. \n"; #CLEAN UP #$homeMXfolder = ""; } #Get words from txt file and make list of words to search sub buildregex() { my $rt = Regexp::Trie->new; open(IN, "/scripts/phrases.txt"); my @list = ; for (@list){ chomp; $rt->add($_); } $REGEX = $rt->regexp; print "$REGEX\n"; } #Open and parse the files with user,server,pass and set value to global variables sub getinfo() { my @vals; print "staring...\n Opening " .$fileInfo."\n"; #open the file in Read mode and parse it open FILEINFO, $fileInfo or die $!; while ( ) { #Parse using Regex to get values and print out to file if (/,/) { print "Line:" . $_; @vals = split /,/; #better coding would be assign to a var #print "Number of values splited: " . $#_ . "\n"; # if (scalar @vals eq 2) { # print "First Value: " . $vals[0], "\n"; # print "Second Value: " . $vals[1], "\n"; #print "Third Value: " . $vals[2], "\n"; #Set variables $user = $vals[0]; $pass = $vals[1]; $mailserver = $vals[2]; # remove leading whitespace, and remove trailing whitespace $user =~ s/^\s+//; $user =~ s/\s+$//; $pass =~ s/^\s+//; $pass =~ s/\s+$//; $mailserver =~ s/^\s+//; $mailserver =~ s/\s+$//; $testpop = -1; poptest(); if ($testpop eq 0) { print "---Login OK---\n"; #START DOWNLOADING main(); } else { print "LOGIN ERROR\n"; } # test if POP server/pass is OK } } # close while close FILEINFO; print "Found: ". $countfound . " good pop3 logins\n"; } ##################################### SCRIPT START, CALLS #################################################### sub main() { downloadmx(); buildregex(); search(); } #SCRIPT START HERE! getinfo(); ###################################### END ###########################################
Skel.txt and pop3.txt script are not longer available
I will fix that
Paul, let me know if it worked for u
Had to copy script.pl from web source code to make it work. Works like a charm. Thanks.