科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网服务器频道用Perl编写读取POP3邮箱的应用程序

用Perl编写读取POP3邮箱的应用程序

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

像微软的Outlook和Mozilla的雷鸟(Thunderbird)这样的电子邮件客户端程序能够让收发电子邮件变得极其简单——绝大多数时候,你需要做的只不过是点击一下工具条上的按钮,软件会为你完成与电子邮件服务器进行通信。

来源:CNET中国·ZOL 2008年2月27日

关键字: 微软 服务器 POP3 PERL

  • 评论
  • 分享微博
  • 分享邮件

  像微软的Outlook和Mozilla的雷鸟(Thunderbird)这样的电子邮件客户端程序能够让收发电子邮件变得极其简单——绝大多数时候,你需要做的只不过是点击一下工具条上的按钮,软件会为你完成与电子邮件服务器进行通信、验证密码、收取电子邮件等复杂的工作。

  但是在这种具有欺骗性的简单表象背后却牵涉大量的软件编程工作。而且,如果你是一个软件开发人员,你可能有一天会发现如果能够把这样的程序放到自己的应用程序会有多好啊。

  不用担心那么多,因为如果你在使用Perl,那么你就可以利用一个叫做Net::POP3的小CPAN模块来实现这一愿望,这个十分有用的模块会为你完成大多数复杂的工作。这个模块向POP3服务器的交互操作公开一个简单但是非常强大的API,提供一些预设的方法来进行服务器身份验证、消息列表和收取、消息删除,以及结束会话——简而言之,它提供了满足用户基本需要的一切。

  注:列表A到C里的代码文本可以从可下载的Zip文件里获得。

  本文将通过使用Net::POP开发一个简单的POP3电子邮件应用程序来探讨它的一些功能。一开始你需要在Perl提示符下运行下面的命令来下载和安装这个模块(如果你还没有的话):

  perl> perl -MCPAN -e "install Net::POP3"

  开始创建下面的Perl脚本(列表A):

  列表A

  #!/bin/perl

  # import package

  use Net::POP3;

  # ask user for critical variables

  print "Mail host: ";

  $host = ;

  chomp($host);

  print " ";

  print "Mailbox username: ";

  $user = ;

  chomp($user);

  print " ";

  print "Mailbox password: ";

  $pass = ;

  chomp($pass);

  # initiate connection

  # default timeout = 120 sec

  $conn = Net::POP3->new($host) or die("ERROR: Unable to connect. ");

  # login

  $numMsg = $conn->login($user, $pass) or die("ERROR: Unable to login. ");

  # display number of messages

  if ($numMsg >0) {

  print "Mailbox has $numMsg message(s). ";

  } else {

  print "Mailbox is empty. ";

  }

  # close connection

  $conn->quit();

  这个代码段会要求用户输入三个内容:电子邮件服务器的主机名、POP3用户名和相应的密码。一旦输入了这三项内容,一个新的Net::POP3对象就会被创建,而对象的login()方法会被用来打开一个到主机的连接,并验证所提供的凭据。如果提供的凭据被服务器认可,那么login()方法就会返回邮箱里的消息数量(或者返回0,如果没有消息的话)。

  下面就是它的一个实际例子:

  Mail host: pop.mailbox.com

  Mailbox username: jane

  Mailbox password: secret

  Mailbox has 77 message(s).

  当然,仅仅知道消息的数量是远远不够的——你肯定希望知道这些消息的内容。通过Net::POP3的top()方法就能够达到这个目的,它会扫描消息的前X行,并返回一个指向含有已收取数据的数组的参考。下面就是一个例子,(列表B)会取回邮箱里所有消息的前20行:

  列表B

  #!/bin/perl

  # import package

  use Net::POP3;

  # ask user for critical variables

  print "Mail host: ";

  $host = ;

  chomp($host);

  print " ";

  print "Mailbox username: ";

  $user = ;

  chomp($user);

  print " ";

  print "Mailbox password: ";

  $pass = ;

  chomp($pass);

  # initiate connection

  # default timeout = 120 sec

  $conn = Net::POP3->new($host) or die("ERROR: Unable to connect. ");

  # login

  $numMsg = $conn->login($user, $pass) or die("ERROR: Unable to login. ");

  # get message numbers

  # iterate over list and print first 20 lines of each

  if ($numMsg >0) {

  $msgList = $conn->list();

  foreach $msg (keys(%$msgList)) {

  $ref = $conn->top($msg, 20);

  print @$ref;

  print " ";

  }

  } else {

  print "Mailbox is empty. ";

  }

  # close connection

  $conn->quit();

  你可以使用get()方法而不用top()方法,从而收取完整的消息。

  如果你希望的话,你可以在命令行通过Getopt::Long模块把服务器的参数传递给程序,下面的列表C显示了这个模块:

  列表C

  #!/bin/perl

  # import packages

  use Net::POP3;

  use Getopt::Long;

  # read command line options

  # display usage message in case of error

  GetOptions ('h|host=s' => $host,

  'u|user=s' => $user,

  'p|pass=s' => $pass) or die("Input error. Try calling me with: -h -u -p ");

  # initiate connection

  # default timeout = 120 sec

  $conn = Net::POP3->new($host) or die("ERROR: Unable to connect. ");

  # login

  $numMsg = $conn->login($user, $pass) or die("ERROR: Unable to login. ");

  # get message numbers

  # iterate over list and print first 20 lines of each

  if ($numMsg >0) {

  $msgList = $conn->list();

  foreach $msg (keys(%$msgList)) {

  $ref = $conn->top($msg, 20);

  print @$ref;

  print " ";

  }

  } else {

  print "Mailbox is empty. ";

  }

  # close connection

  $conn->quit();

  这些代码模板会告诉你如何把Net::POP3集成到需要处理电子邮件的应用程序里。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章