私は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の断片を正しく解析するにはどうすればよいですか?
MIMEパーサーの使用はいかがですか? – simbabque
あなたは '&'でsubsと呼んでいます。 '&'を使うことは、perl5がリリースされた1994年以来必要ではありません。 – melpomene