java 实现发送邮件(带中文附件名称)

java 实现发送邮件(带中文附件名称)

代码如下:

/**
     * 发送带附件的邮件
     *
     * @param session    发件人信息
     * @param from       发件人地址
     * @param subject    邮件标题
     * @param content    邮件内容
     * @param recipients 收件人地址
     */
    public static void sendFileMail(Session session, String from, String recipients, String subject, String content, List<File> attachments) {

        MimeMessage message = new MimeMessage(session);
        try {
            System.getProperties().setProperty("mail.mime.splitlongparameters", "false");

            // 创建多重消息
            Multipart multipart = new MimeMultipart();

            message.setFrom(new InternetAddress(from));
            // 邮件标题
            message.setSubject(subject);
            // 添加邮件正文
            BodyPart contentPart = new MimeBodyPart();
            contentPart.setContent(content, "text/html;charset=UTF-8");
            multipart.addBodyPart(contentPart);

            message.setSentDate(new Date());
            // 创建邮件的接收者地址,并设置到邮件消息中
            Address to = new InternetAddress(recipients);
            // Message.RecipientType.TO属性表示接收者的类型为TO
            message.setRecipient(Message.RecipientType.TO, to);

            // 添加附件的内容
            if (attachments != null) {
                for (int i = 0; i < attachments.size(); i++) {
                    BodyPart attachmentBodyPart = new MimeBodyPart();
                    DataSource source = new FileDataSource(attachments.get(i));
                    attachmentBodyPart.setDataHandler(new DataHandler(source));
                    // MimeUtility.encodeWord可以避免文件名乱码
                    attachmentBodyPart.setFileName(MimeUtility.encodeText(attachments.get(i).getName()));
                    multipart.addBodyPart(attachmentBodyPart);
                }
            }

            // 发送完整消息
            message.setContent(multipart);

            Transport.send(message);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

测试类如下:

注意:中文附件名称有可能出现乱码,以下两行代码可以解决乱码问题。

System.getProperties().setProperty("mail.mime.splitlongparameters", "false");
attachmentBodyPart.setFileName(MimeUtility.encodeText(attachments.get(i).getName()));
经验分享 程序员 微信小程序 职场和发展