2017-09-22 8 views
0

私はperlで新しいです。私はCentos Server上のsmstools経由でSMSで送信するための電子メールメッセージのテキストを解析する古いスクリプトを持っています。我々は、キリル文字で通知するSMSを使用する必要がある別のソフトウェアを追加します。 古いソフトウェアは、フォーマットの電子メールを送信します。parse base64 text第2空白行perlの後

Headers 
Headers 
Content-Transfer-Encoding: base64 
blank line 
BASE64 TEXT 

とスクリプトを正しくBASE64のテキストを解析し、デコードを。 新しいソフトウェアは、フォーマットの電子メールを送信します。

Headers 
Headers 
blank line 
------=_Part_digits 
Header 
Content-Transfer-Encoding: base64 
blank line 
BASE64 TEXT 

、スクリプトが正しくBASE64のテキストを解析することはできません。 SMSのテキストを解析するための機能は次のとおりです。

sub Process_Email 
{ 
    my ($Sms_To,@Lines)[email protected]_; 
    my $Body_Start ="False"; 
    my $Sms_Body = ""; 
    my $Base64="False"; 
    my $HTML_Mess="False"; 
    my $HTML_Text="False"; 
    my $Boundary; 
     # Declare local variables 
    my ($From, $Line); 
     # Check each line in the header 
    foreach $Line (@Lines) 
     { 
     if($Line =~ m/^From: (.*)/) 
      { 
      $From = lc($1); 
      $From =~ s/.*<|>|@[a-z].*//g; 
      &Write_Log("From = $From"); 
      } 
     elsif($Line =~ m/^Content-Transfer-Encoding: base64(.*)/) 
      { 
       $Base64="True"; 
       &Write_Log("Message was encoded in base64"); 
      } 
     elsif($Line =~ m/Content-Type: multipart\/alternative(.*)/) 
      { 
       $HTML_Mess="True"; 
       &Write_Log("The message in HTML format"); 
       if($Line =~ m/boundary=\"(.*)/) 
        { 
         my $PosStart = index($Line,'"'); 
         $PosStart++; 
         my $PosEnd = rindex($Line,'"'); 
          my $PosLeight = $PosEnd-$PosStart; 
         $Boundary = substr($Line,$PosStart,$PosLeight); 
         $Boundary =~ s/\+|\-|\=//g; 
        } 
      } 
     elsif(($Line =~ m/boundary=\"(.*)/)&&($HTML_Mess eq "True")) 
      { 
      my $PosStart=index($Line,'"'); 
      $PosStart++; 
      my $PosEnd=rindex($Line,'"'); 
      my $PosLeight=$PosEnd-$PosStart; 
      $Boundary=substr($Line,$PosStart,$PosLeight); 
      $Boundary =~ s/\+|\-|\=//g; 
      } 
     elsif($Line =~ m/Content-Type: multipart\/mixed(.*)/) 
      { 
       $HTML_Mess="True"; 
       &Write_Log("The message in HTML format"); 
         if($Line =~ m/boundary=\"(.*)/) 
        { 
        my $PosStart = index($Line,'"'); 
        $PosStart++; 
        my $PosEnd = rindex($Line,'"'); 
        my $PosLeight = $PosEnd-$PosStart; 
        $Boundary = substr($Line,$PosStart,$PosLeight); 
        $Boundary =~ s/\+|\-|\=//g; 
        } 
      } 
     elsif(($Line =~ m/boundary=\"(.*)/)&&($HTML_Mess eq "True")) 
      { 
      my $PosStart=index($Line,'"'); 
      $PosStart++; 
      my $PosEnd=rindex($Line,'"'); 
      my $PosLeight=$PosEnd-$PosStart; 
      $Boundary=substr($Line,$PosStart,$PosLeight); 
      $Boundary =~ s/\+|\-|\=//g; 
      } 
      # find blank line 
     elsif($Line =~ /^\n$/) 
      { 
      $Body_Start="True"; 
      next; 
      } 
      # Begins sms body 
     if($Body_Start eq "True") 
      { 
       # decode BASE64 TEXT 
      if($Base64 eq "True") 
{ 
      $Sms_Body=$Sms_Body . decode_base64($Line); 
} 
      elsif($HTML_Mess eq "True") 
       { 
       if($HTML_Text eq "True") 
        { 
        if($Line !~ m/$Boundary/) 
         { 
         $Sms_Body = $Sms_Body . $Line; 
         } 
        else 
         { 
         $HTML_Text="False"; 
         last; 
         } 
        } 
       if(($Line =~ m/Content-Transfer-Encoding: 7bit/)&&($HTML_Text eq "False")) 
        { 
         $HTML_Text="True"; 
        } 
       } 
      else { $Sms_Body = $Sms_Body . $Line; } 
      } 
     } 

私は1つの空白行も取り組んでこの機能を備えた電子メールを持っている場合。 メールで2行の空白行がある場合は、BASE64 TEXTが上位ヘッダーで解析されていますが、結果が正しくありません。元のコードを最小限に編集してBASE64 TEXTの断片を正しく解析するにはどうすればよいですか?

+4

MIMEパーサーの使用はいかがですか? – simbabque

+0

あなたは '&'でsubsと呼んでいます。 '&'を使うことは、perl5がリリースされた1994年以来必要ではありません。 – melpomene

答えて

0

STDINまたは入力から読み込んでいる場合、このようなことはどうですか?

while (<>) { 
    last if m/^$/; # blank line; 
    my ($header, $value) = split /:/; 
} 


my $mime_content = do { local $/; <> }; #read rest of input. 
#then decode it, etc. 
+0

私は自分の答えを編集し、BASE64 TEXTを解析するためのフル機能を追加しました。それを見直して、元のテキストの修正を最小限に抑えてアドバイスを残してください。 –