`
anson_xu
  • 浏览: 516696 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类

perl 邮件解析乱码 用了MIME::Base64还乱问题解决

阅读更多

my $mail_subject="=?gb2312?B?x006w60h?=";#你好

方法一:

use MIME::Base64;

就可以用decode_base64()函数了

如果还乱码的话可以加上

$dec = decode_base64($subject)

$dec = decode($charset,$dec);

charset就是这里的gb2312

 

方法二:

如果复制过来的字符不完整可能会出现Warning: base64 decoder saw premature EOF!
metamail包比较古老了,现在的发行版上基本没有,需要去网上搜索对应的包来安装。如果不想安装,也可以用perl脚本。

     附上脚本源代码
perl脚本1
#!/usr/bin/perl
# Convert Base64 Or Quoted-printable TO Text
     $a = $ARGV[0];

if ($a=~/=\?[\w-]+\?B\?(.*)\?=$/) {
   use MIME::Base64;
   $a = decode_base64($1);
}

if ($a=~/=\?[\w-]+\?Q\?(.*)\?=$/) {
   use MIME::QuotedPrint;
   $a = decode_qp($1);
}

#open(OUTFILE, ">;/tmp/list.log");
#print OUTFILE $a;
#close(OUTFILE);

print "\n";
print $a;
print "\n";
exit(0);

脚本2
#!/usr/bin/perl
     $sub=$ARGV[0];
     if ($sub=~ /=\?\S+\?\l(\S)\?/) {
       if ($1 =~ /[Qq]/) {
         $sub=decode_qp($sub);
       }
       elsif ($1 =~ /[Bb]/) {
         $sub=decode_base64($sub);
       }
     }
     elsif ($sub=~ /=[a-fA-F0-9][a-fA-F0-9]/) {
       $sub=decode_qp($sub);
     }
     $subject.=$sub;
print "\n";
print $subject;
print "\n";
sub decode_qp {
         my($string) = @_;
         @buffer=split(/\?/,$string);
         $string = $buffer[3] if ($buffer[3] ne "");
         $string =~ s/=([\da-fA-F]{2})/pack("C", hex($1))/ge;
         $string =~ /\?=(.*)/;
         $string =~ tr/_/ /;
         $buffer[4]=~s/^=//;
         $buffer[0]=~s/=$//;
         $string="$buffer[0]$string$buffer[4]";
         return($string);
}

sub decode_base64 {
         my($string) = @_;
         my($string2);
         @buffer=split(/\?/,$string);
         $string = $buffer[3] if ($buffer[3] ne "");
         $string =~ s/=+$//;
         $string =~ tr|A-Za-z0-9+/| -_|;
         while($string =~ /(.{1,60})/gs) {
                 my($string3) = chr(32+length($1)*3/4);
                 $string2 .= unpack("u",$string3 . $1 );
         }
         $buffer[4]=~s/^=//;
         $buffer[0]=~s/=$//;
         $string2="$buffer[0]$string2$buffer[4]";
         return($string2);
}
两个脚本功能是一样的,随便用其中一个都可以
     脚本1调用了perl模块,使用前最好检查一下对应的模块是否安装了
     
[@95.161 ~]# perldoc -l MIME::Base64
/usr/lib/perl5/5.8.5/i386-linux-thread-multi/MIME/Base64.pm

      如果没有安装对应的模块会提示No documentation found for "MIME::Base64"
      可以用下面命令安装
     
perl -MCPAN -e 'install MIME::Base64;'
      如果已经设置了语言环境(export LANG=zh_CN),则简体中文的信息可以直接显示
      但是有时候邮件是采用其他字符集编码的,如utf-8,big5等,要进行编码转换
    
iconv -f utf8 -t gb13030
以上命令可以组合成脚本,方便查询
方法三:

-----perl 的脚本,需要传参进来,脚本有点糙,哈----

#!/usr/bin/perl
use Encode;
use MIME::Base64;
my $a = $ARGV[0] || ;
if ($a=~/^Subject/) {
$i=1;
while ($i <= $#ARGV){
   $str = "$str".' '." $ARGV[$i]";
   $i++;
};
}elsif ($a=~/^=\?gb2312\?B\?(.*)\?=$/) {
$a = decode_base64($1);
$str=decode("gb2312",$a);
}elsif ($a=~/^=\?utf-8\?B\?(.*)\?=$/) {
use MIME::Base64;
$a = decode_base64($1);
$str=decode("utf8",$a);
}elsif ($a=~/^=\?utf-8\?Q\?(.*)\?=$/) {
use MIME::QuotedPrint;
$str = decode_qp($1);
}elsif ($a=~/^=\?[\w-]+\?Q\?(.*)\?=$/) {
use MIME::QuotedPrint;
$str = decode_qp($1);
}else {
$i=0;
while ($i <= $#ARGV){
   $str = "$str".' '." $ARGV[$i]";
   $i++;
};
};
print "$str";

分享到:
评论

相关推荐

    perl-MIME-Base64-3.15-396.el8.x86_64.rpm

    离线安装包,亲测可用

    电子邮件MIME协议中的Base64编解码

    Base64编解码使用64个可打印字符(A-Z、a-z、0-9、+、/)来表示二进制数据。 2. Base64编解码的原理 Base64编解码的原理是将二进制数据分成三个字节(24位),然后将每个字节分成四个六位的部分,每个六位部分对应...

    Linux或Ubuntu下SVN服务器自动发送邮件配置

    如果没有安装,当尝试发送邮件时,你会看到一个错误提示:“SMTP Error: Need MIME::Base64 and Authen::SASL todo auth”。在Ubuntu上,可以使用`apt-get`命令轻松安装: ``` # sudo apt-get install libauthen-...

    Base64编码解码、无乱码。本人亲自测试使用。.

    本人亲自测试了这个软件,在转换的时候注意...Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045~RFC2049,上面有MIME的详细规范。Base64编码可用于在HTTP环境下传递较长的标识信息。

    对邮件eml文件的完整解析

    本篇将深入探讨如何对`.eml`文件进行完整解析,涉及邮件解析的基础知识、Base64和QP解码的原理以及在邮件分析中的应用。 首先,我们需要了解`.eml`文件的结构。`.eml`文件基于互联网邮件扩展(MIME)标准,遵循RFC ...

    perl-MIME-Lite-3.30.0-6.mga6.noarch.rpm

    my $msg=MIME::Lite-&gt;new( From=&gt;$opt-&gt;{from}, To=&gt;$opt-&gt;{to}, #Subject=&gt;$opt-&gt;{subject}, Subject=&gt;"=?UTF-8?B?" .encode_base64(encode("utf8", $opt-&gt;{subject}), "") . "?=", #Type =&gt; 'text/html', #'...

    MIME-Base64.rar_MIME base64 _base64_mime

    Base64是MIME邮件中常用的编码方式之一。它的主要思想是将输入的字符串或数据编码成只含有{ A - Z , a - z , 0 - 9 , + , / }这64个可打印字符的串,故称为“Base64”。

    C#实现Base64编码与解码 邮件解码

    Base64使用64个可打印的ASCII字符来表示二进制数据,包括大小写字母、数字以及"+"和"/",最后还用"="作为填充字符。这种编码方式可以确保数据在通过文本格式传输时不会被误解或损坏。 在C#中,我们可以利用System....

    Base64文件图片编码解码双向转换解析预览工具

    Base64是一种在互联网上广泛使用的编码方式,用于将二进制数据转化为可打印的ASCII字符串形式。在处理图片、文件或任何包含非ASCII字符的数据时,Base64编码非常有用,因为它允许这些数据在电子邮件、HTML或JSON等...

    Thymeleaf显示base64字符串为图片.docx

    在网页开发中,有时我们需要将Base64编码的字符串直接作为图片显示出来,这在Thymeleaf框架中可以通过特定的方式实现。Base64是一种数据编码方式,它将二进制...这样,浏览器就能正确地解析和显示Base64编码的图片。

    一个PHP邮件mime解析器

    3. **处理编码内容**:邮件中的文本和附件可能经过Base64或Quoted-Printable编码,解析器应能正确解码这些内容。 4. **处理嵌入资源**:在HTML邮件中,可能存在内联图像或其他资源,解析器需要处理这些资源的引用。 ...

    perl-MIME-Base64-3.15-396.el8.aarch64.rpm

    离线安装包,亲测可用

    rh-perl530-perl-MIME-Base64-3.15-451.el7.x86_64.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    apache-mime4j-0.7.2

    这个库是为了解决解析和操作MIME消息流的问题而设计的,它提供了丰富的API来方便开发人员进行处理。在Android开发中,尤其是在与服务器交互、发送或接收MIME格式的邮件或HTTP请求时,Apache MIME4J是一个非常实用的...

    httpmime-4.5.13-API文档-中文版.zip

    赠送jar包:httpmime-4.5.13.jar; 赠送原API文档:httpmime-4.5.13-javadoc.jar; 赠送源代码:httpmime-4.5.13-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    foxmail邮件解析

    - **编码问题**:邮件内容可能使用多种字符编码,如ASCII、UTF-8、GB2312等,解析时需正确识别并转换编码,确保显示无误。 3. **解析工具和编程接口** - **第三方工具**:有一些开源工具,如Embox,可以解析...

    乱码查看器乱码察看器顾名思义就是用来察看各种乱码的工具软件,目前支持MIME/BASE64

    乱码察看器顾名思义就是用来察看各种乱码的工具软件,目前支持MIME/BASE64, Quoted-Printable,HZ和UUCode四种形式的编码和解码,通过一些特殊的算法, 本程序还可以解开部分由于字节高位被屏蔽而形成的死乱码...

    BASE64Encoder.jar

    1. **邮件系统**:MIME标准规定,非ASCII字符的附件必须先进行Base64编码才能通过邮件系统传递。 2. **HTTP传输**:HTTP协议只支持ASCII字符,Base64编码可以确保二进制数据如图片或文件能在HTTP请求和响应中安全...

    工具类:Base64与图片相互转换

    这个“工具类:Base64与图片相互转换”正是为了方便开发者进行此类操作。Base64编码是网络上最常用的用于传输八进制数据的方法之一,它能将任何二进制数据转换成ASCII字符串,从而可以在电子邮件或其他不支持二进制...

    base64编解码C/C++实现

    8. **编码标准**:Base64有多种变体,如RFC 4648、 MIME以及URL安全的Base64。不同变体对字符集、是否允许换行以及填充规则有不同的规定。在实现时,需要明确所遵循的标准。 9. **使用示例**:在`base64.cpp`和`...

Global site tag (gtag.js) - Google Analytics