我正在尝试接收带有消息驱动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());
}
}
关于如何完成这项工作,我有几个问题。很抱歉把它们全部放在一个问题中,但我相信它们属于一个整体。
答案 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
,并且每次方法唤醒时都可以连接新连接。请注意,如果计划在那里有任何重大负载,您可能希望缓存该存储对象,并且仅在连接超时时才连接。