Проблема с арабским контентом при чтении писем с использованием javamail API

Я использую Javamail API для чтения писем с сервера Gmail. Я отправляю письмо с арабским содержанием с идентификатора Gmail на другой идентификатор Gmail. Тип кодировки письма - 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;
    }
}

person Timson    schedule 23.02.2012    source источник
comment
Включите код, который выполняет выборку и декодирование, и объясните, как вы отображаете проблемные символы.   -  person Mike Samuel    schedule 23.02.2012
comment
Я использую следующий код для получения содержимого: 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 = новая строка (utf8Bytes, UTF-8);   -  person Timson    schedule 23.02.2012
comment
Что касается отображения содержимого, я сейчас пытаюсь отобразить его в окне браузера, так как сейчас я тестирую свой код. Эта проблема возникает только тогда, когда я отправляю почту с идентификатора Gmail на другой идентификатор Gmail. Когда я отправляю почту из Thunderbird или любого другого почтового клиента на другой идентификатор Gmail, он отлично работает и отображает арабский контент.   -  person Timson    schedule 23.02.2012
comment
Вы говорите, что сталкиваетесь с проблемой только при отправке электронной почты через веб-почту Gmail? Что делать, если вы отправляете электронную почту с помощью Thunderbird через Gmail?   -  person Amir Pashazadeh    schedule 23.02.2012
comment
Да, когда я отправляю почту из Gmail в Gmail, содержимое отображается в виде ??? формат. Набор символов по умолчанию для этого письма - windows-1256. Когда я отправляю почту из другой учетной записи электронной почты с помощью Thunderbird на тот же идентификатор Gmail, содержимое отображается правильно. Набор символов для этого письма - ISO-8859-1.   -  person Timson    schedule 23.02.2012


Ответы (3)


это работает для меня:

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;
       }
person yael alfasi    schedule 23.02.2012
comment
Привет, я попытался выполнить код. Но получение исключения javax.mail.IllegalWriteException: IMAPMessage доступно только для чтения. - person Timson; 24.02.2012
comment
Почтовые сообщения = null; попробуйте {mails = folder.getMessage (i); } catch (MessagingException e1) {e1.printStackTrace (); } попробуйте {mails.setContent (заголовки, текст / простой; кодировка = utf-8); mails.saveChanges (); } catch (исключение e) {System.out.println (e); } - person Timson; 24.02.2012
comment
А для подключения к серверу Gmail public void getgmailConecction () {try {Properties props = System.getProperties (); props.setProperty (кодировка, utf-8); props.setProperty (mail.mime.decodeparameters, истина); props.setProperty (mail.mime.encodeparameters, истина); сеанс = Session.getInstance (реквизиты, ноль); this.setSession (сеанс); SetSessionDebug (сеанс); gmailStore = session.getStore (gmailProtocol); gmailStore.connect (gmailHost, gmailPort, gmailUser, gmailPassword); } catch (Exception Ex) {System.out.println (Ex); }} - person Timson; 24.02.2012
comment
попробуйте использовать вместо этого: MimeMessage message = new MimeMessage (mailSession); - person yael alfasi; 24.02.2012
comment
по-прежнему нет надежды ... Когда я отправляю почту из своей личной почты с помощью клиента thunder Bird в Gmail, она загружается и отображается правильно. Проблема возникает только тогда, когда я отправляю почту с содержанием на арабском языке из Gmail в Gmail. - person Timson; 24.02.2012
comment
Код, который вы разместили, предназначен для отправки почты с помощью Gmail. Но у меня проблема с чтением содержимого почты с помощью Javamail. Этот код отлично подходит для отправки почты. Но я получаю сообщение об ошибке, когда пытаюсь прочитать содержимое с помощью javamail. - person Timson; 24.02.2012
comment
Итак, если вы откроете Gmail, вы увидите электронные письма, хорошо? - person yael alfasi; 24.02.2012
comment
Да ... Когда я получаю доступ к Gmail напрямую, я могу читать сообщения. - person Timson; 27.02.2012
comment
попробуйте это: if (content instanceof Multipart) {Multipart c = ((Multipart) content); BodyPart p = c.getBodyPart (0); messageText = IOUtils.toString (p.getInputStream (), UTF-8); } - person yael alfasi; 28.02.2012
comment
Привет, Яэль ... Все еще не работает ... получаю контент как ???? ????????? ???????? - person Timson; 28.02.2012
comment
код подключения: Properties props = System.getProperties (); props.setProperty (mail.store.protocol, imaps); props.setProperty (кодировка, utf-8); props.setProperty (mail.imap.socketFactory.class, javax.net.ssl.SSLSocketFactory); props.setProperty (mail.imap.socketFactory.fallback, ложь); Сеанс сеанса = Session.getDefaultInstance (props, null); store = session.getStore (изображения); store.connect (imap.gmail.com, пользователь, pw); - person yael alfasi; 28.02.2012
comment
Привет, Яэль, думаю, со свойствами подключения проблем нет. Все остальные письма загружаются правильно, и даже письма на арабском языке, которые я отправляю со своей офисной почты с помощью клиента Thunderbird на тот же идентификатор Gmail для тестирования. Проблема возникает только тогда, когда я отправляю письма из Gmail в Gmail с арабским или любым другим языком, кроме английского. - person Timson; 28.02.2012
comment
@Timson Если у вас есть рабочее решение, которое отличается от приведенного выше ответа, вы должны опубликовать его как новый ответ, а не редактировать его. Если вы просто хотите опубликовать код для обсуждения, отредактируйте свой вопрос. Спасибо и добро пожаловать в SO - person Basic; 28.02.2012
comment
Извини за это. Это не был ответ. Просто попытался обновить код, который я использую в настоящее время и который дает мне ошибку. - person Timson; 28.02.2012
comment
весь код будет очень полезен, при необходимости откройте другой вопрос и оставьте здесь комментарий, чтобы перейти к нему. - person yael alfasi; 28.02.2012
comment
cng к этому IOUtils.toString (p.getInputStream (), UTF-8); у вас есть только p.getInputStream (); - person yael alfasi; 29.02.2012
comment
Да, я пробовал использовать свой код с помощью IOUtils из сообщества. Но у меня это не сработало. Код, который я опубликовал, является моим исходным кодом. - person Timson; 29.02.2012
comment
В моем коде Content + = bodyPart.getContent (). ToString () извлекаю содержимое почты и сохраняю его в строке. Этот код отлично работает, если содержимое письма на английском языке. Если контент на некоторых других языках, например арабском, и если он отправляется с одного идентификатора Gmail на другой идентификатор Gmail, этот код не работает. Если я отправляю письмо со своей служебной электронной почты с помощью клиента Thunder Bird на тот же идентификатор Gmail, этот код работает нормально. - person Timson; 29.02.2012
comment
Когда я использую IOUtils вместо bodyPart.getContent (). ToString (), я получаю то же содержимое, что и ??? формат. - person Timson; 01.03.2012

вы можете использовать что-то связанное с этим:

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

Это не лучшее решение, но оно работает.

С уважением, Педро Соуза

person pedrocgsousa    schedule 11.07.2012

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

вам нужно добавить эту строку для арабского языка.

person Anchal Ajay    schedule 15.09.2020