MDB用于接收电子邮件

时间:2014-05-01 19:15:15

标签: email java-ee jboss message-driven-bean wildfly

我正在尝试接收带有消息驱动bean的电子邮件。我正在使用jboss wildfly。不幸的是,我找不到真正的文件。这是迄今为止我发现的最多:

@MessageDriven(activationConfig={
        @ActivationConfigProperty(propertyName="mailServer", propertyValue="imap.gmail.com"),
        @ActivationConfigProperty(propertyName="mailFolder", propertyValue="INBOX"),
        @ActivationConfigProperty(propertyName="storeProtocol", propertyValue="imap"),
        @ActivationConfigProperty(propertyName="userName", propertyValue="me@gmail.com"),
        @ActivationConfigProperty(propertyName="password", propertyValue="xxx")
    })
@ResourceAdapter("mail-ra.rar")
public class EMailReceiver implements MailListener {


    @Override
    public void onMessage(Message msg) {

        System.out.println("MSG: " + msg.toString());
    }

}

关于如何完成这项工作,我有几个问题。很抱歉把它们全部放在一个问题中,但我相信它们属于一个整体。

  1. 这个ResourceAdapter是什么?我可以找到一个ResourceAdapter类,但不能找到注释。
  2. 我在哪里可以获得正确的mail-ra.rar以及我在哪里放?我猜这可能会有不同的版本,我在wildfly中找不到一个。
  3. 是注释配置是否足够,还是需要在xml中配置任何内容?

1 个答案:

答案 0 :(得分:1)

我不是IronJacamar的专家,这是您为inbound adapter配置所需的内容。我对阅读文档的印象是,有几层抽象隐藏了对gmail IMAP服务的简单轮询。

好消息是:你可以自己轻松地

您必须配置邮件Session。我从Wildfly example

中删除了standalone.xml的以下摘录
<subsystem xmlns="urn:jboss:domain:mail:1.0">
<mail-session jndi-name="java:/jboss/mail/MyGmail">
    <imap-server address="example.com" port="432">
        <login name="nobody" password="pass"/>
    </imap-server>
</mail-session>
</subsystem>

如果你这样设置,你可以将你的会话称为Resource

@Stateless
public class PollingImapAccess {
    @Resource(name = "java:/jboss/mail/MyGmail")
    private Session session;

    @Schedule(hour = "*")
    public void init() {
        try {
            IMAPStore store = (IMAPStore) session.getStore();
            if (!store.isConnected()) store.connect();
            // grab your folders, scan for new messages     
        } catch (MessagingException ex) { /* handle exception */ }
    }
}

这将导致EJB容器每小时唤醒您的bean并连接到您的gmail帐户。您可以在tutorial中了解有关计时器的更多信息。

我不太欣赏您必须使用个人帐户信息加重通用服务器配置,您可以回到Session#getInstance() method

Properties gmail = new Properties();
gmail.setProperty("mail.imaps.host", "imap.gmail.com");
gmail.setProperty("mail.imaps.port", "993");

Session session = Session.getInstance(gmail);
IMAPSSLStore mystore = (IMAPSSLstore) session.connect("me@gmail.com", "xxx");

javadoc中提供了可设置属性的完整列表。

在这种情况下,您根本不需要@Resource,并且每次方法唤醒时都可以连接新连接。请注意,如果计划在那里有任何重大负载,您可能希望缓存该存储对象,并且仅在连接超时时才连接。