代码之家  ›  专栏  ›  技术社区  ›  user4035

客户端程序中的电子邮件文本默认编码不正确

  •  1
  • user4035  · 技术社区  · 8 年前

    我正在尝试发送一封电子邮件,其中包含utf-8编码的俄语文本和主题。电子邮件正在接收中,当我在gmail的网络界面打开它时,一切都是正确的。但是,当我在“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);
    

    1 回复  |  直到 8 年前
        1
  •  1
  •   AnFi onet.eu    8 年前

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

    电子邮件::发件人 网络::SMTP )需要字节( see answer 提及人 user4035 ):

    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

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

    调试过程

    创建最小值 Email::Simple ( print $email->as_string();