2014-01-22 2 views
3

서블릿 클래스를 작성하고 Javamail을 보내기 위해 메일 클래스를 보냈습니다. 영어 메시지는 잘 작동하지만 지금은 중국어도 보내고 싶습니다. MimeMessage의 setSubject 및 setText 메소드에 UTF-8을 추가한다고 가정합니다. 나는 그랬지만 모든 중국어 문자는받은 편지함에서 손상되었습니다.Javamail을 중국어 문자로 어떻게 보냅니 까?

이메일 메시지는 제출 양식의 사용자 입력에서 온 것입니다. (이메일을 보내도록)

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); 
     } 
    } 
} 

메일러 클래스 : 나는 감사

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(); 
     } 
    } 
} 

을 누군가가 나를 도울 수 있다면

여기 내 서블릿이다.

감사합니다.

+0

UTF-8은 주제가 아니며 charset입니다. 제목은 이메일이 무엇이든지해야합니다. HTML을 보내는 경우 content-type 헤더에서 그렇게 말합니다. – EJP

+0

당신이 의미하는 것은 : message.setHeader ("Content-Type", "text/plain; charset = UTF-8"); 제목과 메시지 본문에 모두 중국어가 포함되면 어떻게됩니까? – user3014926

+0

좀 더 구체적으로 알려주세요. – user3014926

답변

1

시작하려면 Java String 객체에 올바른 유니 코드 문자가 포함되어 있는지 확인하십시오. 입력 문자 변환을 제대로하지 않으면 String 객체에 가비지가 생길 수 있습니다. 물론 전자 메일 메시지에 쓰레기가 생길 수 있습니다.

또한 Content-Type 헤더를 명시 적으로 설정할 필요가 없으므로 setText 메서드가이를 처리합니다.

common JavaMail mistakes의이 목록을 읽는 것이 좋습니다.

+0

당신의 대답은 나를 혼란스럽게합니다. 네가 나에게 몇 가지 예를 들려 주시면 고맙습니다. 필자는 일반적인 JavaMail 실수를 읽었지만 문자 변환에 대해서는 언급하지 않았습니다. – user3014926

+0

몇 가지 예를 들어 주시면 감사하겠습니다. – user3014926

+1

Servlet API는 HTTP 연결을 통해 들어오는 바이트를 getParameter 메소드 (예 :)에서 Java String 객체로 반환되는 문자로 변환합니다. 나는 그것이 어떻게하는지 모른다. Servlet 스펙을 읽으십시오. 그러나 문자열의 각 유니 코드 문자의 정수 값을 출력하고 예상 한 값과 비교하거나 getParameter에서 반환 한 문자열과 올바른 값을 가진 상수 문자열을 비교하여 해당 문자가 올바른지 확인할 수 있습니다 . 그러면 입력 변환이 올바르게 수행되었는지 여부를 알 수 있습니다. –

관련 문제