免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11031 | 回复: 18
打印 上一主题 下一主题

用net::pop3写邮件客户端,取得的邮件主题等显示乱码? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-06-01 10:51 |只看该作者 |倒序浏览
如题,想用net::pop3模块写一个邮件客户端,在取得邮箱中的邮件时,用Mail::Header解析头,输出邮件主题、发件人时,有的显示正常,有的却是乱码,请指教!
代码如下: my $msg     = $pop->;get($msgnum);
         my $parsehead  = Mail::Header->;new($msg);
         chomp (my $subject= $parsehead->;get('Subject'));
         chomp (my $from   = $parsehead->;get('From') );
         chomp (my $date   = $parsehead->;get('Date') );
         my $len = $pop->;list($msgnum) ;
是看的《perl网络编程》的第8章,
显示出的主题有一个是:
=?gb2312?B?s8/R+8T6ss68086iyO0gTVNETiBXZWJj?= =?gb2312?B?YXN0cyDW0M7EzfjC57njsqU21MIxyNW/zrPM?=

论坛徽章:
0
2 [报告]
发表于 2005-06-01 15:57 |只看该作者

用net::pop3写邮件客户端,取得的邮件主题等显示乱码?

关注,我也没办法解决!
我也在搞一个web mail的东西给公司自己用,但是,解码搞不好

求职 : 网络信息安全
论坛徽章:
0
3 [报告]
发表于 2005-06-01 22:11 |只看该作者

用net::pop3写邮件客户端,取得的邮件主题等显示乱码?

呵呵,好像我这样做并无问题。

  1. sub subject_a{
  2.         my @ten=split("\t",$array[9]);
  3.         my $subject_a=$ten[0];
  4.         my $c10=substr($subject_a,0,1) eq '#'?0:1;
  5.         if($c10){
  6.                 print "您选择了“邮件主题精确匹配”,正在进行过滤.";
  7.                 print LOG "您选择了“邮件主题精确匹配”,正在进行过滤.";
  8.                 if(-z $subject_a){
  9.                         print "文件$subject_a为空,跳过此参数\n";
  10.                         print LOG "文件$subject_a为空,跳过此参数\n";
  11.                        
  12.                 }
  13.                 else{
  14.                         foreach my $ag (@delete){
  15.                                 my $header=$pop->;top($ag);
  16.                                 my $parsedhead=$parser->;parse_data($header);
  17.                                 $parsedhead->;head->;decode;
  18.                                 chomp(my $subject=$parsedhead->;head->;get('Subject'));
  19.                                 unless(open(SUBJECT_A,$subject_a)){
  20.                                         print "无法打开$subject_a,程序被中断。\n";
  21.                                         print LOG "无法打开$subject_a,程序被中断。\n";
  22.                                         close LOG;
  23.                                         $pop->;quit;
  24.                                         $parsedhead->;purge;
  25.                                         exit;
  26.                                 }
  27.                                 while(<SUBJECT_A>;){
  28.                                         chomp;
  29.                                         print ".";
  30.                                         print LOG ".";
  31.                                         if($subject eq $_){
  32.                                                 push(@del,$ag);
  33.                                                 last;
  34.                                         }
  35.                                 }
  36.                                 close SUBJECT_A;
  37.                                 $parsedhead->;purge;
  38.                         }
  39.                         foreach my $this (@delete){
  40.                                 map{$this=~s/$_//;} @del;
  41.                         }
  42.                         foreach my $that (@delete){
  43.                                 if($that){
  44.                                         push(@vov,$that);
  45.                                 }
  46.                         }
  47.                         @delete=@vov;
  48.                         @vov=();
  49.                         @del=();
  50.                         print ".完成。\n";
  51.                         print LOG ".完成。\n";
  52.                 }
  53.         }
  54.         else{
  55.                 print "您未选择“邮件主题精确匹配”,跳过此参数。\n";
  56.                 print LOG "您未选择“邮件主题精确匹配”,跳过此参数。\n";
  57.         }
  58. }

复制代码

论坛徽章:
0
4 [报告]
发表于 2005-06-02 09:25 |只看该作者

用net::pop3写邮件客户端,取得的邮件主题等显示乱码?

自己再琢磨琢磨。
y6cmE,你从pop3服务器取邮件时的代码能贴出来看看吗?

论坛徽章:
0
5 [报告]
发表于 2005-06-02 15:23 |只看该作者

用net::pop3写邮件客户端,取得的邮件主题等显示乱码?

需要解码

求职 : 网络信息安全
论坛徽章:
0
6 [报告]
发表于 2005-06-02 19:20 |只看该作者

用net::pop3写邮件客户端,取得的邮件主题等显示乱码?


  1. #!e:/perl/bin/perl.exe -w
  2. use strict;
  3. ###        0.0.8.2                2003.6.8      by y6cmE
  4. use Net::POP3;
  5. use MIME::Parser;
  6. use Term::ReadKey;
  7. ######################################################################################
  8. local $|=1;
  9. my $host;
  10. my $user;
  11. my @array;
  12. my @delete;
  13. my @del;
  14. my @vov;
  15. my $pop;
  16. my $messages;
  17. my $parser;
  18. my $localtime=localtime;
  19. unless(open(LOG,">;log.txt")){
  20.         print "无法写日志文件log.txt!程序中断。\n";
  21.         exit;
  22. }
  23. print "$localtime\n";
  24. print LOG "$localtime\n";
  25. if($#ARGV == 1){
  26.         $host=shift;
  27.         $user=shift;
  28.         &
  29. }
  30. elsif(-e "getopt.ini"){
  31.         unless(open(GETOPT,"getopt.ini")){
  32.                 print "无法打开getopt.ini读取服务器与用户名,程序中断。\n";
  33.                 print LOG "无法打开getopt.ini读取服务器与用户名,程序中断。\n";
  34.                 close LOG;
  35.                 exit;
  36.         }
  37.         my @get=<GETOPT>;;
  38.         close GETOPT;
  39.         my $gtt=join("",@get);
  40.         my @opt=split("\n",$gtt);
  41.         $host=$opt[0];
  42.         $user=$opt[1];
  43.         &
  44. }
  45. else{
  46.         print "您的使用方法错误,请先阅读“readme”。^_^\n";
  47.         print LOG "您的使用方法错误,请先阅读“readme”。^_^\n";
  48.         close LOG;
  49. }
  50. ######################################################################################
  51. sub hack{
  52.         unless(open(CONFIG,"config.ini")){
  53.                 print "无法打开config.ini,程序中断。\n";
  54.                 print LOG "无法打开config.ini,程序中断。\n";
  55.                 close LOG;
  56.                 exit;
  57.         }
  58.         my $foo;
  59.         while(<CONFIG>;){
  60.                 $foo.=$_;
  61.         }
  62.         close CONFIG;
  63.         @array=split("\n",$foo);
  64.         my @one=split("\t",$array[0]);
  65.         my $port=$one[0];
  66.         my @two=split("\t",$array[1]);
  67.         my $timeout=$two[0];
  68.         unless($pop=Net::POP3->;new($host,Port=>;$port,Timeout=>;$timeout)){
  69.                 print "无法连接$host或连接时间超过$timeout秒,请检查是否已上网、服务器地址是否正确。\n";
  70.                 print LOG "无法连接$host或连接时间超过$timeout秒,请检查是否已上网、服务器地址是否正确。\n";
  71.                 close LOG;
  72.                 exit;
  73.         }
  74.         print "请输入您的密码(不回显):";
  75.         ReadMode("noecho");
  76.         chomp(my $pass=<STDIN>;);
  77.         ReadMode(0);
  78.         unless($messages=$pop->;login($user,$pass)){
  79.                 print "\n无法登录$host的$user,请检查用户名与密码是否正确。\n";
  80.                 print LOG "\n无法登录$host的$user,请检查用户名与密码是否正确。\n";
  81.                 close LOG;
  82.                 exit;
  83.         }
  84.         print "\n登录到$host的$user\n";
  85.         print LOG "登录到$host的$user\n";
  86.         my @three=split("\t",$array[2]);
  87.         my $offhand=$three[0];
  88.         $parser=new MIME::Parser;
  89.         unless(-d $offhand){
  90.                 unless(mkdir($offhand,0777)){
  91.                         print "无法创建目录$offhand,程序中断。\n";
  92.                         print LOG "无法创建目录$offhand,程序中断。\n";
  93.                         close LOG;
  94.                         $pop->;quit;
  95.                         exit;
  96.                 }
  97.         }
  98.         unless($parser->;output_dir("$offhand")){
  99.                 print "打不开目录$offhand,程序中断。\n";
  100.                 print LOG "打不开目录$offhand,程序中断。\n";
  101.                 close LOG;
  102.                 $pop->;quit;
  103.                 exit;
  104.         }
  105.         $parser->;output_prefix("pgg");
  106.         if($messages eq "0E0"){
  107.                 print "您的邮箱没有邮件,程序结束,谢谢使用!\n";
  108.                 print LOG "您的邮箱没有邮件,程序结束,谢谢使用!\n";
  109.                 close LOG;
  110.                 $pop->;quit;
  111.                 exit;
  112.         }
  113.         else{
  114.                 print "您的邮箱共有$messages封信件。\n";
  115.                 print LOG "您的邮箱共有$messages封信件。\n";
  116.                 my $last=$pop->;last;
  117.                 $last+=1;
  118.                 $messages+=0;
  119.                 foreach my $msgnum ($last..$messages){
  120.                         push(@delete,$msgnum);
  121.                 }
  122.                 &
  123.                 &
  124.                 &
  125.                 &from_m;
  126.                 &from_a;
  127.                 &subject_m;
  128.                 &subject_a;
  129.                 &filename_m;
  130.                 &body_a;
  131.                 &body_m;
  132.                 &
  133. ......
复制代码

论坛徽章:
0
7 [报告]
发表于 2005-06-06 11:28 |只看该作者

用net::pop3写邮件客户端,取得的邮件主题等显示乱码?

谢谢y6cmE,
前面都类似,就是在解析邮件时,你用MIME:arser模块解析,解析出来的主题等都显示正常吗?
看起来用MIME:arser还挺麻烦的

论坛徽章:
0
8 [报告]
发表于 2005-06-06 18:30 |只看该作者

用net::pop3写邮件客户端,取得的邮件主题等显示乱码?

《perl网络编程》中的一段代码,
#!c:\perl\bin\perl

use strict;
use Net:OP3;
use MIME::Entity;
use MIME:arser;

my $file = 'D:\example\11.txt';
open F,$file or die "can't open $file!\n";   
   
my $pop = Net:OP3->;new($host) or die "Can't connect to $host!\n";
my $message = $pop->;login($user=>;$passwd) or die "Can't log in:",$pop->;message,"\n";
my $last = $pop->;last;
$message +=0;
print "inbox has $message message(",$message-$last,"new)\n";

my $parser =new MIME:arser;
$parser->;output_dir("d:\\mail";

my $entity = $parser->;parse(\*F);

print "From        = ",$entity->;head->;get('From'),"\n";
print "Subject     = ",$entity->;head->;get('Subject'),"\n";
print "MIME type   = ",$entity->;mime_type,"\n";
print "arts       = ",scalar $entity->;parts,"\n";

for my $part ($entity->;parts) {
        print "\t",$part->;mime_type,"\t",$part->;bodyhandle->;path,"\n";
}

$entity->;purge;

想试试用MIME:arser对mail头进行解析是怎样,但是解析出来的除了MIME type都是空,这是为什么?
执行一次,在d:\\mail下会有一个空的文本文件,是不是因为my $file = 'D:\example\11.txt'中的11.txt的问题?书上说应该是一个包含MIME编码的消息。但是我不知道这个文件应该是怎样的。
请教大家!

论坛徽章:
0
9 [报告]
发表于 2005-06-07 09:09 |只看该作者

用net::pop3写邮件客户端,取得的邮件主题等显示乱码?

再关注MIME:arser,不知它的解码效果,针对于不同的编码方式,如GBK,UTF-8,等,还有用outlook发送word文件的特殊编码方式,解码效果如何?
这些问题,搞得我头疼!

论坛徽章:
0
10 [报告]
发表于 2005-06-11 21:49 |只看该作者

用net::pop3写邮件客户端,取得的邮件主题等显示乱码?

使用MIME::Head的decode方法可以解码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP