Re: Send Gmail to Evernote
February 13, 2013
Harry Oosterveen published today this nice review:
Send Gmail to Evernote: an overview of the tools
The review mentioned our InQloud service that is available in Evernote trunk.
The summary table says “only notebooks” in the notebook/tags column, and that needs to be corrected. Harry posted the correction in the comments. Tagging is easy with inQloud: https://inqloud.uservoice.com/knowledgebase/articles/134619-custom-addresses-for-notebook-tags
-Alexey
Beta-testing a new email “BigDripper” follow-up robot
January 29, 2013
BigDripper is our new follow-up robot that leverages Yoxel email conversation tracking. Currently it is only available for Gmail users. You will need to configure at least one Google Apps service in Yoxel Portal to be able to use BigDripper.
To see BigDripper in action please visit the blog post written by an early adopter.
-Alexey
Yoxel Portal is doing automatic email conversation discovery and logging for Highrise CRM users (read this article for details https://yoxel.uservoice.com/knowledgebase/articles/69414-email-tracking-and-forwarding). In this automatic mode a conversation is filed under one contact in Highrise and then is tracked by Yoxel Portal.
Now Gmail users can also use Gmail labels to direct the logging to a deal or case in Highrise. For that a gmail convo needs to be labeled with a Yoxel/<label> matching the deal/case name. So, create a parent folder/label ‘Yoxel’ in your Gmail account and then also create nested labels for deals/cases that you want to attach emails to:
Yoxel/<hr-deal-nameA>
Yoxel/<hr-deal-nameB>
Yoxel/<hr-deal-nameC>
…
Yoxel/<hr-case-nameA>
Yoxel/<hr-case-nameB>
Yoxel/<hr-case-nameC>
…
Yoxel/<drip-rule-nameA>
Yoxel/<drip-rule-nameB>
Yoxel/<drip-rule-nameC>
An email convo labeled with any of these labels will be noticed by Yoxel Portal and logged in Highrise under the corresponding deal/case. Also the drip-rule labels can be used to active the BigDripper tool, our new follow-up robot (see this article for more details http://danielodio.com/piloting-a-new-email-bigdripper-sales-tool)
Write me a line if you need any help with this. This capability will be available for our Outlook users later on.
-Alexey
Getting Gmail labels using javamail
January 29, 2013
I’ve been working with Gmail using javamail library for a long time now, the standard IMAP/SMTP capabilities were quite enough, even to deal with the labels. But recently I decided to also pull the gmail custom attributes: X-GM-THRID and X-GM-LABELS (see Gmail Imap Extensions).
At first it looked like there was no easy way to fetch those custom attributes using the standard javamail FetchProfile mechanism so I went searching in Google.
I found the java-gmail-imap project which was quite encouraging but after studying it more I figured that I did want to use it:
- It incorporated javamail 1.4.4 and I really needed some new 1.5.x functionality
- A lot of original javamail classes if not all were extended/re-written which seemed like an overkill
- Last release was on Mar 23, 2012
So I went exploring further.
I must say that I really do appreciate that so much code these days is open source. Both java-gmail-imap and javamail sources showed me what was really happening under the hood and I came up with a simpler hack which only requires one extended class.
I’ll explain the hack here and if you want my code let me know.
So, for a list of messages that I am reading from Gmail I now do a standard javamail profile fetch:
folder.fetch(msgs, stdFetchProfile);
followed by my custom fetch using IMAPFolder’s doCommand():
final MessageSet[] mSets = MessageSet.createMessageSets(mns); ((IMAPFolder) folder).doCommand(new IMAPFolder.ProtocolCommand() { @Override public Object doCommand(IMAPProtocol p) throws ProtocolException { try { Response[] r = p.fetch(mSets, "X-GM-LABELS X-GM-THRID"); for (int i = 0; i < r.length; i++) { if (!FetchResponse.class.isInstance(r[i])) continue; // Got a FetchResponse. GmailFetchResponse gfr = new GmailFetchResponse( ((FetchResponse) r[i]).toString()); // Use gfr.getNumber() to get the msg number for (int j = 0; j < gfr.getItemCount(); j++) { Item item = gfr.getItem(j); if (X_GM_LABELS.class.isInstance(item)) // get the labels ((X_GM_LABELS) item).x_gm_labels); } } } catch (ProtocolException e) { logError(e.getMessage(), e); } return null; } });
GmailFetchResponse is the class I had to create by extending Javamail’s Response. It’s aware of the X-GM-* attributes and I make it re-parse the response received in the standard FetchResponse. I used only the required part of the java-gmail-imap’s parse() method:
private void parse() throws ParsingException { skipSpaces(); if (buffer[index] != '(') throw new ParsingException( "error in FETCH parsing, missing '(' at index " + index); Vector v = new Vector(); Item i = null; do { index++; // skip '(', or SPACE if (index >= size) throw new ParsingException( "error in FETCH parsing, ran off end of buffer, size " + size); switch (buffer[index]) { case 'X': if (match(X_GM_MSGID.name)) { index += X_GM_MSGID.name.length; i = new X_GM_MSGID(this); } if (match(X_GM_THRID.name)) { index += X_GM_THRID.name.length; i = new X_GM_THRID(this); } if (match(X_GM_LABELS.name)) { index += X_GM_LABELS.name.length; i = new X_GM_LABELS(this); } break; default: } if (i != null) v.addElement(i); } while (buffer[index] != ')'); index++; // skip ')' items = new Item[v.size()]; v.copyInto(items); }
X_GM_LABELS* classes I copied from java-gmail-imap project, they’re very simple. I only added required UTF-7 conversion:
public class X_GM_LABELS implements Item { static final char[] name = { 'X', '-', 'G', 'M', '-', 'L', 'A', 'B', 'E', 'L', 'S' }; public int seqnum; public String[] x_gm_labels; public X_GM_LABELS(GmailFetchResponse r) throws ParsingException { seqnum = r.getNumber(); r.skipSpaces(); x_gm_labels = r.readAtomStringList(); if (x_gm_labels != null) for (int i = 0; i < x_gm_labels.length; i++) try { x_gm_labels[i] = new String( x_gm_labels[i].getBytes("US-ASCII"), "X-MODIFIED-UTF-7"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); break; } } }
That is all. With one additional custom fetch call (which is not a huge overhead) you have read the Gmail attributes for your messages.
I hope this can be useful for others.
-Alexey
It’s been a while since I posted anything here. It seems these days it’s much easier to post one-liner in twitter or G+ rather than write a blog post.
Just wanted to post some quick updates here:
- Alot of time and energy invested into developing email conversation discovery and tracking for our Yoxel Personal desktop app did not go to waste (we stopped developing the app). The engine has found its better place within our cloud based service Yoxel Portal. CRM users love it: http://www.google.com/enterprise/marketplace/search?query=yoxel
- Some interesting ideas are discussed in our UserVoice forum now. Check out this one, for example, a sync mode that turns Basecamp tasks into Google Calendar events: https://yoxel.uservoice.com/forums/157147-general/suggestions/3105244-sync-hr-bc-tasks-as-google-calendar-events
- I’ve been experimenting with tinyletter.com, quite an interesting idea, which could be used as an alternative to blogging actually. Here is my subscription link if you care to read my nonsense 🙂
This is it for now.
-Cheers
Yoxel Personal to synchronize your tasks
June 29, 2011
Our user has commented nicely about Yoxel Personal sync in this Basecamp Answers thread (see last comment) https://answers.37signals.com/basecamp/2534-outlook-task-integration
Just want to add here that we can do the same now for Zoho Projects: http://yoxel.com/zoho-project-management.html Huddle connector is also coming.
Plus, we’re testing our contacts sync for Highrise and Google app: http://yoxel.com/highrise-synchronization.html
Is Your Inbox Overflowing?
January 24, 2011
I ran into this article today, It’s time to deal with that overflowing inbox, which re-iterates what we all experience with email today:
1) The growing number of e-mails, she explained, is hampering productivity among so-called knowledge workers who rely heavily on e-mail to get their jobs done and to stay on top of their personal lives.
2) “People with more than 100 messages in their inbox are less satisfied with the quality of their projects, more behind on them, and less likely to know what they need to work on at the start of a workday,” …
And another interesting fact, pointing out that corporate knowledge workers use email alot for project collaboration:
Right now, the average corporate employee spends 25 percent of his or her workday on e-mail-related tasks, according to Radicati, compared to 14 percent on face-to-face meetings and 9 percent on the phone.
The article suggests to clean-up your inbox regularly and delete email. But that, I think, is the option you’re left with when using your traditional email client. Email may contain valuable data and so removing it regularly just to make yourself more productive is not the best approach. I believe, organizing email better in ways that make it easy to find and know what is important at the moment, is the way to go.
You’ll probably need an additional app for this, or a new generation email client. GMail is a good one, but how do you manage your MS Exchange email with it? Xobni is an app that could help you with that though. We’re also developing the Yoxel PCM app that will help you manage email threads/conversations better for more productive project management.
Cheers
SCRUM over Email (without a project server)
December 14, 2010
Here is how you could implement basic scrum story tracking without signing up with any project server, simply using email. You’ll need to use our desktop app Yoxel PCM which scans your email inbox to help you track conversations and identify requests communicated in them.
- Install Yoxel PCM, connect it to your email account (i.e. GMail), see how here
- Flag/Star those email threads that represent scrum stories in your email client (or start new ones directly from Yoxel PCM)
- Yoxel PCM starts tracking conversations that you have identified and also presents them to you as chats
- As a conversation progresses, requests and responsible persons are identified.
- Each responsible person marks his/her ownership of a story and attaches personal tasks to it, all in their own Yoxel PCM. All this info is shared with the rest of the To/CC list and everyone is aware of who the owners are.
- As the owners progress on their tasks they mark their status (active, inwork, complete). As the matter of fact the app can tell the 1st two states automatically. Others, monitoring the conversation, see all these updates.
With this server-less model you dont get to see gantt or burndown charts but you can track all stories simply over email and empower individual functional members to plan and track the tasks associated with them.
Enjoy.