Reputation: 1099
I have written servlet class and send mail class to send Javamail. The English message works fine, but now I want to send Chinese as well. I suppose you add UTF-8 in MimeMessage's setSubject and setText methods. I did that but all chinese characters were corrupted in my inbox.
Email message comes from user input in submit form.
Here is my servlet:
package com.lsp.web;
import com.lsp.service.Mailer;
import org.springframework.beans.factory.annotation.Autowired;
import javax.mail.MessagingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "contact", urlPatterns = {"/contact"})
public class ContactServlet extends SpringInjectedServlet {
@Autowired
private Mailer mailer;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("contact.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String customerEmail = req.getParameter("email");
String subject = req.getParameter("subject");
String body = req.getParameter("message");
String name = req.getParameter("name");
body = "YOU HAVE A MESSAGE FROM " + name + "<" + customerEmail +">.\n" + body;
String error = null;
String succMess = null;
try {
javax.mail.internet.InternetAddress ia = new javax.mail.internet.InternetAddress(customerEmail);
ia.validate();
mailer.send(customerEmail, subject, body);
succMess = "你的消息已成功发送";
req.setAttribute("succMessage", succMess);
req.getRequestDispatcher("sent.jsp").forward(req, resp);
} catch (javax.mail.internet.AddressException ae) {
error = "您指出的邮箱地址不存在";
req.setAttribute("errorMessage", error);
req.getRequestDispatcher("contact.jsp").forward(req, resp);
}
catch (MessagingException mex) {
error = "发送失败";
req.setAttribute("errorMessage", error);
req.getRequestDispatcher("contact.jsp").forward(req, resp);
}
}
}
Mailer class(to send email):
package com.lsp.service;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
@Component
public class Mailer {
private static final Logger log = Logger.getLogger(Mailer.class);
public Mailer() {
log.info("I'm newed.");
}
public void send(String custMail, String subject, String body) {
String from = "[email protected]";
String to = "[email protected]";
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");
//body = "YOU HAVE A MESSEGE FROM " + custMail + "." + body;
Session session = Session.getDefaultInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("[email protected]","SOMEPASSWORD");//change accordingly
}
});
try{
// Create a default MimeMessage object.
MimeMessage message = new MimeMessage(session);
// Set From: header field of the header.
message.setFrom(new InternetAddress(from));
// Set To: header field of the header.
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setHeader("Content-Type", "text/plain; charset=UTF-8");
// Set Subject: header field
message.setSubject(subject, "UTF-8");
// Send the actual HTML message, as big as you like
message.setText(body, "UTF-8");
// Send message
Transport.send(message);
System.out.println("Sent message successfully....");
}catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
I appreciate if someone could help me out.
Thank you.
Upvotes: 4
Views: 2818
Reputation: 29961
To start, make sure your Java String objects contain the correct Unicode characters. If you don't do the input character conversion correctly, you can end up with garbage in the String objects, which of course means garbage in the email message.
Also, you don't need to set the Content-Type header explicitly, the setText method will do that for you.
You might also want to read this list of common JavaMail mistakes.
Upvotes: 1