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

时间:2012-02-23 05:55:18

标签: java javamail

我正在使用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;
    }
}

3 个答案:

答案 0 :(得分:1)

这对我有用:

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

答案 1 :(得分:0)

你可以使用这样的东西:

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

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

此致 佩德罗索萨

答案 2 :(得分:0)

message.setContent(content +“”,“ text / html; charset = utf-8”);

您需要添加此行以阿拉伯语。