0

私はMime::Liteを使用して電子メールを作成および送信しています。今度はS/Mime暗号化のサポートを追加する必要があり、最終的に電子メールを暗号化できます(インストールできる唯一のPerllibが壊れているように見えるので、systemcallとopenssl smimeを使用しています)が、mimeを作成しようとすると-オブジェクトを使用すると、Content-Transfer-Encodingをbase64に設定するとすぐに電子メールが壊れます。さらに不思議なことに、を介して設定した場合にのみ発生し$myMessage->attrます。コンストラクターを使用している場合->newを使用して抑制する小さな警告を除いて、すべてが正常です。MIME::Lite->quiet(1);

それはバグですか、それとも私のせいですか?mime-objectを作成する2つの方法があります。

  1. コンストラクターを介してContent-Transfer-Encodingを設定し、警告を抑制します。

    MIME::Lite->quiet(1); 
    my $msgEncr = MIME::Lite->new(From   =>'me@myhost.com',
                            To     => 'you@yourhost.com',
                           Subject => 'SMIME Test',
                           Data    => $myEncryptedMessage,
                           'Content-Transfer-Encoding' => 'base64');
    
    $msgEncr->attr('Content-Disposition'        =>  'attachment');
    $msgEncr->attr('Content-Disposition.filename'   =>  'smime.p7m');
    $msgEncr->attr('Content-Type' => 'application/x-pkcs7-mime');
    $msgEncr->attr('Content-Type.smime-type' => 'enveloped-data');
    $msgEncr->attr('Content-Type.name' => 'smime.p7m');
    
    $msgEncr->send;             
    
    MIME::Lite->quiet(0);
    
  2. 暗号化されたデータを破壊するContent-Transfer-Encodingを設定し$myMessage->attrますが、警告は発生しません。

    my $msgEncr = MIME::Lite->new(From  => 'me@myhost.com',
                           To         => 'you@yourhost.com',
                           Subject    => 'SMIME Test',
                           Data => $myEncryptedMessage);
    
    $msgEncr->attr('Content-Disposition'        =>  'attachment');
    $msgEncr->attr('Content-Disposition.filename'       =>  'smime.p7m');
    $msgEncr->attr('Content-Type' => 'application/x-pkcs7-mime');
    $msgEncr->attr('Content-Type.smime-type' => 'enveloped-data');
    $msgEncr->attr('Content-Type.name' => 'smime.p7m');
    $msgEncr->attr('Content-Transfer-Encoding' => 'base64');
    
    $msgEncr->send; 
    

属性セッターを使用しているときにメッセージが壊れている理由がわかりません。よろしくお願いします!

それに加えて、暗号化されたメッセージを再度壊さずにこの電子メールにファイルを添付することはできません。

4

4 に答える 4

0

これをデバッグするにはスクリプトを作成してshowmail.plを呼び出します

#!/usr/bin/perl
while (<STDIN>) { print $_; }

次のようにテストします

use MIME::Lite;
use Net::SMTP;
use MIME::Base64;
$myEncryptedMessage = encode_base64("This is not valid encrypted message\n");
MIME::Lite->send('sendmail', "./showmail.pl"); ## Add this for debugging.
MIME::Lite->quiet(1); my $msgEncr = MIME::Lite->new(From   =>'me@localhost',
                 To     => 'you@localhost',
                 Subject => 'SMIME Test',
                 Data    => $myEncryptedMessage,
                 'Content-Transfer-Encoding' => 'base64');
$msgEncr->attr('Content-Disposition'        =>  'attachment');
$msgEncr->attr('Content-Disposition.filename'   =>  'smime.p7m');
$msgEncr->attr('Content-Type' => 'application/x-pkcs7-mime');
$msgEncr->attr('Content-Type.smime-type' => 'enveloped-data');
$msgEncr->attr('Content-Type.name' => 'smime.p7m');
$msgEncr->send();

のようなものが表示されるはずです。

MIME-Version: 1.0
Content-Disposition: attachment; filename="smime.p7m"
Content-Length: 49
Content-Type: application/x-pkcs7-mime; name="smime.p7m"; smime-type="enveloped-data"
X-Mailer: MIME::Lite 3.028 (F2.74; B3.07; Q3.07)
Date: Mon, 23 Mar 2012 10:40:51 -0400
From: me@localhost
To: you@localhost
Subject: SMIME Test
Content-Transfer-Encoding: base64

VGhpcyBpcyBub3QgdmFsaWQgZW5jcnlwdGVkIG1lc3NhZ2UK

メッセージはbase64でエンコードされていますが、実際のメッセージは正しく暗号化する必要があります。$ myEncryptedMessageが渡されるため、これが当てはまるかどうかを確認する必要があります。デバッグ出力を使用して、既知の正常な暗号化メールと比較し、ヘッダーが正常であるかどうかを確認できます。ヘッダーが正常であることがわかります。おそらく無効なデータです。

于 2012-03-26T17:25:55.373 に答える
0

あるコメントで述べたように、mimeobjectのコンストラクターでエンコードを設定する場合と-Setterを使用する場合の違いは、コンストラクター->attrがmimeheaderでエンコードを設定するだけであるということです。->attr-Setter mimeを使用すると、データがbase64でエンコードされます。

したがって、私の場合、以前に生成されたmimeobject(base64でエンコードされ、s / mimeで暗号化されています)をファイルから読み取るには、コンストラクターでエンコードを設定する必要があります(警告を抑制します)。これにより、mimeによるエンコードは行われません。そうしないと、mimeはデータを再度エンコードするため、暗号化と電子メール自体が破られます。

ついにアタッチメントが機能するようになりました。これを実現するには、通常のマルチパート/混合mimeobjectを作成し、このオブジェクトを通常のファイルに出力し、openssl smimeでこのファイルを暗号化し、このファイル全体(6つのヘッダー行を除く)を変数に読み込んで、これをデータ入力として使用します。さらに、コンストラクターを使用してContent-Transfer-Encodingをbase64に設定しました(データに対してエンコードは行われません)。

これが私以外の誰かに役立つことを願っています;)

于 2012-03-28T15:11:51.513 に答える
0

これを実際のメールクライアントでテストすることはできませんが、これはマルチパートで機能すると思います。

use MIME::Lite;
use Net::SMTP;
use MIME::Base64;
MIME::Lite->send('sendmail', "./showmail.pl"); ## <---- for testing only
my $from_address = "nobody@localhost";
my $to_address = "somebody@localhost";
my $mail_host = "localhost";
my $subject = "Subject list";
my $message_body = "Attachment list";
my @files = ("crypt.data1","crypt.data2");
$msg = MIME::Lite->new (
  From => $from_address,
  To => $to_address,
  Subject => $subject,
  Type =>'multipart/mixed'
) or die "Error creating multipart container: $!\n";

foreach $c(@files) {
   $msg->attach (
     Disposition => 'attachment',
     Type => "application/x-pkcs7-mime; name=smime.p7m; smime-type=enveloped-data",
     Path => $c,
   ) or die "Error adding $c: $!\n";
}
$msg->send;
于 2012-03-28T22:11:27.753 に答える
-1

$ myEncryptedMessageをencode_base64($ myEncryptedMessage)に置き換えます

MIME::Base64を使用します。

于 2012-03-25T05:39:09.520 に答える