
package com.lucifer.rnmail;

import android.util.Log;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.WritableNativeArray;
import com.facebook.react.bridge.WritableNativeMap;
import com.sun.mail.imap.IMAPFolder;
import com.sun.mail.imap.IMAPStore;

import java.io.File;
import java.io.IOException;

import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;

import java.lang.reflect.Array;
import java.security.Security;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.mail.*;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;


public class RNLuciferImapModule extends ReactContextBaseJavaModule {

    private final ReactApplicationContext reactContext;

    public RNLuciferImapModule(ReactApplicationContext reactContext) {
        super(reactContext);
        this.reactContext = reactContext;
    }

    @Override
    public boolean canOverrideExistingModule() {
        return true;
    }

    @Override
    public String getName() {
        return "RNLuciferMail";
    }


    @ReactMethod
    void testLogin(ReadableMap args, final Promise promise) {
        final String _imapserver = args.getString("imapserver");
        final String _usermail = args.getString("usermail");
        final String _password = args.getString("password");

        new Thread(new Runnable() {
            @Override
            public void run() {
                final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
// 获取默认会话
                Properties prop = System.getProperties();
                prop.put("mail.imap.host", _imapserver);
                prop.setProperty("mail.imap.ssl.enable", "true");
                prop.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
                prop.put("mail.imap.auth.plain.disable", "true");
                Session mailsession = Session.getInstance(prop, null);
                mailsession.setDebug(false); //是否启用debug模式
                IMAPStore store = null;
                try {
                    store = (IMAPStore) mailsession.getStore("imaps");  // 使用imap会话机制，连接服务器
                    store.connect(_imapserver, _usermail, _password);
                    promise.resolve(200);       //授权成功
                } catch (AuthenticationFailedException e) {
                    e.printStackTrace();
                    promise.resolve(1);       // 授权失败
                } catch (MessagingException e) {
                    e.printStackTrace();
                    promise.resolve(2);         //其他错误
                } catch (Exception e) {
                    e.printStackTrace();
                    promise.resolve(3);         //未知错误
                } finally {
                    try {
                        if (store != null)
                            store.close();
                    } catch (Exception bs) {
                        bs.printStackTrace();
                    }
                }
            }
        }).start();
    }

    /*
     * imap 读取邮件，暂时不用设置port
     * */

    @ReactMethod
    public void getEMailUids(ReadableMap args, final Promise promise) {
        final String _server = args.getString("imapserver");
        final String _usermail = args.getString("usermail");
        final String _password = args.getString("password");
        final String _folderName = args.hasKey("folderName") ? args.getString("folderName") : "Inbox";
        final int _pageNo = args.hasKey("pageNo") ? args.getInt("pageNo") : 1;
        final int _pagesize = args.hasKey("pagesize") ? args.getInt("pagesize") : 20;
        final boolean _endMode = args.hasKey("toEndMode") ? args.getBoolean("toEndMode") : false;

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    String imapserver = _server; // 邮件服务器
                    String user = _usermail;
                    String pwd = _password;
                    String folderName = _folderName;
                    int pagesize = _pagesize;
                    int pageNo = _pageNo;
                    Boolean getToEnd = _endMode;

                    final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";// 获取默认会话
                    Properties prop = System.getProperties();
                    prop.put("mail.imap.host", imapserver);
                    prop.setProperty("mail.imap.ssl.enable", "true");
                    prop.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
                    prop.put("mail.imap.auth.plain.disable", "true");
                    Session mailsession = Session.getInstance(prop, null);
                    mailsession.setDebug(false); //是否启用debug模式
                    IMAPFolder folder = null;
                    IMAPStore store = null;
                    int total = 0;
                    try {
//                        MailClient mailClient = MailClient.getInstance();
//                        mailClient.setMailAccount(_usermail);
//                        mailClient.setPassword(_password);
//                        mailClient.setImapserver(_server);
//                        IMAPStore store = mailClient.getConnectedStore();
                        store = (IMAPStore) mailsession.getStore("imaps");  // 使用imap会话机制，连接服务器
                        store.connect(imapserver, user, pwd);
                        folder = (IMAPFolder) store.getFolder(folderName); //收件箱
                        if (!folder.isOpen()) {
                            folder.open(Folder.READ_WRITE);
                        }

                        //获取总邮件数
                        total = folder.getMessageCount();

                        int startIndex, endIndex;       //获取邮件的起止序号 从1开始,

                        int counts = pagesize * pageNo;

                        if (pageNo > 1) {
                            startIndex = total - (pageNo) * pagesize + 1;
                            endIndex = total - (pageNo - 1) * pagesize;
                            if (endIndex <= 0) {
                                endIndex += pagesize;
                            }
                        } else {
                            //第一次取 total-pagesize +1 ---- total
                            if ((total - counts) > 0) {
                                startIndex = total - pageNo * pagesize + 1;
                                endIndex = total;
                            } else {
                                startIndex = 1;
                                endIndex = total;
                            }
                        }

                        startIndex = (startIndex <= 0) ? 1 : startIndex;

                        if (getToEnd) {
                            endIndex = total;
                        }

                        Message[] messages = folder.getMessages(startIndex, total);

                        WritableArray mailsArray = new WritableNativeArray();
                        if (messages.length > 0) {
                            //倒叙
                            WritableMap mailMap = new WritableNativeMap();
                            for (int i = messages.length - 1; i >= 0; i--) {
                                try {
                                    mailsArray.pushInt((int) folder.getUID((MimeMessage) messages[i]));
                                } catch (Exception e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                            }
                            mailMap.putArray("uids", mailsArray);
                            mailMap.putString("mailAccount", _usermail);
                            promise.resolve(mailMap);
                        }else {
                            promise.resolve(false);       // 获取失败
                        }
                    } catch (MessagingException ex) {
                        promise.resolve(false);       // 获取失败
                        ex.printStackTrace();
                    } finally {
                        try {
                            if (folder != null)
                                folder.close(true); //退出收件箱时,删除做了删除标识的邮件
                            if (store != null)
                                store.close();
                        } catch (Exception bs) {
                            bs.printStackTrace();
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    promise.reject("INIT_EMAIL_ACCOUNT_FAIL", e);
                }
            }
        }).

                start();
    }

    @ReactMethod
    public void getEMails(ReadableMap args, final Promise promise) {
        final String _server = args.getString("imapserver");
        final String _usermail = args.getString("usermail");
        final String _password = args.getString("password");
        final String _folderName = args.hasKey("folderName") ? args.getString("folderName") : "Inbox";
        final int _pageNo = args.hasKey("pageNo") ? args.getInt("pageNo") : 1;
        final int _pagesize = args.hasKey("pagesize") ? args.getInt("pagesize") : 20;
        final boolean _endMode = args.hasKey("toEndMode") ? args.getBoolean("toEndMode") : false;

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    String imapserver = _server; // 邮件服务器
                    String user = _usermail;
                    String pwd = _password;
                    String folderName = _folderName;
                    int pagesize = _pagesize;
                    int pageNo = _pageNo;
                    Boolean getToEnd = _endMode;

                    final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";// 获取默认会话
                    Properties prop = System.getProperties();
                    prop.put("mail.imap.host", imapserver);
                    prop.setProperty("mail.imap.ssl.enable", "true");
                    prop.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
                    prop.put("mail.imap.auth.plain.disable", "true");
                    Session mailsession = Session.getInstance(prop, null);
                    mailsession.setDebug(false); //是否启用debug模式
                    IMAPFolder folder = null;
                    IMAPStore store = null;
                    int total = 0;
                    try {

//                        MailClient mailClient = MailClient.getInstance();
//                        mailClient.setMailAccount(_usermail);
//                        mailClient.setPassword(_password);
//                        mailClient.setImapserver(_server);
//                        IMAPStore store = mailClient.getConnectedStore();


                        store = (IMAPStore) mailsession.getStore("imaps");  // 使用imap会话机制，连接服务器
                        store.connect(imapserver, user, pwd);
                        folder = (IMAPFolder) store.getFolder(folderName); //收件箱

                        // 使用只读方式打开收件箱
                        if (!folder.isOpen()) {
                            folder.open(Folder.READ_WRITE);
                        }
                        //获取总邮件数
                        total = folder.getMessageCount();

                        int startIndex, endIndex;       //获取邮件的起止序号 从1开始,

                        int counts = pagesize * pageNo;

                        if (pageNo > 1) {
                            startIndex = total - (pageNo) * pagesize + 1;
                            endIndex = total - (pageNo - 1) * pagesize;
                            if (endIndex <= 0) {
                                endIndex += pagesize;
                            }
                        } else {
                            //第一次取 total-pagesize +1 ---- total
                            if ((total - counts) > 0) {
                                startIndex = total - pageNo * pagesize + 1;
                                endIndex = total;
                            } else {
                                startIndex = 1;
                                endIndex = total;
                            }
                        }

                        startIndex = (startIndex <= 0) ? 1 : startIndex;

                        if (getToEnd) {
                            endIndex = total;
                        }
//
//                        System.out.print(startIndex);
//                        System.out.print(endIndex);
//
//
//                        System.out.println("-----------------您的邮箱共有邮件：" + total + " 封--------------");
                        // 得到收件箱文件夹信息，获取邮件列表

                        Message[] messages = folder.getMessages(startIndex, endIndex);

                        WritableArray mailsArray = new WritableNativeArray();

                        if (messages.length > 0) {
                            Map<String, Object> map;
                            ReciveOneMail pmm = null;
                            for (int i = messages.length - 1; i >= 0; i--) {
                                System.out.println("======================");
                                pmm = new ReciveOneMail((MimeMessage) messages[i]);
                                System.out.println("Message " + i + " subject: "
                                        + pmm.getSubject());
                                try {
//                                    System.out.println("Message " + i + " sentdate: "
//                                            + pmm.getSentDate());
//                                    System.out.println("Message " + i + " replysign: "
//                                            + pmm.getReplySign());
                                    boolean isRead;// 用来判断该邮件是否为已读
                                    Flags flags = messages[i].getFlags();
                                    if (flags.contains(Flags.Flag.SEEN)) {
                                        System.out.println("这是一封已读邮件");
                                        isRead = true;
                                    } else {
                                        System.out.println("未读邮件");
                                        isRead = false;
                                    }

                                    pmm.getMailContent((Part) messages[i]);
//                                    pmm.getAttachMent((Part) messages[i]);

                                    WritableMap mailMap = new WritableNativeMap();
                                    mailMap.putBoolean("hasRead", isRead);
                                    WritableArray attacharray = pmm.getAttachArray();
                                    if (attacharray.size() > 0) {
                                        mailMap.putBoolean("hasAttach", true);
                                    } else {
                                        mailMap.putBoolean("hasAttach", false);
                                    }
                                    mailMap.putArray("attachs", attacharray);
//                                    mailMap.putBoolean("hasAttach", pmm.isContainAttach((Part) messages[i]));
                                    mailMap.putString("from", pmm.getFrom());
//                                    mailMap.putString("messageId", pmm.getMessageId());
                                    mailMap.putInt("uid", (int) folder.getUID((MimeMessage) messages[i]));
                                    mailMap.putString("mailAccount", _usermail);                //标记邮箱从属，判断邮件来自哪个邮箱
                                    mailMap.putString("to", pmm.getMailAddress("to"));
                                    mailMap.putString("cc", pmm.getMailAddress("cc"));
                                    mailMap.putString("bcc", pmm.getMailAddress("bcc"));
                                    mailMap.putString("fromaddress", pmm.getFromAddress());
                                    mailMap.putString("toaddr", pmm.getOnlyMailAddress("to"));
                                    mailMap.putString("ccaddr", pmm.getOnlyMailAddress("cc"));
                                    mailMap.putString("bccaddr", pmm.getOnlyMailAddress("bcc"));
                                    mailMap.putString("subject", pmm.getSubject());
                                    mailMap.putString("time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(messages[i].getSentDate()));
                                    mailMap.putInt("totalcount", total);
                                    mailMap.putInt("messageNumber", messages[i].getMessageNumber());
                                    mailMap.putArray("content", pmm.getBodyArray());

//                                    System.out.print(mailMap);

                                    mailsArray.pushMap(mailMap);


                                } catch (Exception e) {
                                    // TODO Auto-generated catch block
                                    System.out.println("--！");
                                    e.printStackTrace();
                                }
                            }

//                            System.out.println(mailsArray);
//
//                            System.out.println("\t未读邮件数：" + folder.getUnreadMessageCount());
//                            System.out.println("\t新邮件数：" + folder.getNewMessageCount());
//                            System.out.println("----------------End------------------");
//                            promise.resolve(mailsArray);
                        }
                        promise.resolve(mailsArray);
                    } catch (MessagingException ex) {
                        promise.resolve(false);       // 获取失败
                        ex.printStackTrace();
                    } finally {
                        // 释放资源
                        try {
                            if (folder != null)
                                folder.close(true); //退出收件箱时,删除做了删除标识的邮件
                            if (store != null)
                                store.close();
                        } catch (Exception bs) {
                            bs.printStackTrace();
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    promise.reject("INIT_EMAIL_ACCOUNT_FAIL", e);
                }
            }
        }).

                start();
    }

//    @ReactMethod
//    public void getEMailsWithUidsStore(ReadableMap args, final Promise promise) {
//        final String _server = args.getString("imapserver");
//        final String _usermail = args.getString("usermail");
//        final String _password = args.getString("password");
//        final ReadableArray _uids = args.getArray("uids");
//        final String _folderName = args.hasKey("folderName") ? args.getString("folderName") : "Inbox";
//
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
////                try {
////                    String imapserver = _server; // 邮件服务器
////                    String user = _usermail;
////                    String pwd = _password;
//                String folderName = _folderName;
////
////
////                    final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";// 获取默认会话
////                    Properties prop = System.getProperties();
////                    prop.put("mail.imap.host", imapserver);
////                    prop.setProperty("mail.imap.ssl.enable", "true");
////                    prop.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
////                    prop.put("mail.imap.auth.plain.disable", "true");
////                    Session mailsession = Session.getInstance(prop, null);
////                    mailsession.setDebug(false); //是否启用debug模式
//                IMAPFolder folder = null;
////                    IMAPStore store = null;
//                int total = 0;
//
//                long[] uids = new long[_uids.size()];
//                for (int i = 0; i < _uids.size(); i++) {
//                    uids[i] = (long) _uids.getInt(i);
//                }
//
//                try {
//                    MailClient mailClient = MailClient.getInstance();
//                    mailClient.setMailAccount(_usermail);
//                    mailClient.setPassword(_password);
//                    mailClient.setImapserver(_server);
//                    IMAPStore store = mailClient.getConnectedStore();
////                        store = (IMAPStore) mailsession.getStore("imaps");  // 使用imap会话机制，连接服务器
////                        store.connect(imapserver, user, pwd);
//                    folder = (IMAPFolder) store.getFolder(folderName); //收件箱
//
//                    // 使用只读方式打开收件箱
//                    folder.open(Folder.READ_WRITE);
//                    //获取总邮件数
//                    total = folder.getMessageCount();
//
//                    Message[] messages = folder.getMessagesByUID(uids);
//
//                    WritableArray mailsArray = new WritableNativeArray();
//
//                    if (messages.length > 0) {
//                        Map<String, Object> map;
//                        ReciveOneMail pmm = null;
//                        for (int i = messages.length - 1; i >= 0; i--) {
//                            pmm = new ReciveOneMail((MimeMessage) messages[i]);
//                            try {
//                                boolean isRead;// 用来判断该邮件是否为已读
//                                Flags flags = messages[i].getFlags();
//                                if (flags.contains(Flags.Flag.SEEN)) {
//                                    isRead = true;
//                                } else {
//                                    isRead = false;
//                                }
//
//                                pmm.getMailContent((Part) messages[i]);
//
//                                WritableMap mailMap = new WritableNativeMap();
//                                mailMap.putBoolean("hasRead", isRead);
//                                WritableArray attacharray = pmm.getAttachArray();
//                                if (attacharray.size() > 0) {
//                                    mailMap.putBoolean("hasAttach", true);
//                                } else {
//                                    mailMap.putBoolean("hasAttach", false);
//                                }
//                                mailMap.putArray("attachs", attacharray);
//                                mailMap.putString("from", pmm.getFrom());
//                                mailMap.putInt("uid", (int) folder.getUID((MimeMessage) messages[i]));
//                                mailMap.putString("to", pmm.getMailAddress("to"));
//                                mailMap.putString("cc", pmm.getMailAddress("cc"));
//                                mailMap.putString("bcc", pmm.getMailAddress("bcc"));
//                                mailMap.putString("fromaddress", pmm.getFromAddress());
//                                mailMap.putString("toaddr", pmm.getOnlyMailAddress("to"));
//                                mailMap.putString("ccaddr", pmm.getOnlyMailAddress("cc"));
//                                mailMap.putString("bccaddr", pmm.getOnlyMailAddress("bcc"));
//                                mailMap.putString("subject", pmm.getSubject());
//                                mailMap.putString("time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(messages[i].getSentDate()));
//                                mailMap.putInt("totalcount", total);
//                                mailMap.putInt("messageNumber", messages[i].getMessageNumber());
//                                mailMap.putArray("content", pmm.getBodyArray());
//
//                                mailsArray.pushMap(mailMap);
//
//
//                            } catch (Exception e) {
//                                // TODO Auto-generated catch block
//                                System.out.println("--！");
//                                e.printStackTrace();
//                            }
//                        }
//                        promise.resolve(mailsArray);
//                    }
//                } catch (MessagingException ex) {
//                    try {
//                        if (folder != null)
//                            folder.close(true); //退出收件箱时,删除做了删除标识的邮件
//                    } catch (Exception bs) {
//                        bs.printStackTrace();
//                    }
//                    ex.printStackTrace();
//                } finally {
//                    // 释放资源
//                    try {
//                        if (folder != null)
//                            folder.close(true); //退出收件箱时,删除做了删除标识的邮件
////                            if (store != null)
////                                store.close();
//                    } catch (Exception bs) {
//                        bs.printStackTrace();
//                    }
//                }
////                } catch (Exception e) {
////                    e.printStackTrace();
////                    promise.reject("INIT_EMAIL_ACCOUNT_FAIL", e);
////                }
//            }
//        }).
//
//                start();
//    }

    @ReactMethod
    public void getEMailsWithUids(ReadableMap args, final Promise promise) {
        final String _server = args.getString("imapserver");
        final String _usermail = args.getString("usermail");
        final String _password = args.getString("password");
        final ReadableArray _uids = args.getArray("uids");
        final String _folderName = args.hasKey("folderName") ? args.getString("folderName") : "Inbox";

        new Thread(new Runnable() {
            @Override
            public void run() {
//                try {
                String imapserver = _server; // 邮件服务器
                String user = _usermail;
                String pwd = _password;
                String folderName = _folderName;
//
//
                final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";// 获取默认会话
                Properties prop = System.getProperties();
                prop.put("mail.imap.host", imapserver);
                prop.setProperty("mail.imap.ssl.enable", "true");
                prop.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
                prop.put("mail.imap.auth.plain.disable", "true");
                Session mailsession = Session.getInstance(prop, null);
                mailsession.setDebug(false); //是否启用debug模式
                IMAPFolder folder = null;
                IMAPStore store = null;
                int total = 0;

                long[] uids = new long[_uids.size()];
                for (int i = 0; i < _uids.size(); i++) {
                    uids[i] = (long) _uids.getInt(i);
                }

                try {
//                    MailClient mailClient = MailClient.getInstance();
//                    mailClient.setMailAccount(_usermail);
//                    mailClient.setPassword(_password);
//                    mailClient.setImapserver(_server);
//                    IMAPStore store = mailClient.getConnectedStore();
                    store = (IMAPStore) mailsession.getStore("imaps");  // 使用imap会话机制，连接服务器
                    store.connect(imapserver, user, pwd);
                    folder = (IMAPFolder) store.getFolder(folderName); //收件箱

                    // 使用只读方式打开收件箱
                    if (!folder.isOpen()) {
                        folder.open(Folder.READ_WRITE);
                    }
                    //获取总邮件数
                    total = folder.getMessageCount();

                    Message[] messages = folder.getMessagesByUID(uids);

                    WritableArray mailsArray = new WritableNativeArray();

                    if (messages.length > 0) {
                        Map<String, Object> map;
                        ReciveOneMail pmm = null;
                        for (int i = messages.length - 1; i >= 0; i--) {
                            pmm = new ReciveOneMail((MimeMessage) messages[i]);
                            try {
                                boolean isRead;// 用来判断该邮件是否为已读
                                Flags flags = messages[i].getFlags();
                                if (flags.contains(Flags.Flag.SEEN)) {
                                    isRead = true;
                                } else {
                                    isRead = false;
                                }

                                pmm.getMailContent((Part) messages[i]);

                                WritableMap mailMap = new WritableNativeMap();
                                mailMap.putBoolean("hasRead", isRead);
                                WritableArray attacharray = pmm.getAttachArray();
                                if (attacharray.size() > 0) {
                                    mailMap.putBoolean("hasAttach", true);
                                } else {
                                    mailMap.putBoolean("hasAttach", false);
                                }
                                mailMap.putArray("attachs", attacharray);
                                mailMap.putString("from", pmm.getFrom());
                                mailMap.putString("mailAccount", _usermail);                //标记邮箱从属，判断邮件来自哪个邮箱
                                mailMap.putInt("uid", (int) folder.getUID((MimeMessage) messages[i]));
                                mailMap.putString("to", pmm.getMailAddress("to"));
                                mailMap.putString("cc", pmm.getMailAddress("cc"));
                                mailMap.putString("bcc", pmm.getMailAddress("bcc"));
                                mailMap.putString("fromaddress", pmm.getFromAddress());
                                mailMap.putString("toaddr", pmm.getOnlyMailAddress("to"));
                                mailMap.putString("ccaddr", pmm.getOnlyMailAddress("cc"));
                                mailMap.putString("bccaddr", pmm.getOnlyMailAddress("bcc"));
                                mailMap.putString("subject", pmm.getSubject());
                                mailMap.putString("time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(messages[i].getSentDate()));
                                mailMap.putInt("totalcount", total);
                                mailMap.putInt("messageNumber", messages[i].getMessageNumber());
                                mailMap.putArray("content", pmm.getBodyArray());

                                mailsArray.pushMap(mailMap);


                            } catch (Exception e) {
                                // TODO Auto-generated catch block
                                System.out.println("--！");
                                e.printStackTrace();
                            }
                        }
                    }
                    promise.resolve(mailsArray);
                } catch (MessagingException ex) {
                    promise.resolve(false);       // 获取失败
                    ex.printStackTrace();
                } finally {
                    // 释放资源
                    try {
                        if (folder != null)
                            folder.close(true); //退出收件箱时,删除做了删除标识的邮件
                        if (store != null)
                            store.close();
                    } catch (Exception bs) {
                        bs.printStackTrace();
                    }
                }
            }
        }).

                start();
    }

    @ReactMethod
    public void SendMail(ReadableMap args, final Promise promise) {

        final String _brand = args.getString("imapserver");
        final String _usermail = args.getString("usermail");
        final String _password = args.getString("password");
        final String _port = args.hasKey("port") ? args.getString("port") : "587";
        final String _subject = args.hasKey("subject") ? args.getString("subject") : "";
        final String _content = args.hasKey("content") ? args.getString("content") : "";
        final String _toAddr = args.hasKey("toaddr") ? args.getString("toaddr") : "";
        final String _ccAddr = args.hasKey("ccaddr") ? args.getString("ccaddr") : "";

        try {


            Properties props = System.getProperties();
            props.setProperty("mail.smtp.host", _brand);
            props.setProperty("mail.smtp.port", _port);
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.starttls.enable", "true");
//            props.setProperty("mail.transport.protocol", "smtps");

//qq 邮箱发送
//            Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
//            final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
//            Properties props = System.getProperties();
//            props.setProperty("mail.smtp.host", _brand);
//            props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);
//            props.setProperty("mail.smtp.socketFactory.fallback", "false");
//            props.setProperty("mail.smtp.port", _port);
//            props.setProperty("mail.smtp.socketFactory.port", _port);
//            props.put("mail.smtp.auth", "true");
//            props.put("mail.smtp.starttls.enable", "true");

            final String username = _usermail;
            final String password = _password;

            Session session = Session.getInstance(props, new Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username, password);
                }
            });
            session.setDebug(true);
            Date sentdate = new Date();
            // -- Create a new message --
            Message msg = new MimeMessage(session);
            // -- Set the FROM and TO fields --
            msg.setFrom(new InternetAddress(username));
            msg.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse(_toAddr, false));
            msg.setRecipients(Message.RecipientType.CC,
                    InternetAddress.parse(_ccAddr, false));
            msg.setSubject(_subject);
            msg.setText(_content);
            msg.setSentDate(sentdate);

            MailClient mailClient = MailClient.getInstance();
            mailClient.setMailAccount(_usermail);
            mailClient.setPassword(_password);
            mailClient.setImapserver("imap-mail.outlook.com");
            IMAPStore store = mailClient.getConnectedStore();
            IMAPFolder folder = (IMAPFolder) store.getFolder("Sent"); //收件箱
            int total = folder.getMessageCount();

            ReciveOneMail pmm = new ReciveOneMail((MimeMessage) msg);

            WritableArray mailsArray = new WritableNativeArray();
            WritableMap mailMap = new WritableNativeMap();
            mailMap.putString("from", pmm.getFrom());
            mailMap.putString("mailAccount", _usermail);                //标记邮箱从属，判断邮件来自哪个邮箱
            mailMap.putInt("uid", (int) folder.getUIDNext());

            mailMap.putString("to", pmm.getMailAddress("to"));
            mailMap.putString("cc", pmm.getMailAddress("cc"));
            mailMap.putString("bcc", pmm.getMailAddress("bcc"));
            mailMap.putString("fromaddress", pmm.getFromAddress());
            mailMap.putString("toaddr", pmm.getOnlyMailAddress("to"));
            mailMap.putString("ccaddr", pmm.getOnlyMailAddress("cc"));
            mailMap.putString("bccaddr", pmm.getOnlyMailAddress("bcc"));
            mailMap.putString("subject", pmm.getSubject());
            mailMap.putInt("totalcount", total);
            mailMap.putString("time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(sentdate));
            WritableArray bodyarray = new WritableNativeArray();
            WritableNativeMap contentmap = new WritableNativeMap();
            contentmap.putString("type", "text");
            contentmap.putString("content", _content);
            bodyarray.pushMap(contentmap);
            mailMap.putArray("content", bodyarray);


//            mailMap.putInt("uid",(int) folder.getUIDNext());

//            mailsArray.pushInt((int) folder.getUIDNext());
//            mailMap.putArray("uids", mailsArray);
//            mailMap.putString("mailAccount", _usermail);
            Transport.send(msg);

            // 发送成功之后 想法子获取uid

//            promise.resolve(mailMap);
            mailsArray.pushMap(mailMap);
            promise.resolve(mailsArray);
        } catch (Exception e) {
            promise.resolve(false);
            e.printStackTrace();
        }
    }

}
