我正在使用Mime :: Lite来创建和发送电子邮件。现在我需要添加对S / Mime加密的支持,最后可以加密我的电子邮件(我可以安装的唯一Perllib看起来很破,所以我使用的是系统调用和openssl smime),但当我尝试创建一个mime -object with it,一旦我将Content-Transfer-Encoding设置为base64,电子邮件就会被破坏。为了让它更加好奇,只有通过$myMessage->attr
设置它才会发生。如果我正在使用构造函数 - >新的一切都很好,除了我用MIME::Lite->quiet(1);
这是一个错误还是我的错?以下是我创建mime-object的两种方法。
通过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);
通过$myMessage->attr
设置Content-Transfer-Encoding,它会破坏加密数据,但不会引起警告:
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;
当我使用属性设置器时,我只是不知道为什么我的消息被破坏了。在此先感谢您的帮助!
除此之外,我无法在不破坏加密邮件的情况下将任何文件附加到此电子邮件。
答案 0 :(得分: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,但真实消息仍需正确 encypted。你需要确保是这种情况,因为$ myEncryptedMessage是 通过调试输出,您可以与已知良好的加密邮件进行比较 并查看标题是否良好,据我所知,标题很好,很可能 无效的数据。
答案 1 :(得分:0)
正如我在一篇评论中所说,在mimeobject或->attr
- Setter的construtor中设置编码的区别在于,construtor只是在mimeheader中设置编码。通过使用->attr
- Setter mime使用base64对数据进行编码。
所以在我的情况下,我之前生成的mimeobject--它是base64编码的并且加密了s / mime - 从文件中读取需要来设置construtor中的编码(并禁止警告)因此,mime不再进行编码。否则,mime会对数据再次进行编码,从而破坏加密和电子邮件本身。
我终于得到了工作的附件。为了实现这一点,我创建了一个普通的multipart / mixed mimeobject,将这个对象打印到普通文件中,用openssl smime加密这个文件,将整个文件(除了6个标题行)读入变量并将其用作datainput。另外,我使用construtor将Content-Transfer-Encoding设置为base64(因此不对我的数据进行编码)。
我希望这会帮助别人,然后我;)
答案 2 :(得分: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;
答案 3 :(得分:-1)
将$ myEncryptedMessage替换为encode_base64($ myEncryptedMessage)
并使用MIME :: Base64;