2

将邮件会话 (javax.mail.Session) 存储在单例中是一种好习惯吗?我和我的团队决定在 Singleton 类的静态变量中保留一个邮件会话。

因此,在私有构造函数中,我们这样做:

try {
        Properties props = new Properties();

        props.put("mail.transport.protocol", config.getMailTransportProtocol());
        props.put("mail.smtp.starttls.enable", config.getMailStarttlsEnable());
        props.put("mail.smtp.host", config.getMailHost());
        props.put("mail.smtp.auth", config.getMailAuth());
        props.put("mail.smtp.user", config.getMailFrom());
        props.put("mail.debug", config.getMailDebug());
        props.put("mail.smtp.port", config.getMailPort());
        props.put("mail.smtp.socketFactory.port", config.getMailPort());
        props.put("mail.smtp.socketFactory.class", config.getMailSocketFactoryClass());
        props.put("mail.smtp.socketFactory.fallback", config.getMailSocketFactoryFallback());

        props.put("mail.pop3.host", config.getMailPop3Host());
        props.put("mail.store.protocol", config.getMailStoreProtocol());

        SimpleAuth auth = new SimpleAuth(config.getMailUser(), config.getMailPass());

        MailSession.session = Session.getDefaultInstance(props, auth);
        session.setDebug(config.getMailDebug());
    } catch (Throwable ex) {
        System.err.println("Initial MailSession creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }

但我担心最好是保持这种状态,还是为每封电子邮件打开和关闭一个会话。

4

2 回答 2

6

首先,您需要阅读有关常见错误的 JavaMail FAQ 条目。

如果您阅读Session.getDefaultInstance 方法的 javadocs,您会看到 JavaMail 已经为您维护了一个单例 Session。如果您从不更改 Session 的配置,这可能对您有用,尽管我通常不建议这样做。

于 2012-11-27T20:43:07.080 回答
0

我宁愿不采用这种解决方案,因为在线程之间共享可变对象可能很麻烦。考虑实现一个邮件会话工厂,您可以从中获取已配置好的会话。这并不意味着对每封邮件都使用一个新会话:如果您要发送一批邮件,可以重复使用同一个会话发送一批邮件。

于 2012-11-27T17:10:12.343 回答