使用javamail API阅读邮件时的阿拉伯语内容问题

我正在使用Javamail API从Gmail服务器读取邮件。 我正在发送一封包含gmail id阿拉伯语内容的邮件到另一个Gmail ID。 邮件的Charset编码类型是windows-1256。 当我使用Javamail下载邮件时,我收到的内容是“??????” 格式而不是阿拉伯字符。 我将下载的内容转换为UTF-8格式,但仍未获得正确的显示。

提前致谢,

蒂姆

更新:
我使用以下代码来获取内容:

Object content = message.getContent(); if (message.isMimeType("text/html") || message.isMimeType("text/plain")) { Al = (String) content; } 

下载内容后,以下代码用于UTF-8编码:

 byte[] utf8Bytes = s.getBytes("UTF-8"); s = new String(utf8Bytes, "UTF-8"); 

更新:我目前用于阅读邮件内容的完整代码

 String gmailMultipartMailDownload(Multipart multipart, String Uids) throws SocketException, UnsupportedDataTypeException, UnsupportedEncodingException { String Content = new String(""); try { int numParts = multipart.getCount(); for (int k = 0; k < numParts; k++) { BodyPart bodyPart = multipart.getBodyPart(k); Object tmp = null; try { tmp = bodyPart.getContent(); } catch (UnsupportedDataTypeException UEE) { try { InputStream is = bodyPart.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line = null; while ((line = br.readLine()) != null) { sb.append(line + "\n"); } br.close(); return sb.toString(); } catch (IOException e) { e.printStackTrace(); } catch (MessagingException e) { e.printStackTrace(); } } catch (UnsupportedEncodingException UEE) { UEE.printStackTrace(); try { InputStream is = bodyPart.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line = null; while ((line = br.readLine()) != null) { sb.append(line + "\n"); } br.close(); return sb.toString(); } catch (IOException e) { e.printStackTrace(); } catch (MessagingException e) { e.printStackTrace(); } } String disposition = bodyPart.getDisposition(); if (tmp instanceof InputStream) { try{ if( super.Downloadfiles(bodyPart, hashCode, attnumcount,this.getgmailattachmentfolder())) { //Download Attachments } }catch (FileNotFoundException err) { return Content; } catch(IOException fex){ fex.printStackTrace(); return Content; } } else if (disposition != null && (disposition.equals(BodyPart.ATTACHMENT) || disposition.equals(BodyPart.INLINE) || disposition.equals("ATTACHMENT"))) { try{ if( super.Downloadfiles(bodyPart, hashCode, attnumcount,this.getgmailattachmentfolder())) { //Download Attachments } }catch (FileNotFoundException err) { System.out.println(err.getMessage()); return Content; } catch(IOException fex){ fex.printStackTrace(); return Content;} } else if (bodyPart.isMimeType("multipart/*")) { Multipart mp = (Multipart) bodyPart.getContent(); Content += gmailMultipartMailDownload(mp, Uids); } else if (bodyPart.isMimeType("text/html")) { Content += bodyPart.getContent().toString(); } } } catch (Exception Ex) { System.out.println("Content object error is "+Ex); return Content; } finally { return Content; } } 

这对我有用:

 public boolean sendEmail(String sender, String recipient, String subject, String body) { try { // set properties of mail server Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); Properties props = new Properties(); props.setProperty("mail.transport.protocol", "smtp"); props.setProperty("mail.host", "smtp.gmail.com"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.port", "465"); props.setProperty("charset","utf-8"); props.put("mail.smtp.socketFactory.port", "465"); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.socketFactory.fallback", "false"); props.setProperty("mail.smtp.quitwait", "false"); // connect to mail server javax.mail.Session session = javax.mail.Session.getDefaultInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(gmailUser,gmailPassword); } }); // create email MimeMessage message = new MimeMessage(session); message.setSender(new InternetAddress(sender)); message.setSubject(subject, "UTF-8"); message.setContent(body, "text/plain; charset=utf-8"); message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipient)); // send email Transport.send(message); return true; } catch (Exception e) { System.out.println("Exception thown "+e.getMessage()); return false; } 

你可以使用这个东西:

 protected static String readContent(Part part) throws IOException, MessagingException { return new String(part.getContent().toString().getBytes(), readCharset(part.getContentType())); } /** * Read charset from ContentType of javax.mail.internet.Part (MimePart, BodyPart, etc). * eg: "text/plain; charset=iso-8859-1" * The result: Charset ISO-8859-1 * * @param contentType content-type like "text/plain; charset=iso-8859-1" * @return Charset */ protected static Charset readCharset(String contentType) { Charset charset = Charset.defaultCharset(); if (StringUtils.hasText(contentType)) { String[] _split = contentType.split("charset="); if (_split != null && _split.length == 2) { String _c = _split[1]; try { charset = Charset.forName(_c); } catch (Exception ex) { log.error("Invalid content-type charset: " + contentType); } } } return charset; } 

这不是最好的解决方案,但它确实有效。

此致,Pedro Sousa