【问题标题】:Perl: Formatted output to email bodyPerl:格式化输出到电子邮件正文
【发布时间】:2012-09-27 11:05:24
【问题描述】:

我正在使用 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);

【问题讨论】:

  • 您发送的是 text/html 格式吗?
  • 我已经尝试过 text/html 或 text/plain ,我说的 html 更糟糕
  • 请展示您正在使用的代码以便我们提供帮助,而无需从头开始为您编写解决方案。
  • 只有显示的格式关闭了吗?邮件源代码可以吗?你能告诉我们你收到的确切电子邮件(没有不必要的标题)吗?
  • 尝试用Type => 'text/plain'替换Type => ' text/plain charset=ANSI'注意空格

标签: perl


【解决方案1】:

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

# 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() 因为在这种情况下不需要它。

【讨论】:

  • 正如 OP 所述,您发布的内容不起作用。它会丢失所有格式,并且会误解某些字符序列(以&amp;&lt;&gt; 开头)。您还删除了必要的编码步骤。我已经添加了所有这些缺失的组件。
【解决方案2】:
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)。

【讨论】:

  • 我都试过了,但都没有运气,我截取了实际的屏幕截图和我在电子邮件中看到的内容,似乎差异是由于字符间距造成的,这意味着电子邮件中的“-”比电子邮件中的小得多文本文件
  • ikegami 这是非常好的建议。最终,我只是更改了我的电子邮件客户端设置,在我的情况下是 Outlook 2010,以便在 Courier New 中阅读文本电子邮件。现在它以完美的格式显示。
猜你喜欢
  • 2011-06-02
  • 2020-05-09
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 2014-02-10
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多