Skip to content

Instantly share code, notes, and snippets.

@kcrimson
Created February 22, 2015 11:44
Show Gist options
  • Save kcrimson/b5132b6ec667082779f6 to your computer and use it in GitHub Desktop.
Save kcrimson/b5132b6ec667082779f6 to your computer and use it in GitHub Desktop.
package symentis;
import static com.google.common.collect.FluentIterable.from;
import static java.util.Collections.list;
import java.util.Enumeration;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Folder;
import javax.mail.Header;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import org.neo4j.graphdb.DynamicLabel;
import org.neo4j.graphdb.DynamicRelationshipType;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.ResourceIterable;
import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import com.google.common.collect.FluentIterable;
public class ImportGMail {
public static void main(String[] args) throws MessagingException {
GraphDatabaseService graphDatabaseService = new GraphDatabaseFactory().newEmbeddedDatabase("mails");
Transaction tx = graphDatabaseService.beginTx();
Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imaps");
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imaps");
store.connect("imap.gmail.com", "<your-email>@gmail.com", "<your-password>");
Folder folder = store.getFolder("Odebrane");
folder.open(Folder.READ_ONLY);
int messageCount = folder.getMessageCount();
try {
for (int i = 1; i <= messageCount; i++) {
System.out.println("procesing message id "+i);
Message message = folder.getMessage(i);
Node messageNode = graphDatabaseService.createNode(DynamicLabel.label("Message"));
@SuppressWarnings("unchecked")
Enumeration<Header> allHeaders = message.getAllHeaders();
from(list(allHeaders)).forEach(header -> {
messageNode.setProperty(((Header) header).getName(), ((Header) header).getValue());
});
InternetAddress fromAddress = (InternetAddress) message.getFrom()[0];
ResourceIterable<Node> froms = graphDatabaseService.findNodesByLabelAndProperty(
DynamicLabel.label("InternetAddress"), "address", fromAddress.getAddress());
Node fromNode = FluentIterable.from(froms).first().or(() -> {
Node node = graphDatabaseService.createNode(DynamicLabel.label("InternetAddress"));
node.setProperty("address", fromAddress.getAddress());
String personal = fromAddress.getPersonal();
if (personal != null)
node.setProperty("personal", personal);
return node;
});
messageNode.createRelationshipTo(fromNode, DynamicRelationshipType.withName("FROM"));
Address[] recipients = message.getRecipients(RecipientType.TO);
if(recipients!=null){
for(Address address:recipients){
InternetAddress internetAddress = (InternetAddress)address;
ResourceIterable<Node> tos = graphDatabaseService.findNodesByLabelAndProperty(
DynamicLabel.label("InternetAddress"), "address", fromAddress.getAddress());
Node toNode = FluentIterable.from(tos).first().or(() -> {
Node node = graphDatabaseService.createNode(DynamicLabel.label("InternetAddress"));
node.setProperty("address", internetAddress.getAddress());
String personal = internetAddress.getPersonal();
if (personal != null)
node.setProperty("personal", personal);
return node;
});
messageNode.createRelationshipTo(toNode, DynamicRelationshipType.withName("TO"));
}}
recipients = message.getRecipients(RecipientType.CC);
if(recipients!=null){
for(Address address:recipients){
InternetAddress internetAddress = (InternetAddress)address;
ResourceIterable<Node> tos = graphDatabaseService.findNodesByLabelAndProperty(
DynamicLabel.label("InternetAddress"), "address", fromAddress.getAddress());
Node toNode = FluentIterable.from(tos).first().or(() -> {
Node node = graphDatabaseService.createNode(DynamicLabel.label("InternetAddress"));
node.setProperty("address", internetAddress.getAddress());
String personal = internetAddress.getPersonal();
if (personal != null)
node.setProperty("personal", personal);
return node;
});
messageNode.createRelationshipTo(toNode, DynamicRelationshipType.withName("CC"));
}}
}
tx.success();
} finally {
tx.close();
}
graphDatabaseService.shutdown();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment