【问题标题】:How to read emails programmatically in android?如何在android中以编程方式阅读电子邮件?
【发布时间】:2017-07-17 15:30:57
【问题描述】:

我正在创建一个应用程序,我想在其中阅读所有电子邮件并希望在列表视图中显示。我一直在寻找,但找不到任何合适的方法。我试过下面的代码:

private static final String[] PROJECTION = new String[] {
ContactsContract.CommonDataKinds.Email.CONTACT_ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Email.DATA
};

ContentResolver cr = getContentResolver();
Cursor cursor = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,         PROJECTION, null, null, null);
if (cursor != null) {
try {
    final int contactIdIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.CONTACT_ID);
    final int displayNameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
    final int emailIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA);
    long contactId;
    String displayName, address;
    while (cursor.moveToNext()) {
        contactId = cursor.getLong(contactIdIndex);
        displayName = cursor.getString(displayNameIndex);
        address = cursor.getString(emailIndex);

    }
} finally {
    cursor.close();
    }
}

但它返回电子邮件地址,如果我想阅读实际的电子邮件怎么办?有什么办法吗? Android API 会公开这个吗?还有一件事,在一个地方我发现下面的方法来获取电子邮件

ContentResolver resolver = getContentResolver();
Uri uriGmail = Uri.parse("content://gmail/");
Cursor cursor = resolver.query(uriGmail, null, null, null, null);

但是游标返回空值。我相信没有办法从 Android 设备读取电子邮件。可能是电子邮件保存在该应用程序(比如说 Gmail 应用程序)的本地存储(数据库)中。我进一步探索了下面链接中提到的 Android 文档,但找不到方法。 https://developer.android.com/reference/android/provider/ContactsContract.CommonDataKinds.Email.html

提前致谢。

【问题讨论】:

  • 找到解决方案了吗?

标签: android email


【解决方案1】:
 Properties props = new Properties();
    //IMAPS protocol
    props.setProperty(“mail.store.protocol”, “imaps”);
    //Set host address
    props.setProperty(“mail.imaps.host”, imaps.gmail.com);
    //Set specified port
    props.setProperty(“mail.imaps.port”, “993″);
    //Using SSL
    props.setProperty(“mail.imaps.socketFactory.class”, “javax.net.ssl.SSLSocketFactory”);
    props.setProperty(“mail.imaps.socketFactory.fallback”, “false”);
    //Setting IMAP session
    Session imapSession = Session.getInstance(props);

Store store = imapSession.getStore(“imaps”);
//Connect to server by sending username and password.
//Example mailServer = imap.gmail.com, username = abc, password = abc
store.connect(mailServer, account.username, account.password);
//Get all mails in Inbox Forlder
inbox = store.getFolder(“Inbox”);
inbox.open(Folder.READ_ONLY);
//Return result to array of message
Message[] result = inbox.getMessages();

【讨论】:

  • 我也已经尝试过了,但是 android studio 无法识别 Session 和 store 之类的类。我的问题是那些在某些特定库中可用还是那些是 android sdk API?
【解决方案2】:

试试这个,

下载mail.jar https://code.google.com/archive/p/javamail-android/downloads

    new MyAsynk().execute();

    public class MyAsynk extends AsyncTask<Void, Void, Void> {

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

            Properties props = new Properties();
            props.setProperty("mail.store.protocol", "imaps");
            try {
                Session session = Session.getInstance(props, null);
                Store store = session.getStore();
                store.connect("imap.gmail.com", "youremail@gmail.com", "password");
                Folder inbox = store.getFolder("INBOX");
                inbox.open(Folder.READ_ONLY);
                javax.mail.Message msg = inbox.getMessage(inbox.getMessageCount());
                javax.mail.Address[] in = msg.getFrom();
                for (javax.mail.Address address : in) {
                    System.out.println("FROM:" + address.toString());
                }
                Multipart mp = (Multipart) msg.getContent();
                BodyPart bp = mp.getBodyPart(0);
                System.out.println("SENT DATE:" + msg.getSentDate());
                System.out.println("SUBJECT:" + msg.getSubject());
                System.out.println("CONTENT:" + bp.getContent());
            } catch (Exception mex) {
                mex.printStackTrace();
            }
            return null;
        }
    }

【讨论】:

  • 获取最新到旧的电子邮件...这怎么可能?
  • 我尝试了这个解决方案,但是 android studio 无法识别 Session 和 Store 等一些类,请您给我一些相关的 cmets
【解决方案3】:
GlobalScope.launch {
        val props = Properties()
        props.setProperty("mail.store.protocol", "imaps")
        try{
            val session = Session.getInstance(props, null)
            val store = session.store
            store.connect("imap.gmail.com", "youremail@gmail.com", "password")
            val inbox = store.getFolder("INBOX")
            inbox.open(Folder.READ_ONLY)
            Log.d("MyLog", inbox.messageCount.toString())
            val msg = inbox.getMessage(inbox.messageCount)
            val address = msg.from
            for (adr in address) {
                Log.d("MyLog", adr.toString())
            }
            val mp = msg.content as Multipart
            val bp = mp.getBodyPart(0)
            Log.d("MyLog", bp.content.toString())
        }catch (e: Exception){
            Log.d("MyLog", "Error $e")
        }
    }
  1. 下载jar文件:additionnal.jar, mail.jar, activation.jar
  2. Add those jars in External Libraries in android studio
  3. 在清单文件中添加互联网权限:

&lt;uses-permission android:name="android.permission.INTERNET" /&gt;

  1. Enable less secure apps to access your Gmail

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 2015-06-04
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多