0

我正在使用 Mime::Lite 创建和发送电子邮件。现在我需要添加对 S/Mime 加密的支持,最后可以加密我的电子邮件(我可以安装的唯一 Perllib 似乎坏了,所以我使用系统调用和 openssl smime),但是当我尝试创建一个 mime -object ,只要我将 Content-Transfer-Encoding 设置为 base64,电子邮件就会被破坏。为了让它更加好奇,只有当我通过$myMessage->attr. 如果我使用构造函数 -> new 一切都很好,除了我通过使用抑制的一点警告MIME::Lite->quiet(1);

是bug还是我的错?以下是我创建 mime 对象的两种方式。

  1. 通过 construtor 设置 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

正如我在一条评论中所说,在 mimeobject 的构造函数中设置编码或使用->attr-Setter 的区别在于,构造函数只是在 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 回答
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 回答
-1

将 $myEncryptedMessage 替换为 encode_base64($myEncryptedMessage)

并使用 MIME::Base64;

于 2012-03-25T05:39:09.520 回答