2015-12-13 4 views
0

Le fichier new1.txt contient une chaîne UTF-8 envoyée comme objet. Mais l'email reçu montrera la chaîne au format CP1252. Mais si je définis le codage de la console en accédant à Run Config-> Common Tab et en définissant l'encodage de la console sur UTF-8, je peux voir correctement la chaîne UTF dans le courrier électronique reçu. J'utilisant le serveur Google pour ce test:L'objet EMail est défini dans le codage CP1252 même si la chaîne est en UTF-8

ne fonctionne pas: æ- ¥ 本: Nom du partenaire:? Ã, ¢ ã,¹ãƒãƒ © ã,¼ãƒ ã, «æ ªå¼ 会社:

travail: 日本: Nom du partenaire: ア ス ト ラ ゼ ネ カ 株式会社

Mon code: nom d'utilisateur final String = "[email protected]"; final String mot de passe = "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"); 

grâce Madhu

Après les changements de code que j'ai fait dans mon application J2EE. En cela, il ajoute 3 fichiers en pièces jointes. L'un des 3 fichiers est le sujet lui-même. Dans la pièce jointe (Subject.txt) conent est très bien.

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

Merci pour la solution. Cette solution a fonctionné. Mais ceci est mon programme d'essai. Cette solution ne fonctionne pas dans mon application J2EE. Dans cette application, j'utilise sendmail comme serveur de messagerie à Aix et l'application J2EE fonctionne sur WebSPhere Process Server 7.0. –

+0

Pouvez-vous décrire les différences? Vous voudrez peut-être définir props.put ("mail.debug", "true"); et capturer la sortie et éditer votre question - cela contiendra des données de message brutes et le champ d'en-tête codé qui est cassé – Jan

+0

Ceci est le message de débogage: –

Répondre

1

Objet aurait besoin d'être codées en utilisant MimeUtility.encodeText().

Mais comme le fait remarquer Bill Shannon: Ne faites pas cela en l'encodant manuellement, appelez MimeMessage.setSubject(String subject, String charset) à la place. Sinon, setSubject codera en interne la chaîne résultante avec un encodage de plate-forme qui pourrait causer des problèmes.

Encore une chose:

byte[] attachmentData = str1.getBytes(); 

Récupère octets dans plate-forme de codage - qui pourrait ne pas être utf-8. Essayez

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

Declare Message à un MimeMessage puis utilisez la setSubject method that allows you to specify the charset.

+0

qui utilise en interne MimeUtility.encodeText ... donc si l'un ne fonctionne pas, l'autre ne fonctionnera probablement pas aussi bien. – Jan

+0

MimeUtility est là pour les rares cas où JavaMail ne peut ou ne veut pas gérer ces problèmes pour vous. C'est l'un de ces cas où cela est possible. Pourquoi le rendre plus compliqué? Utilisez simplement l'API qui est là pour exactement cette raison. –

+0

En général: Oui, absolument. Dans ce cas: Afin d'expliquer ce qui doit être fait pour le faire fonctionner, le faire manuellement, nous l'espérons, ajouter une compréhension de la façon dont il doit être fait. Je suppose que c'est une question de "réparer" et "pourquoi est-ce que ça casse?" :-) – Jan