Skip to content

Instantly share code, notes, and snippets.

@WimRoose
Last active January 7, 2016 15:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save WimRoose/40268fde0f300d598439 to your computer and use it in GitHub Desktop.
Save WimRoose/40268fde0f300d598439 to your computer and use it in GitHub Desktop.
New functions to be able to use google migrations api
private void fwdEmailToGroups(HttpServletRequest request, HttpServletResponse response) throws IOException {
String userEmail = "empty";
try {
UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();
List<String> groupsEmailList = null;
List<String> checkboxIndexesList = null;
List<String> emailsubjects = null;
String checkboxIndexes = "";
String groupsEmail = "";
String messageId = "";
String subjectTag = "";
String selectedLabel = "";
String gmailQuery = "";
// added support for number of messages in gmail interface
Long numMessagesInbox = 0L;
//
ArrayList<HashMap<String, String>> result = new ArrayList<HashMap<String, String>>();
if (user != null && user.getEmail() != null && user.getEmail().length() > 0) {
userEmail = user.getEmail();
// for local testing only
userEmail = "wimr@vooruit.be";
if (request.getParameter("groupsEmail") != null) {
groupsEmail = request.getParameter("groupsEmail");
groupsEmailList = new ArrayList<String>(Arrays.asList(groupsEmail.split(",")));
}
if (request.getParameter("subjectTag") != null) {
subjectTag = request.getParameter("subjectTag");
}
// optional parameter
if (request.getParameter("messageId") != null) {
messageId = request.getParameter("messageId");
}
log.log(Level.INFO, "Owner:"+ user.getEmail() + " FwdGroupsEmail:"+groupsEmail+" messageId:"+ messageId + " subject:"+ subjectTag);
if (request.getParameter("emailCheckBoxIndexes") != null) {
checkboxIndexes = request.getParameter("emailCheckBoxIndexes");
checkboxIndexesList = new ArrayList<String>(Arrays.asList(checkboxIndexes.split(",")));
}
if (request.getParameter("emailSubjects") != null) {
Gson gson = new Gson();
String selectedEmailsSubject = request.getParameter("emailSubjects");
emailsubjects = gson.fromJson(selectedEmailsSubject, new TypeToken<ArrayList<String>>() {}.getType());
}
if (request.getParameter("selectedLabel") != null) {
selectedLabel = request.getParameter("selectedLabel");
}
if (request.getParameter("gmailQuery") != null) {
gmailQuery = request.getParameter("gmailQuery");
}
// added support for number of messages in gmail interface
if (request.getParameter("numMessagesInbox") != null) {
numMessagesInbox = Long.valueOf(request.getParameter("numMessagesInbox"));
}
HashMap<String, String> sentResult = null;
if(messageId == ""){ // more than one e-mail selected
System.out.println("No message ID's found, so received selection");
List<Message> messages = null;
log.log(Level.INFO, "Owner:"+ user.getEmail() + " FwdGroupsEmail:"+groupsEmail+" selectedLabel:"+ selectedLabel + " gmailQuery:"+ gmailQuery);
if (selectedLabel.contains("inbox")) {
messages = new ArrayList<Message>();
//List<Message> unreadInboxMessage = GoogleMailHelper.listMessagesMatchingQuery(user.getEmail(), "in:inbox is:unread");
//messages = GoogleMailHelper.listMessagesMatchingQuery(user.getEmail(),"in:inbox");
System.out.println("Mails selected in INBOX, doing query");
// added 'numMessagesInbox' parameter to function call
messages = GoogleMailHelper.listMessagesMatchingQuery("wimr@vooruit.be","in:inbox", numMessagesInbox);
}else{
// added 'numMessagesInbox' parameter to function call
messages = GoogleMailHelper.listMessagesMatchingQuery(user.getEmail(),gmailQuery, numMessagesInbox);
}
if(messages != null ){
// Not necessary anymore
//boolean emailIndexUpdCheck = false;
for(String strIndex : checkboxIndexesList){
// calculate offset: check if more messages are available in backend then in gmail iface
long offset = messages.size() - numMessagesInbox;
System.out.println("Offset: " + offset);
int index = Integer.parseInt(strIndex);
//sentResult = GoogleMigrationsHelper.migrate(messages.get(index+(int)offset).getId(), groupsEmailList);
// use offset to get valid message
Message m = messages.get(index+(int)offset);
System.out.println("Message/thread ID: " + m.getId());
// call to new function 'migrate'
// 'getMessage(m.getId(), userEmail)' call gets message in RAW format, necessary for using it in migration api function
sentResult = GoogleMigrationsHelper.migrate(GoogleMigrationsHelper.getMessage(m.getId(), userEmail), groupsEmail, subjectTag);
result.add(sentResult);
// commented out subject check
/*
if(messages.get(index) != null && emailsubjects != null && emailsubjects.get(0) != null){
// To check the front end email index equally to backend
if(!emailIndexUpdCheck){
String originalEmailSubject = GoogleMailHelper.getEmailSubject(messages.get(index).getId(), user.getEmail());
log.log(Level.INFO, "originalEmailSubject:" + originalEmailSubject);
if(originalEmailSubject.length()>0){
log.log(Level.INFO, "versusEmailSubject:" + emailsubjects.get(0));
if(originalEmailSubject.contains(emailsubjects.get(0))){
emailIndexUpdCheck = true;
}
}else{
emailIndexUpdCheck = true;
}
}
if(emailIndexUpdCheck){
sentResult = GoogleMailHelper.sendEmail(messages.get(index).getId(), user.getEmail(), groupsEmailList, subjectTag);
result.add(sentResult);
}else{
HashMap<String, String> returnResult = new HashMap<String, String>();
returnResult.put(Constants.responseResult, Constants.responseFailed);
returnResult.put(Constants.responseMessage, "Kindly refresh gmail and try again..");
result.add(returnResult);
break;
}
}*/
}
}
}else{ // only 1 e-mail
System.out.println("Message ID found, only 1 selected");
//sentResult = GoogleMailHelper.sendEmail(messageId, user.getEmail(), groupsEmailList, subjectTag);
sentResult = GoogleMigrationsHelper.migrate(GoogleMigrationsHelper.getMessage(messageId, userEmail), groupsEmail, subjectTag);
result.add(sentResult);
}
response.getWriter().println(new Gson().toJson(result));
} else {
response.getWriter().println("invalid user");
}
} catch (Exception ex) {
log.log(Level.SEVERE, "Unable fwd Email To Groups:" + userEmail, ex);
response.getWriter().println(ex.getMessage());
}
}
// added parameter Long numMessagesInboxer
public static List<Message> listMessagesMatchingQuery(String senderEmail, String query, Long numMessagesInbox) throws IOException {
List<Message> newMessages = null;
List<Message> messages = null;
int nMessagesBackend = 0;
int nThreadsBackend = 0;
try {
Random randomGenerator = new Random();
for (int n = 0; n < 3; ++n) {
try {
messages = new ArrayList<Message>();
newMessages = new ArrayList<Message>();
Gmail service = new Gmail.Builder(GoogleNetHttpTransport.newTrustedTransport(), JSON_FACTORY, GinaUtil.getServiceAccCred(senderEmail)).setApplicationName(APPLICATION_NAME).build();
ListMessagesResponse response = service.users().messages().list("me").setQ(query).execute();
while (response.getMessages() != null) {
messages.addAll(response.getMessages());
if (response.getNextPageToken() != null) {
String pageToken = response.getNextPageToken();
response = service.users().messages().list("me").setQ(query).setPageToken(pageToken).execute();
} else {
break;
}
}
if(messages.size() >0){
//System.out.println("Number of messages found in backend matching query: " + messages.size());
for (Message item : messages) {
boolean exist = false;
for(Message newItem : newMessages){
if(item.getThreadId().equals(newItem.getThreadId())){
exist = true;
break;
}
}
if(!exist){
newMessages.add(item);
}
// counts number of gmail.messages, not threads
nMessagesBackend = nMessagesBackend + 1;
}
}
break;
} catch (Exception ex) {
if (n == 2) {
return null;
}
java.lang.Thread.sleep((1 << n) * 1000 + randomGenerator.nextInt(1001));
}
}
} catch (Exception ex) {
log.log(Level.SEVERE, ex.getMessage());
}
// size of newMessages = number of threads in backend. So we can calculate more or less if user
// uses threaded interface or not. Return messages array or newMessages array
nThreadsBackend = newMessages.size();
System.out.println("Backend Messages: " + nMessagesBackend);
System.out.println("Backend Threads: " + nThreadsBackend);
// if true -> non threaded
if ((nMessagesBackend - numMessagesInbox) < Math.abs((nThreadsBackend - numMessagesInbox))) {
System.out.println("Returning messages");
return messages;
} else {
System.out.println("Returning threads");
return newMessages;
}
}
function onClickSendBtn()
{
// added function to get number of messages (top right corner of gmail iface: e.g. 1-50 of 356
var numMessagesInbox = document.getElementsByClassName('Dj')[0].innerHTML;
openBrackets = numMessagesInbox.lastIndexOf('<b>')
closeBrackets = numMessagesInbox.lastIndexOf('</b>')
numMessagesInbox = numMessagesInbox.substring(openBrackets+3,closeBrackets);
...
// numMessagesInbox is sent as parameter in POST
debugger
$.ajax
({
type: "POST",
url: devGAEURL+"/_email",
data: {
fwdEmailToGroups: true,
messageId: selectedEmail.toString(),
emailCheckBoxIndexes: indexEmail.toString(),
emailSubjects: JSON.stringify(selectedEmailsSubject),
groupsEmail: selectedGroup.toString(),
subjectTag: completeTags,
gmailQuery: param,
selectedLabel: selectedLabel,
numMessagesInbox: numMessagesInbox
},
public static com.google.api.services.gmail.model.Message getMessage (String mID, String senderEmail) throws IOException, MessagingException, GeneralSecurityException {
Gmail service = new Gmail.Builder(GoogleNetHttpTransport.newTrustedTransport(), JSON_FACTORY, GinaUtil.getServiceAccCred("wimr@vooruit.be")).setApplicationName(APPLICATION_NAME).build();
// RAW niet vergeten!!
com.google.api.services.gmail.model.Message message = service.users().messages().get(senderEmail, mID).setFormat("raw").execute();
return message;
}
public static HashMap<String, String> migrate(com.google.api.services.gmail.model.Message message, String googleGroup, String subjectTag) throws IOException, MessagingException, GeneralSecurityException {
HashMap<String, String> returnResult = new HashMap<String, String>();
try {
System.out.println("Building groupsservice...");
GroupsMigration service = new GroupsMigration.Builder(GoogleNetHttpTransport.newTrustedTransport(), JSON_FACTORY, GinaUtil.getServiceAccCred(GinaUtil.SERVICE_ACCOUNT_EMAIL)).setApplicationName(APPLICATION_NAME).build();
//googleGroup = "3036477953-1439547488@vooruit.gent";
Session session = Session.getDefaultInstance(new java.util.Properties());
byte[] emailBytes = Base64.decodeBase64(message.getRaw());
Properties props = new Properties();
MimeMessage email = new MimeMessage(session, new ByteArrayInputStream(emailBytes));
email.setSubject(subjectTag + " " + email.getSubject());
System.out.println("Subject: "+ email.getSubject());
java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
email.writeTo(baos);
ByteArrayContent content =
new ByteArrayContent("message/rfc822", baos.toByteArray());
Groups result = service.archive().insert(googleGroup, content).execute();
System.out.printf("Result: %s\n", result.getResponseCode());
returnResult.put("result", result.getResponseCode());
returnResult.put("message", email.getSubject() + " has been sent");
}
catch (Exception ex) {
System.out.println(ex);
returnResult.put("result", ex.toString());
returnResult.put("message", "unable to forward, exception in gae");
}
return returnResult;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment