使用jmail方式在服务器上发送邮件正文乱码

声明:先说我遇到的问题。。

1.下图是我,在服务器上发送邮件的乱码内容,中文都是问号!乱码。

2.在本地发邮件正常,在服务器上乱码(服务器:windows英文系统)!

  

3.先上核心代码

    try{
            // 发件人的 邮箱 和 密码(替换为自己的邮箱和密码)
            String myEmailAccount = "xxxxxx@163.com";
            String myEmailPassword = "xxxxxxxxZQGTBT";// 授权码

            // 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般格式为: smtp.xxx.com
            // 网易163邮箱的 SMTP 服务器地址为: smtp.163.com
            String myEmailSMTPHost = "smtp.163.com";

            // 收件人邮箱(替换为自己知道的有效邮箱)
            String receiveMailAccount = "xxxxxxxxx@qq.com";
            // 1. 创建参数配置, 用于连接邮件服务器的参数配置
            Properties props = new Properties();                    // 参数配置
            props.put("mail.transport.protocol", "smtp");   // 使用的协议(JavaMail规范要求)
            props.put("mail.smtp.host", myEmailSMTPHost);   // 发件人的邮箱的 SMTP 服务器地址
            props.put("mail.smtp.auth", "true"); // 需要验证用户名密码
            props.put("mail.smtp.port", 25);

            javax.mail.Session session;
            Authentication authentication = new Authentication(myEmailAccount, myEmailPassword);
            session = Session.getDefaultInstance(props, authentication);
            session.setDebug(true);
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress(myEmailAccount));
        // 添加收件人邮箱 msg.setRecipients(Message.RecipientType.TO,receiveMailAccount);
      //邮件标题
            msg.setSubject("工单提示", "UTF-8");
            msg.setContent("<h1>你好</h1>", "text/html;charset=UTF-8");
            Transport.send(msg);
        }catch (MessagingException mex){
            mex.printStackTrace();
        }

4.以上代码,发送邮件是没有问题的,但是在服务器上发送的内容是乱码!

5.以上只能满足文本性质的邮件,如果想要插入图片和附件,需要MimeBodyPart(一个mime消息),MimeMultipart(由一个或多个mime组成而成)两个类,如有不懂JavaMail API文档。

           MimeBodyPart  body = new MimeBodyPart();
              MimeMultipart mp = new MimeMultipart();
              msg.setSubject("工单提示", "UTF-8");
              body.setContent("<h1>你好</h1>", "text/html;charset=GB2312");
              // 指定使用base64编码
              body.setHeader("Content-Transfer-Encoding", "base64");
              mp.addBodyPart(body);
              msg.setContent(mp);
              Transport.send(msg);

6.报错:javax.activation.UnsupportedDataTypeExcep tion: no object DCH for MIME type multipart/related;在开头补充以下代码就ok了!

        MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
            mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
            mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
            mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
            mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
            mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
            CommandMap.setDefaultCommandMap(mc);
            Thread.currentThread().setContextClassLoader(getClass().getClassLoader());

 所以综上所述:合并代码即可。

try{
MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
CommandMap.setDefaultCommandMap(mc);
Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); 
// 发件人的 邮箱 和 密码(替换为自己的邮箱和密码)
String myEmailAccount = "xxxxxx@163.com";
String myEmailPassword = "xxxxxxxxZQGTBT";// 授权码

// 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般格式为: smtp.xxx.com
// 网易163邮箱的 SMTP 服务器地址为: smtp.163.com
String myEmailSMTPHost = "smtp.163.com";

// 收件人邮箱(替换为自己知道的有效邮箱)
String receiveMailAccount = "xxxxxxxxx@qq.com";
// 1. 创建参数配置, 用于连接邮件服务器的参数配置
Properties props = new Properties(); // 参数配置
props.put("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)
props.put("mail.smtp.host", myEmailSMTPHost); // 发件人的邮箱的 SMTP 服务器地址
props.put("mail.smtp.auth", "true"); // 需要验证用户名密码
props.put("mail.smtp.port", 25);

javax.mail.Session session;
Authentication authentication = new Authentication(myEmailAccount, myEmailPassword);
session = Session.getDefaultInstance(props, authentication);
session.setDebug(true);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(myEmailAccount));
        // 添加收件人邮箱
msg.setRecipients(Message.RecipientType.TO,receiveMailAccount); 
        MimeBodyPart body = new MimeBodyPart();
MimeMultipart mp = new MimeMultipart();
msg.setSubject("工单提示", "UTF-8");
body.setContent("<h1>你好</h1>", "text/html;charset=GB2312");
// 指定使用base64编码
body.setHeader("Content-Transfer-Encoding", "base64");
mp.addBodyPart(body);
msg.setContent(mp);
Transport.send(msg);
}catch (MessagingException mex){
mex.printStackTrace();

 

原文地址:https://www.cnblogs.com/www-yang-com/p/14745209.html