[Appfuse]寄送中文郵件+Gmail完全解決方案

解決得郵件主旨中文的問題,還是遇到了寄件者與郵件內容中文的問題。最後還是決定把Appfuse裡面MailEngine改寫,主要是參考[現成的JavaMail實做],加上Gmail的設定,以及針對郵件本文亂碼的修正。

public void sendMail(String toName,String toEmail, String subject,
String body, String htmlBody)
throws SendFailedException, MessagingException{

//mail server
Properties props = System.getProperties();// 設定 SMTP 伺服器
props.put("mail.smtp.host", this.host );
props.put("mail.smtp.port", this.mail_smtp_port);
if(this.mail_smtp_auth.equals("true")){
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.auth","true");
}
Session session = Session.getDefaultInstance(props, null); // 取得 Session 物件
MimeMessage msg = new MimeMessage(session);
try {
//寄件者
InternetAddress iaFrom = new InternetAddress(this.from_mail);
iaFrom.setPersonal(this.from_name, "big5");
msg.setFrom(iaFrom);

//收件者
InternetAddress isTo = new InternetAddress(toEmail);
isTo.setPersonal(toName, "big5");
msg.addRecipient(Message.RecipientType.BCC, isTo);


msg.setHeader("Subject", MimeUtility.encodeText(subject, "big5", null));

//標頭
msg.setSentDate(new Date());
msg.setHeader("X-Mailer", "CMO-Mailer");
msg.addHeader("Programmer", "Cheng-Wei");
msg.setHeader("Content-Disposition", "inline"); //內文
if (htmlBody != null && !htmlBody.equals("")) {
//html版
MimeBodyPart mbp1 = new MimeBodyPart();
mbp1.setText(body);
MimeBodyPart mbp2 = new MimeBodyPart();
mbp2.setContent(htmlBody, "text/html; charset="big5"");
mbp2.setHeader("Content-Transfer-Encoding", "base64");
Multipart mp = new MimeMultipart("alternative");
mp.addBodyPart(mbp1);
mp.addBodyPart(mbp2);
msg.setContent(mp);
} else {
//純文字版

msg.setText(body,"big5");
}//寄送
if(this.mail_smtp_auth.equals("true")){
Transport transport = session.getTransport("smtp");
transport.connect("smtp.gmail.com", username, password);
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();
}else{
Transport.send(msg);
}

} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

在Appfuse中,寄發Email信件是透過Spring的JavaMailSenderImpl來運作,使用者只要先把Mail Server的參數設定好,輸入信件的標題、內容、收件者,就可以發送郵件。

但是當信件的標題(Subject)有中文時,在Web Mail(Google,MSN都一樣)就會看到類似下面 �K�X���� 的亂碼。檢視郵件原始檔時,又會看到 Subject: =?MS950?B?W0FWSVMtSHViXSCxS71YtKOl3A==?=,MS950雖然也是中文的編碼,但就是無法正確的顯示,可是使用Outlook的郵件軟體收下來時,中文標題卻可以正常的顯示。

Ben在他的文章[現成的JavaMail實做]也有提到這問題,他的解決方法是將Subject的屬性從Email 的Header寫入,並且同時給予編碼。其實如果只是處理主旨的話,重要的就是下面這一行:

msg.setHeader("Subject", MimeUtility.encodeText(subject, "big5", null));

在Appfuse裡面修改serviceMailEngine.java的send()中,在郵件發送前,針對Subject再作一次處理:

msg.setSubject(MimeUtility.encodeText(msg.getSubject(), "big5", null));

所以就是將主旨的字串透過MimeUtility.encodeText()轉換成你要的語系就可以,其他包括純文字與HTML郵件的編碼,可以在那篇文章得到解答。

0 意見: