Macos 使用JavaMail读取gmail问题

Macos 使用JavaMail读取gmail问题,macos,jakarta-mail,pop3,Macos,Jakarta Mail,Pop3,我在使用javamail阅读来自gmail(pop3)的邮件时遇到问题。如果邮件是从ubuntu的Thunderbird发送的,我有一个代码可以很好地工作。然而,如果邮件最初是从mac发送的,它就会失败 这是我使用的代码: private static final String UNKNOWN_BRAND_PATH = "UNKNOWN"; public static final String FOLDER_NAME = "INBOX"; private static Logger L

我在使用javamail阅读来自gmail(pop3)的邮件时遇到问题。如果邮件是从ubuntu的Thunderbird发送的,我有一个代码可以很好地工作。然而,如果邮件最初是从mac发送的,它就会失败

这是我使用的代码:

    private static final String UNKNOWN_BRAND_PATH = "UNKNOWN";
public static final String FOLDER_NAME = "INBOX";

private static Logger LOG = org.slf4j.LoggerFactory.getLogger(LzMailRecieverService.class);

@Value("${lz.mail.address}")
private String lzMailUserName;

@Value("${lz.mail.password}")
private String lzMailPassword;

@Value("${lz.mail.tmp.folder}")
private String lzMailTmpFolder;

public Store connect() throws Exception {

    String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

    Properties pop3Props = new Properties();

    pop3Props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
    pop3Props.setProperty("mail.pop3.socketFactory.fallback", "false");
    pop3Props.setProperty("mail.pop3.port", "995");
    pop3Props.setProperty("mail.pop3.socketFactory.port", "995");

    URLName url = new URLName("pop3", "pop.gmail.com", 995, "", lzMailUserName, lzMailPassword);

    Session session = Session.getInstance(pop3Props, null);
    Store store = new POP3SSLStore(session, url);
    store.connect();
    return store;
}

public Folder openFolder(Store store) throws MessagingException {
    Folder folder = store.getDefaultFolder();
    folder = folder.getFolder(FOLDER_NAME);
    folder.open(Folder.READ_ONLY);
    return folder;
}

public List<MailDetails> readAttachement(Folder folder) throws IOException, MessagingException {
    Message[] messages = folder.getMessages();
    List<MailDetails> mailDetails = new ArrayList<MailDetails>();
    for (Message message : messages) {
        logMailDetails(message);
        if (message.getContent() instanceof Multipart) {
            Multipart multipart = (Multipart) message.getContent();
            for (int i = 0; i < multipart.getCount(); i++) {
                BodyPart bodyPart = multipart.getBodyPart(i);
                if (!Part.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition())) {

                    continue; // dealing with attachments only
                }
                InputStream is = bodyPart.getInputStream();
                String uid = getUid(message);
                String to = getTo(message);
                String from = getFrom(message);
                File d = new File(lzMailTmpFolder + File.separator + uid);
                if (d.exists() == false) {
                    d.mkdir();
                }
                File f = new File(d, new DateTime().getMillis() + "-" + bodyPart.getFileName());
                FileOutputStream fos = new FileOutputStream(f);
                IOUtils.copy(is, fos);
                MailDetails md = new MailDetails(to, from, f, uid);
                mailDetails.add(md);
            }
        }
        else {
            LOG.warn("Message conteant is not Multipart " + message.getContentType() + " skipping ...");
        }
    }
    return mailDetails;
}

private String getFrom(Message message) throws MessagingException {
    Address[] froms = message.getFrom();
    return froms[0].toString();
}

private String getTo(Message message) throws MessagingException {
    Address[] tos = message.getAllRecipients();
    return tos[0].toString();
}

public void logMailDetails(Message m) throws MessagingException {
    Address[] f = m.getFrom();
    if (f != null) {
        for (int j = 0; j < f.length; j++)
            LOG.debug("FROM: " + f[j].toString());
    }

    Address[] r = m.getRecipients(Message.RecipientType.TO);
    if (r != null) {
        for (int j = 0; j < r.length; j++) {
            LOG.debug("TO: " + r[j].toString());
        }
    }
    LOG.debug("SUBJECT: " + m.getSubject());
    Date d = m.getSentDate();
    LOG.debug("SendDate: " + d);
}

private String getUid(Message m) throws MessagingException {
    try {
        Address[] tos = m.getAllRecipients();
        String to = tos[0].toString();
        to = to.split("@")[0];
        String[] parts = to.split("\\+");
        return parts[parts.length - 1];
    }
    catch (Exception e) {
        LOG.error("Failes to extract brand hash from email address " + Lists.newArrayList(m.getFrom()));
        return UNKNOWN_BRAND_PATH;
    }
}
private static final String UNKNOWN\u BRAND\u PATH=“UNKNOWN”;
公共静态最终字符串文件夹\u NAME=“收件箱”;
私有静态记录器LOG=org.slf4j.LoggerFactory.getLogger(lzmailReceiveService.class);
@值(${lz.mail.address}”)
私有字符串lzMailUserName;
@值(${lz.mail.password}”)
私有字符串lzMailPassword;
@值(${lz.mail.tmp.folder}”)
私有字符串lzMailTmpFolder;
公用存储连接()引发异常{
字符串SSL_FACTORY=“javax.net.SSL.SSLSocketFactory”;
Properties pop3Props=新属性();
pop3Props.setProperty(“mail.pop3.socketFactory.class”,SSL_工厂);
pop3Props.setProperty(“mail.pop3.socketFactory.fallback”、“false”);
pop3Props.setProperty(“mail.pop3.port”,“995”);
pop3Props.setProperty(“mail.pop3.socketFactory.port”,“995”);
URLName url=新的URLName(“pop3”,“pop.gmail.com”,995,”,lzMailUserName,lzMailPassword);
Session Session=Session.getInstance(pop3Props,null);
Store Store=新的POP3SSLSStore(会话,url);
store.connect();
退货店;
}
公用文件夹openFolder(存储存储)引发MessaginException{
Folder Folder=store.getDefaultFolder();
folder=folder.getFolder(文件夹名称);
文件夹。打开(文件夹。只读);
返回文件夹;
}
公用列表readAttachement(文件夹)引发IOException、MessaginException{
Message[]messages=folder.getMessages();
List mailDetails=新建ArrayList();
用于(消息:消息){
日志邮件详细信息(消息);
if(message.getContent()多部分实例){
Multipart Multipart=(Multipart)message.getContent();
对于(int i=0;i
问题在于,对于最初在mac bodyPart中创建的邮件,getDisposition()始终返回null。无论我尝试了什么,我都无法理解哪部分是附件部分(这是我真正需要的:从邮件中提取附件)

我在网上到处寻找,想知道原因是什么,但我没有找到答案。我如何发现以下由Juergen Hoeller撰写的说明,表明此处可能存在问题(更多详细信息:)

关于多部分邮件的警告:仅包含HTML文本但没有内联元素或附件的简单MIME邮件将或多或少适用于任何能够呈现HTML的电子邮件客户端。然而,内联元素和附件仍然是电子邮件客户端之间的一个主要兼容性问题:要使内联元素和附件在Microsoft Outlook、Lotus Notes和Mac Mail中工作几乎是不可能的。考虑为您的需要选择一个特定的多部分模式:JavaDoc 多部分_模式常量包含更详细的信息

如果邮件是从Mac发送的,有没有关于使用JavaMail的例子或解释

Yosi

这个“性情”充其量只是一个暗示;不需要包括在内

以下JavaMail常见问题解答条目可能会有所帮助: