working on IMAP listener
This commit is contained in:
24
src/main/java/de/srsoftware/widerhall/Application.java
Normal file
24
src/main/java/de/srsoftware/widerhall/Application.java
Normal file
@@ -0,0 +1,24 @@
|
||||
package de.srsoftware.widerhall;
|
||||
|
||||
import org.json.simple.JSONObject;
|
||||
import org.json.simple.parser.JSONParser;
|
||||
import org.json.simple.parser.ParseException;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
|
||||
public class Application {
|
||||
|
||||
public static void main(String[] args) throws IOException, ParseException {
|
||||
var parser = new JSONParser();
|
||||
var config = Files.readString(new File("/tmp/config.json").toPath());
|
||||
JSONObject json = (JSONObject) parser.parse(config);
|
||||
|
||||
//String testSender = (String) json.get("sender");
|
||||
//String testReceiver = (String) json.get("receiver");
|
||||
// new SmtpClient(json).send(json,testSender,"Stephan Richter",testReceiver,"Test","Dies ist ein Test");
|
||||
MessageHandler forward = new Forwarder();
|
||||
new ImapClient(json).addListener(forward).start();
|
||||
}
|
||||
}
|
||||
9
src/main/java/de/srsoftware/widerhall/Constants.java
Normal file
9
src/main/java/de/srsoftware/widerhall/Constants.java
Normal file
@@ -0,0 +1,9 @@
|
||||
package de.srsoftware.widerhall;
|
||||
|
||||
public class Constants {
|
||||
public static final String IMAPS = "imaps";
|
||||
public static final String PROTOCOL = "mail.store.protocol";
|
||||
public static final String HOST = "host";
|
||||
public static final String USER = "user";
|
||||
public static final String PASSWORD = "password";
|
||||
}
|
||||
15
src/main/java/de/srsoftware/widerhall/Forwarder.java
Normal file
15
src/main/java/de/srsoftware/widerhall/Forwarder.java
Normal file
@@ -0,0 +1,15 @@
|
||||
package de.srsoftware.widerhall;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.mail.Message;
|
||||
import javax.mail.MessagingException;
|
||||
|
||||
public class Forwarder implements MessageHandler {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(Forwarder.class);
|
||||
@Override
|
||||
public void onMessageReceived(Message message) throws MessagingException {
|
||||
LOG.debug("forwarding {}",message.getSubject());
|
||||
}
|
||||
}
|
||||
129
src/main/java/de/srsoftware/widerhall/ImapClient.java
Normal file
129
src/main/java/de/srsoftware/widerhall/ImapClient.java
Normal file
@@ -0,0 +1,129 @@
|
||||
package de.srsoftware.widerhall;
|
||||
|
||||
import com.sun.mail.iap.ProtocolException;
|
||||
import com.sun.mail.imap.IMAPFolder;
|
||||
import com.sun.mail.imap.protocol.IMAPProtocol;
|
||||
import org.json.simple.JSONObject;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import javax.mail.*;
|
||||
import java.util.HashSet;
|
||||
import java.util.Properties;
|
||||
|
||||
public class ImapClient {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(ImapClient.class);
|
||||
private final JSONObject config;
|
||||
private boolean stopped = false;
|
||||
private IMAPFolder inbox;
|
||||
private HashSet<MessageHandler> listeners = new HashSet<>();
|
||||
|
||||
|
||||
|
||||
private class ListeningThread extends Thread {
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(ListeningThread.class);
|
||||
private final JSONObject config;
|
||||
|
||||
ListeningThread(JSONObject config){
|
||||
this.config = config;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
while (!stopped) {
|
||||
try {
|
||||
openInbox();
|
||||
} catch (MessagingException e){
|
||||
LOG.warn("Connection problem:",e);
|
||||
try {
|
||||
sleep(1000);
|
||||
} catch (InterruptedException interruptedException) {
|
||||
interruptedException.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void openInbox() throws MessagingException {
|
||||
String host = (String) config.get(Constants.HOST);
|
||||
String username = (String) config.get(Constants.USER);
|
||||
String password = (String) config.get(Constants.PASSWORD);
|
||||
LOG.debug("Connecting and logging in…");
|
||||
Properties props = imapProps();
|
||||
Session session = Session.getInstance(props);
|
||||
Store store = session.getStore(Constants.IMAPS);
|
||||
store.connect(host,username,password);
|
||||
LOG.debug("Connected, opening inbox:");
|
||||
inbox = (IMAPFolder)store.getFolder("INBOX");
|
||||
inbox.open(IMAPFolder.READ_WRITE);
|
||||
|
||||
while (!stopped){
|
||||
handleMessages();
|
||||
LOG.debug("Idling.");
|
||||
inbox.idle(true);
|
||||
}
|
||||
}
|
||||
|
||||
private void handleMessages() throws MessagingException {
|
||||
LOG.debug("reading email:");
|
||||
if (!inbox.isOpen()){
|
||||
inbox.open(IMAPFolder.READ_WRITE);
|
||||
}
|
||||
for (Message message : inbox.getMessages()){
|
||||
if (message.isSet(Flags.Flag.SEEN)) continue;
|
||||
handle(message);
|
||||
message.setFlag(Flags.Flag.SEEN,true);
|
||||
}
|
||||
}
|
||||
|
||||
private void handle(Message message) throws MessagingException {
|
||||
LOG.debug("Handling {}",message.getSubject());
|
||||
for (MessageHandler listener : listeners) listener.onMessageReceived(message);
|
||||
}
|
||||
|
||||
private Properties imapProps() {
|
||||
Properties props = new Properties();
|
||||
props.put(Constants.PROTOCOL,Constants.IMAPS);
|
||||
return props;
|
||||
}
|
||||
}
|
||||
|
||||
private class Heartbeat extends Thread{
|
||||
|
||||
private static final Logger LOG = LoggerFactory.getLogger(Heartbeat.class);
|
||||
@Override
|
||||
public void run() {
|
||||
while (!stopped){
|
||||
try {
|
||||
sleep(300034);
|
||||
if (inbox != null) continue;
|
||||
LOG.debug("sending NOOP");
|
||||
inbox.doCommand(protocol -> {
|
||||
protocol.simpleCommand("NOOP",null);
|
||||
return null;
|
||||
});
|
||||
} catch (InterruptedException | MessagingException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
ImapClient(JSONObject config){
|
||||
this.config = config;
|
||||
}
|
||||
|
||||
public void start() {
|
||||
LOG.debug("Creating ListeningThread…");
|
||||
new ListeningThread(config).start();
|
||||
LOG.debug("Creating Heartbeat…");
|
||||
new Heartbeat().start();
|
||||
}
|
||||
|
||||
|
||||
public ImapClient addListener(MessageHandler messageHandler) {
|
||||
listeners.add(messageHandler);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package de.srsoftware.widerhall;
|
||||
|
||||
import javax.mail.Message;
|
||||
import javax.mail.MessagingException;
|
||||
|
||||
public interface MessageHandler {
|
||||
public void onMessageReceived(Message message) throws MessagingException;
|
||||
}
|
||||
@@ -62,13 +62,4 @@ public class SmtpClient {
|
||||
LOG.debug("…versendet");
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws IOException, ParseException, MessagingException {
|
||||
var parser = new JSONParser();
|
||||
var config = Files.readString(new File("/tmp/config.json").toPath());
|
||||
JSONObject json = (JSONObject) parser.parse(config);
|
||||
|
||||
String testSender = (String) json.get("sender");
|
||||
String testReceiver = (String) json.get("receiver");
|
||||
new SmtpClient(json).send(json,testSender,"Stephan Richter",testReceiver,"Test","Dies ist ein Test");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user