Java mail 傳送郵件 主題(標題)亂碼
阿新 • • 發佈:2018-12-04
最近開發遇到Javamail 傳送郵件標題亂碼問題,騰訊、網易郵箱不會亂碼,阿里郵箱 標題則會亂碼。解決辦法:
String subject = MimeUtility.encodeWord(mailEntity.getMailSubject(), "UTF-8", "Q");
message.setSubject(subject);
傳送郵件程式碼:
/** * 傳送郵件 可以帶附件 內容可為HTML * * @param mailEntity * @return *@throws GeneralSecurityException */ public static boolean sendMail(MailEntity mailEntity) throws GeneralSecurityException { // 發件人電子郵箱 final String from = mailEntity.getMailFromAddress(); // 發件人電子郵箱密碼 final String pass = mailEntity.getMailFromPwd();// 指定傳送郵件的主機為 smtp.qq.com String host = mailEntity.getMailFromHost(); // 郵件伺服器 String port = mailEntity.getPort(); // 獲取系統屬性 Properties properties = System.getProperties(); // 設定郵件伺服器 properties.setProperty("mail.smtp.host", host); properties.setProperty("mail.smtp.port",port); properties.put("mail.smtp.auth", "true"); MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); properties.put("mail.smtp.ssl.enable", "false"); properties.put("mail.smtp.ssl.socketFactory", sf); // 獲取預設session物件 Session session = Session.getDefaultInstance(properties, new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { // qq郵箱伺服器賬戶、第三方登入授權碼 return new PasswordAuthentication(from, pass); // 發件人郵件使用者名稱、密碼 } }); try { // 建立預設的 MimeMessage 物件 MimeMessage message = new MimeMessage(session); // Set From: 頭部頭欄位 message.setFrom(new InternetAddress(from)); // Set To: 頭部頭欄位 message.addRecipient(Message.RecipientType.TO, new InternetAddress(mailEntity.getMailReceiverAddress())); // Set Subject: 主題文字 String subject = MimeUtility.encodeWord(mailEntity.getMailSubject(), "UTF-8", "Q"); message.setSubject(subject); // 建立訊息部分 BodyPart messageBodyPart = new MimeBodyPart(); // 訊息 // messageBodyPart.setText(mailEntity.getMailContent()); messageBodyPart.setContent(mailEntity.getMailContent(), "text/html;charset=utf-8"); // 建立多重訊息 Multipart multipart = new MimeMultipart(); // 設定文字訊息部分 multipart.addBodyPart(messageBodyPart); if (mailEntity.getFilePaths() != null && mailEntity.getFilePaths().size() > 0) { for (String filePath : mailEntity.getFilePaths()) { // 附件部分 messageBodyPart = new MimeBodyPart(); String suffix = ""; String oldPath = ""; if (filePath.indexOf(".") >0){ suffix = filePath.substring(filePath.indexOf(".")+1); oldPath = filePath.substring(0,filePath.indexOf(".")); DataSource source = new FileDataSource(oldPath); File file = ((FileDataSource) source).getFile(); file.renameTo(new File(oldPath + "." + suffix)); source = new FileDataSource(filePath); messageBodyPart.setDataHandler(new DataHandler(source)); }else { // 設定要傳送附件的檔案路徑 DataSource source = new FileDataSource(filePath); messageBodyPart.setDataHandler(new DataHandler(source)); } // 設定要傳送附件的檔案路徑 // messageBodyPart.setFileName(filename); // 處理附件名稱中文(附帶檔案路徑)亂碼問題 messageBodyPart.setFileName(MimeUtility.encodeText(filePath)); multipart.addBodyPart(messageBodyPart); } } // 傳送完整訊息 message.setContent(multipart); // 傳送訊息 Transport.send(message); logger.info("Sent mail successfully...."); return true; } catch (MessagingException e) { logger.debug(e.getMessage()); } catch (UnsupportedEncodingException e) { logger.debug(e.getMessage()); } return false; }
實體:
/** * @Auther: mxf * @Date: 2018/10/31 16:08 * @Description:傳送郵件實體類 */ public class MailEntity implements Serializable { /** * 郵件接收地址 */ private String mailReceiverAddress; /** * 郵件主題 */ private String mailSubject; /** * 郵件內容 */ private String mailContent; /** * 附件路徑 */ private List<String> filePaths = new ArrayList<String>(); /** * 傳送地址 */ private String mailFromAddress; /** * 傳送者的郵件密碼 */ private String mailFromPwd; /** * 指定傳送郵件的主機 */ private String mailFromHost; /** * 傳送郵件主機埠 */ private String port; public String getPort() { return port; } public void setPort(String port) { this.port = port; } public String getMailReceiverAddress() { return mailReceiverAddress; } public void setMailReceiverAddress(String mailReceiverAddress) { this.mailReceiverAddress = mailReceiverAddress; } public String getMailSubject() { return mailSubject; } public void setMailSubject(String mailSubject) { this.mailSubject = mailSubject; } public String getMailContent() { return mailContent; } public void setMailContent(String mailContent) { this.mailContent = mailContent; } public List<String> getFilePaths() { return filePaths; } public void setFilePaths(List<String> filePaths) { this.filePaths = filePaths; } public String getMailFromAddress() { return mailFromAddress; } public void setMailFromAddress(String mailFromAddress) { this.mailFromAddress = mailFromAddress; } public String getMailFromPwd() { return mailFromPwd; } public void setMailFromPwd(String mailFromPwd) { this.mailFromPwd = mailFromPwd; } public String getMailFromHost() { return mailFromHost; } public void setMailFromHost(String mailFromHost) { this.mailFromHost = mailFromHost; } }