Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

PERL Script results in error

Posted on 2009-04-09
6
Medium Priority
?
428 Views
Last Modified: 2012-05-06
Hello-

I am trying to run a script that logs into a pop3 server multiple times using a text file with usernames and passwords. The purpose of this is to migrate user accounts from an IMAIL server to a MailEnable server via an IMAP connector.

urgoll has provided the script below, but when it is run I get an error that says:
Bad file descriptor at script.txt line 24, <FILE> line 2

C:\>perl script.txt input.txt
Processing user philip1 with password password1
   Account has 27 messages.
Processing user philip2 with password password2
Could not log in: Bad file descriptor at script.txt line 24, <FILE> line 2.

I have just installed the most recent version of ActivePerl on WIndows XP.

The input file looks like this:

philip1 password1
philip2 password2
philip3 password3
...

Any thoughts on how to resolve this issue?

THank you,
#!/usr/bin/perl
 
use strict;
use Net::POP3;
 
# Replace following line with the actual server name for the POP3 service
my $servername = 'rt.accovia.com';
 
my $filename = shift;
if (!$filename || $filename eq '') { 
	print "Usage: script.pl <inputfilename>\n",
	      "   where <inputfilename> is a text file with username and passwords for the POP accounts.\n\n";
	exit(1);
}
 
 
my $pop = Net::POP3->new($servername, Timeout => 120);	# define server with 2 minutes timeout
 
open (FILE,$filename) or die "Cannot open input file";
 
while (<FILE>) {
	if ($_ =~ /^\s*(\S+)\s+(\S+).*/ ) {
		print "Processing user ",$1," with password ",$2,"\n";
		$pop->login($1,$2) or die "Could not log in: $!";
		my $msgnums = $pop->list or die "Could not get msg list: $!";
		my $cnt = keys %$msgnums || 0;
		print "   Account has $cnt messages.\n";
		$pop->reset();
		$pop->quit();
	} else {
		print "Line didn't match expected values:\n";
		print $_;
	}
}
close(FILE);
print "Done processing input file\n";

Open in new window

0
Comment
Question by:rckit2000
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
6 Comments
 
LVL 40

Expert Comment

by:mrjoltcola
ID: 24109233
Try turning debugging on.
Usually that error happens when the socket was closed.

Try:
my $pop = Net::POP3->new($servername, Timeout => 120, Debug=> 1);

Open in new window

0
 
LVL 84

Expert Comment

by:ozo
ID: 24109323
try also moving the  $pop->quit(); out of the loop
0
 

Author Comment

by:rckit2000
ID: 24109355
Thanks - I turned on debug as you suggested and this is the result: Also, I switched the accounts around in the input file adn got the identical result..

C:\>perl script.txt input2.txt
Net::POP3>>> Net::POP3(2.29)
Net::POP3>>>   Net::Cmd(2.29)
Net::POP3>>>     Exporter(5.62)
Net::POP3>>>   IO::Socket::INET(1.31)
Net::POP3>>>     IO::Socket(1.30_01)
Net::POP3>>>       IO::Handle(1.27)
Net::POP3=GLOB(0x19b5554)<<< +OK X1 Greetings!  
Processing user philip1 with password XXXXXX
Net::POP3=GLOB(0x19b5554)>>> USER philip1
Net::POP3=GLOB(0x19b5554)<<< +OK send your password
Net::POP3=GLOB(0x19b5554)>>> PASS ....
Net::POP3=GLOB(0x19b5554)<<< +OK maildrop locked and ready
Net::POP3=GLOB(0x19b5554)>>> STAT
Net::POP3=GLOB(0x19b5554)<<< +OK 0 0
Net::POP3=GLOB(0x19b5554)>>> LIST
Net::POP3=GLOB(0x19b5554)<<< +OK 0 messages (0 octets)
   Account has 0 messages.
Net::POP3=GLOB(0x19b5554)>>> RSET
Net::POP3=GLOB(0x19b5554)<<< +OK 0
Net::POP3=GLOB(0x19b5554)>>> QUIT
Net::POP3=GLOB(0x19b5554)<<< +OK POP3 Server saying Good-Bye
Processing user philip2 with password XXXXX
Could not log in: Bad file descriptor at script.txt line 24, <FILE> line 2.
0
Ransomware: The New Cyber Threat & How to Stop It

This infographic explains ransomware, type of malware that blocks access to your files or your systems and holds them hostage until a ransom is paid. It also examines the different types of ransomware and explains what you can do to thwart this sinister online threat.  

 

Author Comment

by:rckit2000
ID: 24109396
I removed the quit statement and got the following result after teh first account was successful the second login failed:

Processing user philip2 with password XXXXX
Net::POP3=GLOB(0x19b4f5c)>>> USER philip1
Net::POP3=GLOB(0x19b4f5c)<<< -ERR Not in authorization state
Could not log in:  at script3.txt line 24, <FILE> line 2.
0
 
LVL 39

Accepted Solution

by:
Adam314 earned 2000 total points
ID: 24109488

 
open (FILE,$filename) or die "Cannot open input file";
 
while (<FILE>) {
    if ($_ =~ /^\s*(\S+)\s+(\S+).*/ ) {
        print "Processing user ",$1," with password ",$2,"\n";
        my $pop = Net::POP3->new($servername, Timeout => 120);
        $pop->login($1,$2) or die "Could not log in: $!";
        my $msgnums = $pop->list or die "Could not get msg list: $!";
        my $cnt = keys %$msgnums || 0;
        print "   Account has $cnt messages.\n";
        $pop->reset();
        $pop->quit();
    }
    else {
        print "Line didn't match expected values:\n";
        print $_;
    }
}
close(FILE);

Open in new window

0
 

Author Closing Comment

by:rckit2000
ID: 31568703
Bravo!

Thank you very much!!!
0

Featured Post

On Demand Webinar: Networking for the Cloud Era

Ready to improve network connectivity? Watch this webinar to learn how SD-WANs and a one-click instant connect tool can boost provisions, deployment, and management of your cloud connection.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Resolve DNS query failed errors for Exchange
Want to know how to use Exchange Server Eseutil command? Go through this article as it gives you the know-how.
In this video we show how to create a Distribution Group in Exchange 2013. We show this process by using the Exchange Admin Center. Log into Exchange Admin Center.: First we need to log into the Exchange Admin Center. Navigate to the Recipients >>…
In this video we show how to create an email address policy in Exchange 2013. We show this process by using the Exchange Admin Center. Log into Exchange Admin Center.:  First we need to log into the Exchange Admin Center. Navigate to the Mail Flow…

718 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question