Blog →
by
Philippe Lehoux
January 31, 2020
· Updated on
Note: Deferred end of support date"In response to the unprecedented situation we are in and knowing that priorities have changed for many of our customers we have decided to postpone retiring Basic Authentication in Exchange Online (MC204828) for those tenants still actively using it until the second half of 2021. We will provide a more precise date when we have a better understanding of the impact of the situation." - Microsoft
No worries, Missive still supports Office 365, Outlook and IMAP. 😅
On October 13th, 2020, Microsoft will stop supporting username & password authentication for the IMAP and POP3 protocols.
In layman terms, any email application out there that connects to Microsoft email servers using IMAP or POP3 (Basic Authentication) will stop working.
Basic Authentication is a term used to explain how an application passes the username and password of a user. It can, in many scenarios, be an insecure method to handle credentials. Especially when a third-party is involved and has to store the user credentials to authenticate itself in the name of the user (cloud email application).
As an alternative Microsoft developed Modern Authentication (a Microsoft term), which is based on an authentication method called OAuth 2.0. This method doesn’t share passwords but instead uses authorization tokens (think of them as temporary passwords) to prove the identity between users and service providers.
The apps that connect to your Microsoft account will never receive the real password. You also get the possibility to revoke access to those apps from your Microsoft account. That in itself is a good thing!
The problem is Microsoft deprecating Basic Authentication is the kiss of death for a lot of email clients out there supporting only the IMAP/POP3 protocols. On October 13th, 2020, the only way for email clients to sync emails with Microsoft accounts will be to implement the proprietary Outlook REST API or the Exchange protocol.
Technically, the IMAP protocol supports OAuth 2.0 authentication via an extension; it’s how Gmail works. However, it is unlikely that Microsoft will support this on time. Incoming support has been recently announced, but no ETA was provided:
To make it easier to migrate your existing applications to use OAuth 2.0, we are making significant investments to our service that include OAuth 2.0 support for POP, IMAP, and background application support for Remote PowerShell MFA module. We will be sharing more information on these new features over the coming months.
For our users, this is not a problem; our syncing engine now supports Modern Authentication via Outlook REST API. As a cloud-based email client, not having to store and encrypt user passwords is a massive improvement. It’s just sad and unproductive Microsoft didn’t, out of the gate, offer IMAP connections with the OAuth 2.0 extension.
November 30, 2022
Retool Tutorial: Integrating Your Data into Missive
Learn how to use the Retool integration to add your data into the Missive Side Bar with this easy-to-follow...
The process of switching between multiple apps to get all the information you need is counterproductive.
You may experience this problem if you have to switch between your CRM and email client to access information about your client.
Wouldn't it be great to quickly access all of the information you need directly in your email?
If you are using Missive to manage your personal and team emails and you want to display data from your own database or from a Google Sheet, Retool is a good tool to use.
Here is a tutorial on how to use the Retool integration to add this data to Missive.
Retool is a powerful and flexible tool that helps you build custom internal applications quickly and easily. It provides a simple, but powerful, drag-and-drop interface that lets you add any data source to custom applications and share them with your team.
Retool is a great way to create a custom integration that connects a source of data with an application used by your team. You can easily use this low-code solution to build the internal tools you need to kickstart your team's productivity.
In this tutorial, we'll explore how to use Retool to display data from a Google Sheet next to your emails in Missive.
To be able to see the data of a Google spreadsheet alongside conversations, we'll need to query our Google Sheet document in a Retool application embedded in Missive.
We must first create three queries in our Retool application. To do so, let's log in to Retool and create a new app by clicking on Create new > App. If you don't already have one, create a Retool account.
Then we must create our data queries:
We can add a data source to your Retool application by clicking the + icon and selecting the Resource query. We will first create the query that gets the data of the selected conversation in Missive.
We can add a data source to your Retool application by clicking the + icon in the bottom left panel named Code and selecting Resource query.
To start let's create a query that will fetch the data of the selected conversation in Missive.
Below, we're calling the query getCurrentConversation , but feel free to change the name if you wish. The resource select should be set to ParentWindow and the selector input should be set to conversation.
The second query connects our Google Sheet to Retool. To create it, add a new query as we did previously. In Resource , select + Create a new resource. Then select Google Sheets and follow the instructions.
From there, we can select the spreadsheet you would like to connect to.
We can test with one that has the same columns as this one:
Lastly, we need to create the query that will merge the data from Missive with the spreadsheet. we'll simply name it query. For this one, select Query JSON with SQL as the Resource.
The query should be as follows:
select * from {{ googleSheet.data }} where Email = ANY({{getCurrentConversation.data.email_addresses.map(x => x.address.toLowerCase())}})
In a nutshell, this will find all of the rows in the spreadsheet where the email address is equal to at least one in the selected conversation in Missive.
Now that we have the correct data, we can build a simple user interface to display it. In the right panel of the Retool editor, select the Create tab, then drag and drop the Key Value component in your application.
Then select the dropped component and in the Inspect tab of the right panel and in the Data input paste {{ query.data[0] }}.
That's it! We've got a basic but functional application.
Before we try it in Missive, let's make some stylistic changes to the Retool application so it renders better in the Missive right sidebar.
For this, select the More menu at the top-right corner, then select the Scripts and styles option.
Then paste this CSS code:
._retool-container-table1 {
width: 100% !important;
}
._retool-container-keyValue1 {
width: 100% !important;
}
The ._retool-container-keyValue1
class name depends on the name of your component. Make sure to update it according to your component name.
This CSS will make the component dynamically resize with the Missive sidebar width.
It's time to try this in Missive! Copy the link View link of your application:
In Missive, open the Settings > Integrations and add a Retool integration, paste the copied link in the Retool public URL input:
Lastly, add this ?_embed=true at the end of the pasted URL. It will remove the Retool header from the integration for a far better look.
Also, make sure to disable the Enable mobile layout from your Retool app settings:
And here is the final result!
You can also take advantage of Missive JS API from your Retool app. Here are the steps to do so:
By default, Retool will block any communication between the app and its parent window (Missive). You can enable it in your Beta settings:
Add this script in the Scripts and styles section of your Retool app:
https://integrations.missiveapp.com/retool/missive-retool.js
You can now use the Missive JS API from your Retool app. You can, for example, add a link that will add new comments and tasks to the selected conversation:
November 17, 2022
Embracing Hard Limits
All software needs limits. Learn to embrace hard limits throughout your codebase in a proactive and...
All software needs limits. Almost every part of any software needs a hard limit. At least every part that deals with lists. In most languages and databases, this means arrays and strings.
This sounds obvious, but I suggest every engineer reading this open up their codebase and look around. Surely you have length validations here and there, but if you never dedicated half a day to go over all lists aiming to set a limit on each, you likely have several cracks remaining.
I do not mean obvious user-facing limits, such as “3 seats” or “15 days email history“ on our Free plan. I mean limits that 99% of users will never hit. For instance, pasting several paragraphs in your email subject instead of the body. Or likewise, typing the “Notes” of a contact in the “First name” field. Or everyone’s infinite loops you’ll be plagued with as soon as you introduce a public API.
The only scenario where you do not need a hard limit is when a list is always accessed through pagination. After all, pagination means there is already a LIMIT
involved.
I love hard limits. I love knowing they are there. I love introducing new ones with any new feature. Hard limits are key to keeping me asleep at night.
They are also low-effort; they don’t need public documentation. You naturally implement decent error messages for the few outliers that will hit them, but nobody needs to have these limits in mind to plan whether they will affect their business.
You should even make it a requirement to not have to disclose these limits. If you start seeing a significant enough number of exceptions, you’ve most likely just set it too low. The point is not to annoy or restrain users; it’s to avoid crashes. Increasing one limit from 500 to 1000 will not cause your app to crash, but it may make the difference between one user hitting that limit every month instead of every day.
It’s also an occasion to remember that our world is diverse. Stay humble, accept and embrace the fact that some of your customers will have use cases you never expected. Don’t fall into the trap of accusing people of misusing your software.
One day, we did have an organization hit a roadblock due to a limit and they emailed us. They needed to set over 25 custom fields on a contact. Did we ask them to explain their situation and figure how they could adjust their usage? Of course not. We had set that 25-limit arbitrarily at first so we could just as well increase it to 50. Problem solved!
I suggest you constraint yourself to a short list of numbers for all your limits:
1 • 5 • 10 • 50 • 100 • 500 • 1000 • 5000
These are the easiest to remember for anyone. There is also a wide enough gap between each to make decisions easy. It’s wasteful to wonder whether 100, 200 or 300 is appropriate. Any doubt 100 isn’t enough? Pick 500, that’s plenty!
“1” comes into play when used as KB or MB. What should be the max length of an HTML email body? I’m sure you’ll agree 1 MB is OK, given that’s roughly a Harry Potter book.
What size of JSON payload should our web server refuse to parse? Either 5 MB or 10 MB sounds great. The latter is what Amazon API Gateway uses.
When you reply to an email thread and we quote it under your response, where do we stop? 10 KB of quoted text for the win.
How many labels will you apply to that one conversation? I hope 100 is fine with you.
How many concurrent sessions do you need before you smell like multiple users not wanting to pay a fair price per seat? Never heard a soul needing more than 10.
The list goes on.
Hope you enjoyed this and will spend your next morning adding sweet limits all over your codebase. Do it, it’s fun! ✌️