0

我正在使用 perl 的格式语法生成格式化的文本输出,然后我将整个输出转换为一个标量变量,当我将其作为电子邮件正文发送时,整个文本都会失去其格式,有趣的是当我将收到的电子邮件正文复制并粘贴到一个文本编辑器(记事本),它作为原始格式化文本粘贴。我尝试了不同的编码,但没有任何帮助,因为 html 更糟糕。任何可以解决此问题的指针将不胜感激。对于电子邮件,我使用 MIME::Lite 和 Net::SMTP。谢谢/G

编辑:这是我用来发送电子邮件的代码:

$msg = MIME::Lite->new(
    From    => 'username@domain.com',
    To      => 'username2@domain.com',
    Cc      => '',
    Subject => 'Helloooooo,!',
    Type    => 'multipart/related',
);

$msg->attach(
    Type => 'text/plain charset=ANSI',
    Data => encode("Windows-1250", $data)
);

$msg->send('smtp', 'smtp.domain', Debug=>0);
4

2 回答 2

2

我成功地使用了这个构造:

# Convert the data to HTML.
my $html = $data;
$html =~ s/&/&/g;
$html =~ s/</&lt;/g;
$html =~ s/>/&gt;/g;

# Add header and formatting.
$html = <<"__EOI__";
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Helloooooo,!</title>
</head>
<body>
<pre>$html</pre>
</body>
</html>
__EOI__

# Convert to bytes.
$html = encode("UTF-8", $html);

# Send it.
my $msg = MIME::Lite->new(
        From    => 'username@domain.com',
        To      => 'username2@domain.com',
        Subject => 'Helloooooo,!',
        Type    => 'text/html',
        Data    => $html,
);
$msg->send();

我不像你那样使用 $msg->attach() ,因为在这种情况下不需要它。

于 2012-09-26T08:52:27.910 回答
1
text/plain charset=ANSI

应该

text/plain; charset=Windows-1250

或者

text/plain; charset=cp1250

(不确定邮件程序能识别什么,但 ANSI 不是编码。)

但真正的问题(基于您最新评论中提供的信息)与邮件标题无关。这只是一个字体选择问题。在记事本中,您使用非比例字体(例如 Courier New)。这意味着字体中的每个字符都在屏幕上占据相同的空间。

10“l”和10“m”:llllllllllmmmmmmmmmm
10“m”和10“l”:mmmmmmmmmmllllllllll

另一方面,您的电子邮件阅读器使用比例字体(例如 Ariel、Times New Roman)。在这样的字体中,较窄的字符(例如“l”)比较宽的字符(例如“m”)使用更少的水平像素。

10“l”和10“m”:llllllllllmmmmmmmmmm
10“m”和10“l”:mmmmmmmmmmllllllllll

解决方案:更改您的电子邮件阅读器的字体,或将您的有效负载更改为您可以指定字体的格式 (HTML)。

于 2012-09-25T18:59:48.720 回答