我尝试使用消息驱动 bean 获取电子邮件。我的目的是捕获新的电子邮件。我用过 Jboss 6.1。我在我的 gmail 中启用了 pop3s。当我启动服务器时,能够从收件箱中获取现有的电子邮件。
一旦服务器启动并且应用程序正在运行,MailListener 不会通知新电子邮件。我也尝试添加轮询间隔。
有什么建议么。
package uk.co.test.inbound;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.inject.Named;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Message.RecipientType;
import org.jboss.ejb3.annotation.ResourceAdapter;
import org.jboss.resource.adapter.mail.inflow.MailListener;
@MessageDriven(
activationConfig = {
@ActivationConfigProperty(propertyName = "mailServer", propertyValue = "pop.gmail.com"),
@ActivationConfigProperty(propertyName = "mailFolder", propertyValue = "INBOX"),
@ActivationConfigProperty(propertyName = "storeProtocol", propertyValue = "pop3s"),
@ActivationConfigProperty(propertyName = "userName", propertyValue = "xxxx@gmail.com"),
@ActivationConfigProperty(propertyName= "password", propertyValue="xxxxx"),
@ActivationConfigProperty(propertyName= "pollingInterval", propertyValue="100"),
@ActivationConfigProperty(propertyName= "port", propertyValue="995"),
@ActivationConfigProperty(propertyName= "debug", propertyValue="true"),
@ActivationConfigProperty(propertyName= "starttls", propertyValue="true")
})
@ResourceAdapter("mail-ra.rar")
@Named("mailListener")
public class EmailReceiver implements MailListener{
@Override
public void onMessage(Message msg) {
System.out.println("One new Message Received" );
try {
Address[] fromAddress = msg.getFrom();
String from = fromAddress[0].toString();
String subject = msg.getSubject();
String toList = parseAddresses(msg.getRecipients(RecipientType.TO));
String ccList = parseAddresses(msg.getRecipients(RecipientType.CC));
String sentDate = msg.getSentDate().toString();
String contentType = msg.getContentType();
String messageContent = "";
if (contentType.contains("text/plain") || contentType.contains("text/html")) {
try {
Object content = msg.getContent();
if (content != null) {
messageContent = content.toString();
}
} catch (Exception ex) {
messageContent = "[Error downloading content]";
ex.printStackTrace();
}
} else {
try {
if (msg.getContent() instanceof Multipart) {
Multipart content = (Multipart) msg.getContent();
content.getCount();
Part part = content.getBodyPart(0);
InputStream is = part.getInputStream();
if (!(is instanceof BufferedInputStream)) {
is = new BufferedInputStream(is);
}
int c;
final StringWriter sw = new StringWriter();
while ((c = is.read()) != -1) {
sw.write(c);
}
if (!sw.toString().contains("<div>")) {
messageContent = sw.toString();
}
}
} catch (IOException e) {
messageContent = "[Error downloading content]";
e.printStackTrace();
}
}
System.out.println("\t Subject: " + subject);
System.out.println("\t Message: " + messageContent);
} catch (MessagingException e) {
e.printStackTrace();
}
}
/**
* Returns a list of addresses in String format separated by comma
*
* @param address an array of Address objects
* @return a string represents a list of addresses
*/
private String parseAddresses(Address[] address) {
String listAddress = "";
if (address != null) {
for (int i = 0; i < address.length; i++) {
listAddress += address[i].toString() + ", ";
}
}
if (listAddress.length() > 1) {
listAddress = listAddress.substring(0, listAddress.length() - 2);
}
return listAddress;
}
}