在android中显示电子邮件(JavaMail消息)的最佳方式

在android中显示电子邮件(JavaMail消息)的最佳方式,java,android,email,jakarta-mail,Java,Android,Email,Jakarta Mail,我正在构建一个android电子邮件客户端应用程序。我设法在RecylerView中显示电子邮件标题/发件人。接下来,我想启动一个新活动,当用户选择特定邮件时,该活动将显示电子邮件内容/附件 我很难通过意图做到这一点。我能够获取电子邮件的内容(文本、内联图像、附件),但我无法找到一种尽可能接近原始格式的显示方式。我曾想过将文本放在StringBuilder中并通过intent发送以显示文本,但这种方式无法在正确的位置显示内联图像,而且还存在格式问题 对于我应该如何处理这一问题,任何形式的指导都是

我正在构建一个android电子邮件客户端应用程序。我设法在RecylerView中显示电子邮件标题/发件人。接下来,我想启动一个新活动,当用户选择特定邮件时,该活动将显示电子邮件内容/附件

我很难通过意图做到这一点。我能够获取电子邮件的内容(文本、内联图像、附件),但我无法找到一种尽可能接近原始格式的显示方式。我曾想过将文本放在StringBuilder中并通过intent发送以显示文本,但这种方式无法在正确的位置显示内联图像,而且还存在格式问题

对于我应该如何处理这一问题,任何形式的指导都是非常感谢的

类,该类显示可用邮件的列表,并获取特定邮件的内容,以便向其发送另一个用于显示该邮件的活动。我知道代码有点危险,我尝试了很多方法,但还远远没有达到最终形式

public class CheckMail extends Activity {


static List<Message> messages = new ArrayList<>();
String[] sender;
String[] date;
String[] subject;
boolean[] seen;
Context context = null;
ListView listView;
Intent intent;
Store store;
StringBuilder content = new StringBuilder();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_check_mail);
    if (android.os.Build.VERSION.SDK_INT > 9)
    {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }

    context = this;


    ReadEmails task = new ReadEmails();
    task.execute();

}

public void writePart(Part p) throws Exception {
    if (p instanceof Message)
        this.writeEnvelope((Message) p);



    //check if the content is plain text
    if (p.isMimeType("text/plain")) {

      content.append(p.getContent().toString());


    }

    //check if the content has attachment
    else if (p.isMimeType("multipart/*")) {
        System.out.println("This is a Multipart");
        System.out.println("---------------------------");
        Multipart mp = (Multipart) p.getContent();
        int count = mp.getCount();
        for (int i = 0; i < count; i++)
            writePart(mp.getBodyPart(i));
    }

     //check if the content is a nested message
    else if (p.isMimeType("message/rfc822")) {
        System.out.println("This is a Nested Message");
        System.out.println("---------------------------");
        writePart((Part) p.getContent());
    }


    /*
    //check if the content is an inline image
    else if (p.isMimeType("image/jpeg")) {
        System.out.println("--------> image/jpeg");
        Object o = p.getContent();

        InputStream x = (InputStream) o;
        // Construct the required byte array
        System.out.println("x.length = " + x.available());
        while ((i = (int) ((InputStream) x).available()) > 0) {
            int result = (int) (((InputStream) x).read(bArray));
            if (result == -1)
                int i = 0;
            byte[] bArray = new byte[x.available()];

            break;
        }
        FileOutputStream f2 = new FileOutputStream("/tmp/image.jpg");
        f2.write(bArray);
    }
    else if (p.getContentType().contains("image/")) {
        System.out.println("content type" + p.getContentType());
        File f = new File("image" + new Date().getTime() + ".jpg");
        DataOutputStream output = new DataOutputStream(
                new BufferedOutputStream(new FileOutputStream(f)));
        com.sun.mail.util.BASE64DecoderStream test =
                (com.sun.mail.util.BASE64DecoderStream) p
                        .getContent();
        byte[] buffer = new byte[1024];
        int bytesRead;
        while ((bytesRead = test.read(buffer)) != -1) {
            output.write(buffer, 0, bytesRead);
        }
    }
    else {
        Object o = p.getContent();
        if (o instanceof String) {
            System.out.println("This is a string");
            System.out.println("---------------------------");
            System.out.println((String) o);
        }
        else if (o instanceof InputStream) {
            System.out.println("This is just an input stream");
            System.out.println("---------------------------");
            InputStream is = (InputStream) o;
            is = (InputStream) o;
            int c;
            while ((c = is.read()) != -1)
                System.out.write(c);
        }
        else {
            System.out.println("This is an unknown type");
            System.out.println("---------------------------");
            System.out.println(o.toString());
        }
    }

*/

}

public void writeEnvelope(Message m) throws Exception {
    System.out.println("This is the message envelope");
    System.out.println("---------------------------");
    Address[] a;
    StringBuilder sender = new StringBuilder();
    StringBuilder recipients = new StringBuilder();
    String subject = "";

    // FROM
    if ((a = m.getFrom()) != null) {
        for (int j = 0; j < a.length; j++)
            sender.append(a[j].toString());
    }

    // TO
    if ((a = m.getRecipients(Message.RecipientType.TO)) != null) {
        for (int j = 0; j < a.length; j++)
            recipients.append(a[j].toString());
    }

    // SUBJECT
    if (m.getSubject() != null)
        subject = m.getSubject();



    intent.putExtra("Sender", sender.toString());
    intent.putExtra("Recipients", recipients.toString());
    intent.putExtra("Message", subject);
    intent.putExtra("Date", m.getReceivedDate().toString());


}



class ReadEmails extends AsyncTask<String, Void, String> {


    @Override
    protected String doInBackground(String... params) {


        // Create all the needed properties - empty!
        Properties connectionProperties = new Properties();
        // Create the session
        Session session = Session.getDefaultInstance(connectionProperties, null);

        try {
            System.out.print("Connecting to the IMAP server...");
            // Connecting to the server
            // Set the store depending on the parameter flag value
            store = session.getStore("imaps");

            // Set the server depending on the parameter flag value
            String server = "imap.gmail.com";
            store.connect(server, "....@gmail.com", "password");

            System.out.println("done!");

            // Get the Inbox folder
            Folder inbox = store.getFolder("Inbox");

            // Set the mode to the read-only mode
            inbox.open(Folder.READ_ONLY);

            // Get messages
            CheckMail.messages = Arrays.asList(inbox.getMessages());

            System.out.println("Reading messages...");

             sender = new String[messages.size()];
             date = new String[messages.size()];
             subject = new String[messages.size()];
             seen = new boolean[messages.size()];

            for (int i = 0; i < messages.size(); i++) {
                try {
                    Address[] froms = messages.get(i).getFrom();
                    String email = froms == null ? null : ((InternetAddress) froms[0]).getAddress();

                    sender[i] = email;
                    date[i] = messages.get(i).getReceivedDate().toString();
                    subject[i] = messages.get(i).getSubject();


                    Flags flags = messages.get(i).getFlags();
                    Flags.Flag[] sf = flags.getSystemFlags();
                    for (int j = 0; j < sf.length; j++) {
                        if (sf[j] == Flags.Flag.SEEN)
                            seen[i] = true;
                    else
                    seen[i] = false;
                    }


                } catch (MessagingException e) {
                    e.printStackTrace();
                }
            }

            System.out.println("Done reading...");


        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    @Override
    protected void onPostExecute(String result) {

        CustomListAdapter whatever = new CustomListAdapter((Activity) context, sender, date, subject, seen);
        listView = (ListView) findViewById(R.id.listviewID);
        listView.setAdapter(whatever);


        listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position,
                                    long id) {

                try {

                    content.delete(0, content.length());
                    intent = new Intent(context, OpenMail.class);
                    writePart(messages.get(position));
                    intent.putExtra("Content", content.toString());
                    startActivity(intent);

                }
                catch (Exception e)
                {e.printStackTrace();}
            }
        });

    }





}
}
公共类CheckMail扩展活动{
静态列表消息=新建ArrayList();
字符串[]发送方;
字符串[]日期;
字符串[]主题;
布尔[]可见;
Context=null;
列表视图列表视图;
意图;
商店;
StringBuilder内容=新建StringBuilder();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u check\u mail);
如果(android.os.Build.VERSION.SDK_INT>9)
{
StrictMode.ThreadPolicy policy=新建StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(策略);
}
上下文=这个;
ReadEmails任务=新建ReadEmails();
task.execute();
}
public void writePart(第p部分)引发异常{
if(消息的p实例)
this.writedevelope((Message)p);
//检查内容是否为纯文本
if(p.isMimeType(“文本/普通”)){
append(p.getContent().toString());
}
//检查内容是否有附件
else if(p.isMimeType(“multipart/*”){
System.out.println(“这是一个多部分”);
System.out.println(“-------------------------------”;
Multipart mp=(Multipart)p.getContent();
int count=mp.getCount();
for(int i=0;iimage/jpeg”);
对象o=p.getContent();
输入流x=(输入流)o;
//构造所需的字节数组
System.out.println(“x.length=“+x.available());
而((i=(int)((InputStream)x).available())>0){
int结果=(int)((InputStream)x.read(bArray));
如果(结果==-1)
int i=0;
byte[]baray=新字节[x.available()];
打破
}
FileOutputStream f2=新的FileOutputStream(“/tmp/image.jpg”);
f2.写入(bArray);
}
else if(p.getContentType().contains(“image/”)){
System.out.println(“内容类型”+p.getContentType());
文件f=新文件(“图像”+新日期().getTime()+”.jpg”);
DataOutputStream输出=新的DataOutputStream(
新的BufferedOutputStream(新的FileOutputStream(f));
com.sun.mail.util.BASE64DecoderStream测试=
(com.sun.mail.util.BASE64DecoderStream)p
.getContent();
字节[]缓冲区=新字节[1024];
int字节读取;
而((bytesRead=test.read(buffer))!=-1){
输出写入(缓冲区,0,字节读取);
}
}
否则{
对象o=p.getContent();
如果(字符串的o实例){
System.out.println(“这是一个字符串”);
System.out.println(“-------------------------------”;
System.out.println((字符串)o);
}
else if(输入流的o实例){
System.out.println(“这只是一个输入流”);
System.out.println(“-------------------------------”;
InputStream为=(InputStream)o;
is=(输入流)o;
INTC;
而((c=is.read())!=-1)
系统输出写入(c);
}
否则{
System.out.println(“这是未知类型”);
System.out.println(“-------------------------------”;
System.out.println(o.toString());
}
}
*/
}
public void writedevelope(消息m)引发异常{
System.out.println(“这是消息信封”);
System.out.println(“-------------------------------”;
地址[]a;
StringBuilder发送方=新的StringBuilder();
StringBuilder收件人=新建StringBuilder();
字符串主语=”;
//从
如果((a=m.getFrom())!=null){
对于(int j=0;j