Stephan Richter
3 years ago
6 changed files with 185 additions and 9 deletions
@ -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(); |
||||||
|
} |
||||||
|
} |
@ -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"; |
||||||
|
} |
@ -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()); |
||||||
|
} |
||||||
|
} |
@ -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; |
||||||
|
} |
Loading…
Reference in new issue