Java 发送邮件部分乱码

在使用 Java 发送邮件的过程中,有时候会遇到乱码的问题。这篇文章将介绍一些常见的原因和解决方法,以帮助开发者解决邮件乱码的问题。

1. 邮件编码问题

邮件的编码方式有很多种,例如 UTF-8、GBK、ISO-8859-1 等。当邮件的内容、主题或附件使用不同的编码方式时,就容易出现乱码问题。

解决方法之一是在发送邮件时,明确指定邮件的编码方式。下面是一个使用 JavaMail 发送 UTF-8 编码方式的邮件示例:

import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;

public class EmailSender {
    public static void main(String[] args) {
        String to = "recipient@example.com";
        String from = "sender@example.com";
        String subject = "邮件主题";
        String body = "邮件内容";

        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.example.com");
        props.put("mail.smtp.port", "587");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");

        Session session = Session.getDefaultInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("username", "password");
            }
        });

        try {
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
            message.setSubject(subject, "UTF-8");
            message.setText(body, "UTF-8");

            Transport.send(message);
            System.out.println("邮件发送成功。");
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,我们使用 message.setSubject(subject, "UTF-8") 指定了邮件主题的编码方式为 UTF-8,并使用 message.setText(body, "UTF-8") 指定了邮件内容的编码方式为 UTF-8。

2. 邮件标题编码问题

有时候,邮件的标题中包含非 ASCII 字符,这时候也会出现乱码问题。解决这个问题的方法是使用 MimeUtility 类对标题进行编码。

下面是一个使用 MimeUtility 编码邮件标题的示例:

import javax.mail.internet.MimeUtility;

public class EmailSender {
    public static void main(String[] args) {
        String to = "recipient@example.com";
        String from = "sender@example.com";
        String subject = "邮件主题";
        String body = "邮件内容";

        Properties props = new Properties();
        // 配置邮件服务器的属性

        Session session = Session.getDefaultInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("username", "password");
            }
        });

        try {
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
            message.setSubject(MimeUtility.encodeText(subject, "UTF-8", "B"));
            message.setText(body, "UTF-8");

            Transport.send(message);
            System.out.println("邮件发送成功。");
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}

在上述代码中,我们使用 MimeUtility.encodeText(subject, "UTF-8", "B") 对邮件主题进行编码,并指定了编码方式为 UTF-8。

3. 邮件内容编码问题

有时候,邮件的内容中包含非 ASCII 字符,这时候也会出现乱码问题。解决这个问题的方法是使用 MimeUtility 类对内容进行编码。

下面是一个使用 MimeUtility 编码邮件内容的示例:

import javax.mail.internet.MimeUtility;

public class EmailSender {
    public static void main(String[] args) {
        String to = "recipient@example.com";
        String from = "sender@example.com";
        String subject = "邮件主题";
        String body = "邮件内容";

        Properties props = new Properties();
        // 配置邮件服务器的属性

        Session session = Session.getDefaultInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("username", "password");
            }
        });

        try {
            MimeMessage message = new MimeMessage(session);
            message.setFrom