Last active
January 7, 2016 15:50
-
-
Save WimRoose/40268fde0f300d598439 to your computer and use it in GitHub Desktop.
New functions to be able to use google migrations api
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
}, |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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