use of i2p.bote.email.Email in project i2p.i2p-bote by i2p.
the class OutboxProcessor method run.
@Override
public void run() {
while (!Thread.interrupted()) {
try {
synchronized (this) {
wakeupSignal = new CountDownLatch(1);
}
if (networkStatusSource.isConnected()) {
log.debug("Processing outgoing emails in directory '" + outbox.getStorageDirectory() + "'.");
FolderIterator<Email> iterator = outbox.iterate();
try {
while (iterator.hasNext()) {
Email email = iterator.next();
log.info("Processing email with message Id: '" + email.getMessageID() + "'.");
// signature flag only makes sense locally
email.removeSignatureFlag();
try {
sendEmail(email);
fireOutboxListeners(email);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw e;
} catch (Exception e) {
log.error("Error sending email.", e);
}
}
} catch (PasswordException e) {
log.debug("Can't scan outbox because a password is set and the application is locked.");
}
}
int pause = configuration.getOutboxCheckInterval();
wakeupSignal.await(pause, TimeUnit.MINUTES);
} catch (InterruptedException e) {
break;
} catch (RuntimeException e) {
// catch unexpected exceptions to keep the thread running
log.error("Exception caught in OutboxProcessor loop", e);
}
}
log.debug("OutboxProcessor thread exiting.");
}
use of i2p.bote.email.Email in project i2p.i2p-bote by i2p.
the class AttachmentProvider method getAttachment.
private Part getAttachment(Uri uri) throws PasswordException, IOException, MessagingException {
List<String> segments = uri.getPathSegments();
String folderName = segments.get(0);
String messageId = segments.get(1);
int partNum = Integer.valueOf(segments.get(2));
Email email = BoteHelper.getEmail(folderName, messageId);
if (email != null) {
if (partNum >= 0 && partNum < email.getParts().size())
return email.getParts().get(partNum);
}
return null;
}
use of i2p.bote.email.Email in project i2p.i2p-bote by i2p.
the class I2PBote method initializeServices.
/**
* Initializes daemon threads, doesn't start them yet.
*/
private void initializeServices() {
I2PPacketDispatcher dispatcher = new I2PPacketDispatcher();
i2pSession.addMuxedSessionListener(dispatcher, I2PSession.PROTO_DATAGRAM, I2PSession.PORT_ANY);
backgroundThreads.add(passwordCache);
I2PSendQueue sendQueue = new I2PSendQueue(i2pSession, dispatcher);
backgroundThreads.add(sendQueue);
// reads packets stored in the relayPacketFolder and sends them
RelayPacketSender relayPacketSender = new RelayPacketSender(sendQueue, relayPacketFolder, configuration);
backgroundThreads.add(relayPacketSender);
I2PAppThread seedless = null;
try {
Class<? extends I2PAppThread> clazz = Class.forName("i2p.bote.service.seedless.SeedlessInitializer").asSubclass(I2PAppThread.class);
Constructor<? extends I2PAppThread> ctor = clazz.getDeclaredConstructor(I2PSocketManager.class);
seedless = ctor.newInstance(socketManager);
backgroundThreads.add(seedless);
} catch (ClassNotFoundException e) {
} catch (NoSuchMethodException e) {
} catch (InstantiationException e) {
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
}
dht = new KademliaDHT(sendQueue, dispatcher, configuration.getDhtPeerFile(), (DhtPeerSource) seedless);
backgroundThreads.add(dht);
dht.setStorageHandler(EncryptedEmailPacket.class, emailDhtStorageFolder);
dht.setStorageHandler(IndexPacket.class, indexPacketDhtStorageFolder);
dht.setStorageHandler(Contact.class, directoryDhtFolder);
peerManager = new RelayPeerManager(sendQueue, getLocalDestination(), configuration.getRelayPeerFile());
backgroundThreads.add(peerManager);
dispatcher.addPacketListener(emailDhtStorageFolder);
dispatcher.addPacketListener(indexPacketDhtStorageFolder);
dispatcher.addPacketListener(new RelayPacketHandler(relayPacketFolder, dht, sendQueue, i2pSession));
dispatcher.addPacketListener(peerManager);
dispatcher.addPacketListener(relayPacketSender);
ExpirationThread expirationThread = new ExpirationThread();
expirationThread.addExpirationListener(emailDhtStorageFolder);
expirationThread.addExpirationListener(indexPacketDhtStorageFolder);
expirationThread.addExpirationListener(relayPacketSender);
backgroundThreads.add(expirationThread);
outboxProcessor = new OutboxProcessor(dht, outbox, peerManager, relayPacketFolder, identities, configuration, this);
outboxProcessor.addOutboxListener(new OutboxListener() {
/**
* Moves sent emails to the "sent" folder
*/
@Override
public void emailSent(Email email) {
try {
outbox.setNew(email, false);
log.debug("Moving email [" + email + "] to the \"sent\" folder.");
outbox.move(email, sentFolder);
} catch (Exception e) {
log.error("Cannot move email from outbox to sent folder: " + email, e);
}
}
});
backgroundThreads.add(outboxProcessor);
emailChecker = new EmailChecker(identities, configuration, incompleteEmailFolder, emailDhtStorageFolder, indexPacketDhtStorageFolder, this, sendQueue, dht, peerManager);
backgroundThreads.add(emailChecker);
deliveryChecker = new DeliveryChecker(dht, sentFolder, configuration, this);
backgroundThreads.add(deliveryChecker);
}
use of i2p.bote.email.Email in project i2p.i2p-bote by i2p.
the class ShowAttachment method doGet.
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String folderName = request.getParameter("folder");
String messageID = request.getParameter("messageID");
Email email;
try {
email = JSPHelper.getEmail(folderName, messageID);
} catch (PasswordException e) {
throw new ServletException(e);
}
if (email == null)
throw new ServletException("Message ID <" + messageID + "> not found in folder <" + folderName + ">.");
List<Part> parts = null;
try {
parts = email.getParts();
} catch (MessagingException e) {
throw new ServletException("Can't parse mail. Message ID=" + messageID, e);
}
String partIndexStr = request.getParameter("part");
int partIndex = -1;
try {
partIndex = Integer.valueOf(partIndexStr);
} catch (NumberFormatException e) {
}
if (partIndex < 0 || partIndex >= parts.size())
throw new ServletException("Invalid part index: <" + partIndexStr + ">, must be a number between 0 and " + (parts.size() - 1));
Part part = parts.get(partIndex);
try {
response.setContentType(part.getContentType());
String[] dispositionHeaders = part.getHeader("Content-Disposition");
if (dispositionHeaders == null || dispositionHeaders.length == 0)
response.setHeader("Content-Disposition", "attachment; filename=attachment");
else
response.setHeader("Content-Disposition", dispositionHeaders[0]);
} catch (MessagingException e) {
log.error("Can't get MIME type of part " + partIndex + ". Message ID=" + messageID, e);
}
// write the attachments' content to the servlet response stream
try {
InputStream input = part.getInputStream();
OutputStream output = response.getOutputStream();
byte[] buffer = new byte[1024];
while (true) {
int bytesRead = input.read(buffer);
if (bytesRead <= 0)
return;
output.write(buffer, 0, bytesRead);
}
} catch (MessagingException e) {
throw new ServletException("Can't get MIME type of part " + partIndex + ". Message ID=" + messageID, e);
}
}
Aggregations