2014-07-24 2 views
0

유로 기호 대신 첨부 파일에 다음 코드가있는 메일을 보내면이 "â,¬;"과 같은 이상한 문자가 나타납니다. 나는 OutputStreamWriter뿐만 아니라 이미 UTF-8로 메시지의 내용 유형을 설정했다. 이것에 대한 이유는 무엇일까요?자바 메일 첨부물에 이상한 유로화 기호

public static void sendMail(String email, String password, String sendTo, String subject, String msg) 
    { 
     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"); 

     final String fEMail = email; 
     final String fPassword = password; 

     Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() 
     { 
     protected PasswordAuthentication getPasswordAuthentication() 
     { 
      return new PasswordAuthentication(fEMail, fPassword); 
     } 
     }); 

     try 
     { 
     Message message = new MimeMessage(session); 
     message.setFrom(new InternetAddress(email)); 
     message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("to mail address")); 
     message.setSubject(subject); 
     message.setContent("Hi", "text/plain; charset=UTF-8"); 


     File file = File.createTempFile("test", ".csv"); 
     FileOutputStream fileOutputStream = new FileOutputStream(file); 
     OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, Charset.forName("UTF-8").newEncoder()); 
     PrintWriter writer = new PrintWriter(outputStreamWriter); 
     writer.println("\u20ac;"); 
     writer.println("€"); 
     writer.flush(); 

     MimeMultipart rootMultipart = new MimeMultipart("mixed"); 
     MimeBodyPart bodyPart = new MimeBodyPart(); 
     bodyPart.setDisposition(Part.ATTACHMENT); 
     bodyPart.setDataHandler(new DataHandler(new FileDataSource(file))); 
     bodyPart.setFileName(file.getName()); 
     rootMultipart.addBodyPart(bodyPart); 
     message.setContent(rootMultipart); 

     Transport.send(message); 

     writer.close(); 
     file.delete(); 
     System.out.println("Message sent successfully!"); 

     } 
     catch (MessagingException e) 
     { 
     throw new RuntimeException(e); 
     } 
     catch (IOException e) 
     { 
     e.printStackTrace(); 
     } 
    } 

답변

0

먼저 모두 common mistakes을 수정하십시오.

첫 번째 message.setContent 호출은 두 번째 message.setContent 호출에 의해 재정의되었으므로 아무 작업도 수행하지 않습니다. 첨부 파일이있는 메시지를 만들려면 Multipart에 기본 메시지 본문의 본문 부분과 첨부 파일의 본문 부분이 있어야합니다.

두 번째 writer.println 호출을 제거합니다.

파일을 첨부 할 때 데이터에 잘못된 문자 집합을 선택하는 것이 가장 큰 문제입니다. 시스템 속성 "mail.mime.charset"을 "utf-8"로 설정하십시오.

+0

여전히 작동하지 않습니다. – eatSleepCode

+0

Transport.send를 호출하기 바로 전에 message.writeTo (new FileOutputStream ("msg.txt"));를 추가하십시오. 그런 다음 msg.txt에 텍스트 부분에 적절한 문자 세트가 있는지 확인하십시오. 메시지를보기 위해 어떤 프로그램을 사용하고 있습니까? –

+0

MS는 CSV로 탁월합니다. – eatSleepCode