【问题标题】:Email text has incorrect default encoding in client program电子邮件文本在客户端程序中的默认编码不正确
【发布时间】:2017-09-25 15:45:41
【问题描述】:

我正在尝试发送一封电子邮件,其中包含以 utf-8 编码的俄语文本和主题。正在接收电子邮件,当我在 gmail 的 Web 界面中打开它时,一切正常。但是当我在“The bat”客户端打开邮件时,默认编码不正确(我可以手动设置为utf-8):

Subject: "Hello. Текст"
Body: "test email. Русский текст"

代替:

Subject: "Hello. Текст"
Body: "test email. Русский текст"

代码:

#!/usr/bin/perl

use utf8;
use strict;
use warnings;

use Email::Sender::Simple qw(sendmail);
use Email::Sender::Transport::SMTP ();
use Email::Simple ();
use MIME::Base64 qw( encode_base64 );
use open ':std', ':encoding(UTF-8)';

sub send_email
{
    my $email_from = shift;
    my $email_to = shift;
    my $subject = shift;
    my $message = shift;

    my $smtpserver = 'smtp.gmail.com';
    my $smtpport = 465;
    my $smtpuser   = 'user@gmail.com';
    my $password = 'secret';

    my $transport = Email::Sender::Transport::SMTP->new({
        host => $smtpserver,
        port => $smtpport,
        sasl_username => $smtpuser,
        sasl_password => $password,
        debug    => 1,
        ssl => 1,
    });

    my $email = Email::Simple->create(
        header => [
            To      => $email_to,
            From    => $email_from,
            Subject => $subject,
        ],
        body => $message,
    );

    $email->header_set( 'Content-Type' => 'text/html' );
    $email->header_set( 'charset' => 'UTF-8' );
    sendmail($email, { transport => $transport });
}

my $body = Encode::encode('utf-8', 'test email. Русский текст');
my $subject = Encode::encode('utf-8', 'Hello. Текст');
send_email('user@gmail.com', 'user@gmail.com', $subject, $body);

如何告诉邮件客户端编码是utf-8?

【问题讨论】:

  • 你试过用 utf-8 用 google web 界面发送消息,然后用“bat”打开吗?

标签: perl email encoding smtp


【解决方案1】:

Email::Sender/Net::SMTP字节串

Email::Sender (Net::SMTP) 需要字节(user4035 提到的see answer):

my $msg = $email->as_string();
utf8::encode($msg) if utf8::is_utf8($msg);
sendmail($msg, ...);

电子邮件正文编码

为“原始”utf-8 电子邮件正文设置所有三个 MIME 标头:
(您可以使用text/html 而不是典型的text/plain

$email->header_set( 'MIME-Version' => '1.0' );
$email->header_set( 'Content-Type' => 'text/plain; charset=utf-8' );
$email->header_set( 'Content-Transfer-Encoding' => '8bit');

您的 SMTP 服务器应该接受它并将“原始”(8 位)utf-8 转换为另一种电子邮件编码如有必要。大多数现代电子邮件服务器都这样做。
请参阅 Steffen Ullrich 评论,了解电子邮件提供商 [1&1 (GMX)] 中的显着例外情况。

邮件头编码:

$email->header_raw_set( 'Subject' => Encode::encode('MIME-Header',$subject));

调试过程

创建最小的Email::Simple 消息,在 utf-8 终端上打印 (print $email->as_string();) 并发布结果。

【讨论】:

  • "使用 use utf-8 时,在调用 send_email 之前不需要调用 encode('utf-8',...);" - 必须。请看这个问题:stackoverflow.com/questions/46248458/…
  • 只有在接收 MTA 支持 8BITMIME SMTP 扩展时才应该设置 Content-Transfer-Encoding: 8bit。大多数都可以,但像 1&1 (GMX) 这样的主要邮件提供商却没有。因此,为了兼容,消息应该使用quoted-printable 或 base64 的 Content-Transfer-Encoding 发送。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
相关资源
最近更新 更多