当前位置: 首页 > 知识库问答 >
问题:

Java邮件:设置中文编码

冯霖
2023-03-14

我的代码如下:

    public boolean send() throws TestReportingException, MessagingException
    {
        try
        {

            String encodingOptions = "text/plain; charset=UTF-8";

            Authenticator authenticator = new Authenticator()
            {
                // override the getPasswordAuthentication method
                protected PasswordAuthentication getPasswordAuthentication()
                {
                    return new PasswordAuthentication(username, password);
                }
            };

            // Create the mail session
            Session session = Session.getInstance(maileProperties, authenticator);

            MimeMessage mimeMessage = new MimeMessage(session);
            mimeMessage.setHeader("Content-Type", encodingOptions);

            // Set From: header field of the header.
            mimeMessage.setFrom(new InternetAddress(from, fromName));

            // Set To: header field of the header.
            for (String s : toList)
            {
                if (null == s)
                {
                    throw new TestReportingException("Email address is null");
                }
                mimeMessage.addRecipients(Message.RecipientType.TO, InternetAddress.parse(s));
            }

            for (String s : ccList)
            {
                mimeMessage.addRecipients(Message.RecipientType.CC, InternetAddress.parse(s));
            }

            // Set Subject: header field
            mimeMessage.setSubject(subject,"UTF-8");

            // Create the message part
            //MimeBodyPart messageBodyPart = new MimeBodyPart();
        //    messageBodyPart.setContent(message, encodingOptions);

            // Create the message part
            MimeBodyPart messageBodyPart = new MimeBodyPart();
            mimeMessage.setHeader("Content-Type", encodingOptions);
            // Now set the actual message
            messageBodyPart.setText(message, "utf-8", "plain");

            // Now set the actual message
            //messageBodyPart.setText(message, "utf-8", "html");

            Multipart multipart = new MimeMultipart();

            // Set text message part
            multipart.addBodyPart(messageBodyPart);



            // Part two is attachment
            if (null != attachmentSource)
            {
                messageBodyPart = new MimeBodyPart();

                messageBodyPart.setDataHandler(new DataHandler(attachmentSource));
                messageBodyPart.setFileName(attachmentSource.getName());
                multipart.addBodyPart(messageBodyPart);

            }

            // Send the complete message parts
            mimeMessage.setContent(multipart);


            // Send message
            //Transport.send(mimeMessage);

            SSm.getLogger().debug("Subject: "+mimeMessage.getSubject());




            Transport.send(mimeMessage);

            SSm.getLogger().info("\n\nSent message successfully....");

            clear();

            return true;

        }
        catch (MessagingException mex)
        {
            SSm.getLogger().error(mex.getMessage());
            throw mex;
        }
        catch (Exception e)
        {
            SSm.getLogger().error(e.getMessage(), e);
            throw new TestReportingException(e.getMessage(), e);
        }
    }

属性包括:

  • 主机=smtp.gmail.com
  • mail.smtp.auth=true
  • mail.smtp.starttls.enable=true mail.smtp.host=smtp.gmail.com
  • mail.smtp.port=587 mail.mime.charset=UTF-8

注意:文本在发送之前没有损坏。message.getSubject()打印出来的是干净的中文文本我猜我的编码方式有问题

编辑

以下是调试输出:

debug:setdebug:JavaMail版本1.5.5

debug:getProvider()返回javax.mail.provider[TRANSPORT,smtp,com.sun.mail.smtp.smtptransport,Oracle]

调试SMTP:需要用户名和密码进行身份验证

调试SMTP:useEhlo为true,useAuth为true

调试SMTP:尝试连接到主机“smtp.gmail.com”,端口587,isSSL false

220 smtp.gmail.com ESMTP s20sm18171725pfg.11-gsmtp

调试SMTP:已连接到主机“smtp.gmail.com”,端口:587

>

EHLO Jake-Yoga3.HitronHub.Home

250-smtp.gmail.com为您服务,[96.49.181.179]

250-尺寸35882577

250-8bitmime

250-starttls

250-增强状态代码

250-流水线

250块

250 SMTPUTF8

调试SMTP:找到扩展名“size”,参数“35882577”

调试SMTP:找到扩展“8BitMime”,arg“”

调试SMTP:找到扩展名“starttls”,arg“”

调试SMTP:找到扩展名“EnhancedStatusCodes”,arg“”

调试SMTP:找到扩展“Pipelining”,参数“”

调试SMTP:找到扩展“chunking”,参数“”

调试SMTP:找到扩展名“SMTPUTF8”,参数“”

启动

220 2.0.0准备启动TLS

EHLO Jake-Yoga3.HitronHub.Home

250-smtp.gmail.com为您服务,[96.49.181.179]

250-尺寸35882577

250-8bitmime

250-身份验证登录普通XOAUTH2普通ClientToken OAUTHBEARER XOAUTH

250-增强状态代码

250-流水线

250块

250 SMTPUTF8

调试SMTP:找到扩展名“size”,参数“35882577”

调试SMTP:找到扩展“8BitMime”,arg“”

调试SMTP:找到扩展名“auth”,参数“login PLAIN XOAUTH2 plaine-clienttoken OAUTHBEARER xoauth”

调试SMTP:找到扩展名“EnhancedStatusCodes”,arg“”

调试SMTP:找到扩展“Pipelining”,参数“”

调试SMTP:找到扩展“chunking”,参数“”

调试SMTP:找到扩展名“SMTPUTF8”,参数“”

调试SMTP:尝试使用以下机制进行身份验证:登录普通摘要-MD5 NTLM XOAUTH2

调试SMTP:使用机制登录

DEBUG smtp:AUTH LOGIN命令跟踪已取消

调试SMTP:身份验证登录成功

调试SMTP:use8bit false

邮件来源:

250 2.1.0 OK S20SM18171725PFG.11-gsmtp

RCPT至:

250 2.1.5 OK S20SM18171725PFG.11-gsmtp

调试SMTP:已验证的地址

调试SMTP:jstone@i-koda.com

数据

354继续S20SM18171725PFG.11-gsmtp

来自:iKoda Report

致:jstone@i-koda.com

消息ID:<1926337998.1.1488002481716@jake-yoga3>

主题:=?UTF-8?B?QNZ4Y2IGW6TCUMKTIMOKWRJCRSDDPMK4WQ0GW6TCUMKTIMOKWRJCRQ==?=

MIME-版本:1.0

内容类型:多部分/混合;

   boundary="----=_Part_0_1855484302.1488002481637"

>

-----=_PART_0_1855484302.1488002481637

内容类型:text/plain;Charset=UTF-8

Content-Transfer-Encoding:base64

>

RGVHCIBAEGN2LA0KDQPCDNHJYIDDPMK4WQ0GW6TCUMKTIMOKWRJCRSDDDPMK4WQ0GW6TCUMKTW6TC

UMKTIMOKWRJCRSDDDPMK4WQ0GW6TCUMKTIMOKWRJCRWH0DHBZOI8VD3D3LMKTA29KYS5JB20VZGVS

axzlcnkvzhnmcj91znq9mtaxmjc3mczjptewmti3njtdpmk4wq0gw6tcumktimokwrjcrsddpmk4

WQ0GW6TCUMKT

----=_PART_0_1855484302.1488002481637--

.

250 2.0.0 OK 1488002489 S20SM18171725PFG.11-gsmtp

调试SMTP:邮件已成功传递到邮件服务器

退出

221 2.0.0关闭连接S20SM18171725PFG.11-gsmtp

[信息]“jake.app”com.ikoda.service.utilities.emailout.send(emailout.java:256)01:27:

>

已成功发送消息....

>

共有1个答案

赫连黎昕
2023-03-14

我已经发现了问题所在。问题不在Email类中,只与JavaMail相关。(所以上面的代码是正确的)

问题是在我的控制器中从spring的MessageBundle的一个Hot-ired实例中提取文本。

我错误地使用了下面的代码,以便我的日志记录类能够记录从消息包中提取的字符串。

byte[] barray =messageSource.getMessage(code, null, LocaleContextHolder.getLocale()).getBytes(Charset.forName("UTF-8"));
    String s = new String(barray);

Log4j可以读取主题和消息(由StringBuilder构建)中的字符串,这使我相信这些字符串是正确的UTF-8。但是,javax.mail在传输过程中出现了混乱。

我应该做的是:

messageSource.getMessage(code, null, LocaleContextHolder.getLocale())

现在我的记录器只是得到???,但电子邮件发送得很好。

所以,保持简单愚蠢。

 类似资料:
  • 问题内容: 我有一个定义的编码(utf8)的输入文件,从中我创建了不同的文件,这些文件的名称和内容(再次是utf8)取自该输入文件。 我的问题是一个特定的Windows系统创建的文件没有正确的字符。这些文件的内容可读性很强,但名称却不可读。而是使用文件名。 在其他Windows系统上,一切正常。 可以在的第二个参数中设置文件内容的编码,但是似乎无法设置文件名的编码。 谢谢。 问题答案: 看到两个字

  • 我正在为我的Web应用程序构建一个邮件模块。在我目前的位置上,我正在尝试获取邮件正文并正确解码。但是,当我在邮件中遇到国际字符时,它无法正确解码它们。 例如。我有一个原始的电子邮件正文: 这是解码后的结果: 应该是。我只在处理国际字符时见过这个问题。有人知道如何修复它吗?我在下面包含了我的解码代码。它取自http://www.sitepoint.com/exploring-phps-imap-li

  • 我习惯于用JavaFx编写如下所示的代码,因为这就是我几年前学习的方式。 我最近安装了JetBrains IntelliJ IDEA Ultimate Edition 2018.1.6,我发现要打开primaryStage窗口,我需要一个fxml文件。 我必须这么做, 如果我运行第一个代码片段,什么都不会显示。但是如果我用FXMLLoader.load(getClass(). getResourc

  • 问题内容: 我正在使用此代码通过OpenCSV将波斯语单词添加到csv文件中: 当我在Excel中打开生成的csv文件时,它包含 “ứỶờịỆ” 。其他程序(例如notepad.exe)没有此问题,但是我所有的用户都在使用MS Excel。 与更换OpenCSV SuperCSV不解决这个问题。 当我手动将波斯字符输入到csv文件中时,我没有任何问题。 问题答案: 不幸的是,CSV是一种非常特殊的

  • 问题内容: 我有一个PHP脚本,名为: http://cyber- flick.com/apiMorpho.php?method=getMorphoData&word=kot 以纯文本显示一些数据: 如您所见,在适当的字符位置上有很多“忙碌”。我想做的是以某种方式显示此内容,以便人们在浏览器中看到正确的UTF-8字符。 您可以将其封装在HMTL标签中并以元UTF-8编码进行设置,但是由于将从该脚本

  • 我试图在EditText中设置文本,但它说: 我的代码如下: 不要说用< code>setText,因为我用的是kotlin,不是Java。