2015-12-13 9 views
0

Файл new1.txt содержит строку UTF-8, которая отправляется как тема. Но полученное письмо покажет строку в формате CP1252. Но если я установил консольную кодировку, выбрав «Запустить Config-> Common Tab» и настройте консольную кодировку как UTF-8, я могу увидеть строку UTF правильно в полученном письме. Я с помощью сервера Google для этого теста:Тема EMail устанавливается в кодировке CP1252, хотя строка находится в UTF-8

Не работает: AE- ¥ 本: Имя партнера:? Ã, ¢ ã,¹ãƒãƒ © ã,¼ãƒ ã, «æ ªå¼ 会社:

Рабочая: 日本: Партнер Имя: ア ス ト ラ ゼ ネ カ 株式会社

Мой код: окончательное строка имя пользователя = "[email protected]"; final String password = "xxxxxx";

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

    Session session = Session.getInstance(props, 
     new javax.mail.Authenticator() { 
      protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication(username,password); 
      } 
     }); 

    try { 
     File fileDir = new File("c:\\new1.txt"); 

     BufferedReader in = new BufferedReader(
      new InputStreamReader(
         new FileInputStream(fileDir), "UTF-8")); 

     String str; 
     String str1 =""; 

     while ((str = in.readLine()) != null) { 
      str1 += str; 
     } 

     Message message = new MimeMessage(session); 
     MimeMultipart mp = new MimeMultipart(); 
     message.setFrom(new InternetAddress("[email protected]")); 
     message.setRecipients(Message.RecipientType.TO, 
      InternetAddress.parse("[email protected]")); 
     message.setSubject(str1); 
     MimeBodyPart body = new MimeBodyPart(); 
     body.setContent("This is a Test EMail. Please ignore", "text/html"); 
     body.setDisposition(MimeBodyPart.INLINE); 
     mp.addBodyPart(body); 
     byte[] attachmentData = str1.getBytes(); 
     DataHandler dh = new DataHandler(new ByteArrayDataSource(attachmentData,"application/octet-stream")); 
     MimeBodyPart attachment = new MimeBodyPart(); 
     attachment.setDataHandler(dh); 
     attachment.setDisposition(MimeBodyPart.ATTACHMENT); 
     attachment.setFileName("new1.txt"); 
     mp.addBodyPart(attachment); 

     message.setContent(mp); 
     Transport.send(message); 

     System.out.println("Done"); 

благодаря Мадху

Ниже приведены изменения кода, которые я сделал в моем J2EE приложение. В этом добавляется 3 файла в виде вложений. Одним из трех файлов является сам предмет. В прикрепленном (Subject.txt) согласии отлично.

MimeMessage message = new MimeMessage(s); 

    .... 

    message.setSubject(subject,"UTF-8");// MimeUtility.encodeText(subject,"UTF-8", "B")); 

    ... 

      MimeBodyPart body = new MimeBodyPart(); 
      body.setContent(sm.getMailBody(), "text/html; charset=UTF-8"); 
      body.setDisposition(MimeBodyPart.INLINE); 
      mp.addBodyPart(body); 

The debug message. I could not add it as text

+0

Спасибо за решение. Это решение сработало. Но это моя тестовая программа. Это решение не работает в моем приложении J2EE. В этом приложении я использую sendmail, поскольку почтовый сервер в приложении Aix и J2EE запущен на WebPhere Process Server 7.0. –

+0

Можете ли вы описать различия? Возможно, вам понадобится так настроить props.put («mail.debug», «true»); и захватить вывод и отредактировать ваш вопрос - это будет содержать необработанные данные сообщения и поле закодированного заголовка, которое сломано – Jan

+0

Это сообщение об отладке: –

ответ

1

Тема должны быть закодированы с использованием MimeUtility.encodeText().

Но, поскольку Билл Шеннон указал: Не делайте этого, закодировав его вручную, вместо этого вызовите MimeMessage.setSubject(String subject, String charset). В противном случае setSubject будет внутренне кодировать результирующую строку с кодировкой платформы, что может вызвать проблемы. более

одно:

byte[] attachmentData = str1.getBytes(); 

Извлекает байты в кодировке платформы - которая не может быть UTF-8. Попробуйте

byte[] attachmentData = str1.getBytes(Charset.forName("utf-8")); 
0

Declare сообщение быть MimeMessage, а затем использовать setSubject method that allows you to specify the charset.

+0

, который внутренне использует MimeUtility.encodeText ... поэтому, если он не работает, другой, скорее всего, не будет работать. – Jan

+0

MimeUtility существует для редких случаев, когда JavaMail не может или не будет обрабатывать эти проблемы для вас. Это один из тех случаев, когда он может. Почему это усложняется? Просто используйте API, который существует именно по этой причине. –

+0

В общем: Да, абсолютно. В этом случае: Чтобы объяснить, что нужно сделать, чтобы заставить его работать, сделать это вручную, мы надеемся, добавим понимание того, как это нужно делать. Я думаю, это вопрос «просто исправить» и «почему он ломается»? :-) – Jan