{
    "componentChunkName": "component---src-templates-blog-template-js",
    "path": "/blog/introducing-gmail-wrapper",
    "result": {"data":{"markdownRemark":{"html":"<p>If you’ve ever had to read or write emails using the Official <a href=\"https://googleapis.github.io/google-api-python-client/docs/dyn/gmail_v1.html\">Gmail Python SDK</a>, then you know it is a pain for multiple reasons:</p>\n<ul>\n<li>It is verbose, using dozens of chained objects like <code class=\"language-text\">foo().bar().baz()</code></li>\n<li>It is not intuitive (How do I authenticate? How do I read my messages? How do I send a message? I don’t know...)</li>\n<li>It uses plain dictionaries as the default response, regardless of the number of classes used (What are the fields? I’ll have to look the docs again)</li>\n</ul>\n<p>We use Gmail for several automated tasks at Loadsmart, and to overcome these difficulties we developed <a href=\"https://github.com/loadsmart/gmail-wrapper\">gmail-wrapper</a>, a Python library that encapsulates the hard parts of the official SDK and provides an easier API.\nIt was a closed project used only internally, but now we decided to make it the first Loadsmart open-sourced Python package.\nHere are some comparisons with the official SDK:</p>\n<h3>Authenticate</h3>\n<p>For both official SDK and Gmail Wrapper, you will use the <a href=\"https://developers.google.com/identity/protocols/oauth2\">service account key</a> with a <a href=\"https://developers.google.com/identity/protocols/oauth2#5.-refresh-the-access-token,-if-necessary.\">refresh token</a>.\nIt is a JSON file like this:</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"token\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"...\"</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"client_id\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"...\"</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"client_secret\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"...\"</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"token_uri\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"...\"</span><span class=\"token punctuation\">,</span> <span class=\"token property\">\"refresh_token\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"...\"</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><strong>Official SDK</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> google<span class=\"token punctuation\">.</span>auth<span class=\"token punctuation\">.</span>transport<span class=\"token punctuation\">.</span>requests <span class=\"token keyword\">import</span> Request\n<span class=\"token keyword\">from</span> google<span class=\"token punctuation\">.</span>oauth2<span class=\"token punctuation\">.</span>credentials <span class=\"token keyword\">import</span> Credentials\n<span class=\"token keyword\">from</span> googleapiclient <span class=\"token keyword\">import</span> discovery\n\ncredentials <span class=\"token operator\">=</span> Credentials<span class=\"token punctuation\">(</span>\n    token<span class=\"token operator\">=</span>token<span class=\"token punctuation\">,</span>\n    refresh_token<span class=\"token operator\">=</span>refresh_token<span class=\"token punctuation\">,</span>\n    client_id<span class=\"token operator\">=</span>client_id<span class=\"token punctuation\">,</span>\n    client_secret<span class=\"token operator\">=</span>client_secret<span class=\"token punctuation\">,</span>\n    token_uri<span class=\"token operator\">=</span>token_uri<span class=\"token punctuation\">,</span>\n    scopes<span class=\"token operator\">=</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"https://www.googleapis.com/auth/gmail.modify\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">)</span>\ncredentials<span class=\"token punctuation\">.</span>refresh<span class=\"token punctuation\">(</span>Request<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">return</span> discovery<span class=\"token punctuation\">.</span>build<span class=\"token punctuation\">(</span><span class=\"token string\">\"gmail\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"v1\"</span><span class=\"token punctuation\">,</span> credentials<span class=\"token operator\">=</span>credentials<span class=\"token punctuation\">)</span></code></pre></div>\n<p><strong>Gmail Wrapper</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">from</span> gmail_wrapper <span class=\"token keyword\">import</span> GmailClient\n\nclient <span class=\"token operator\">=</span> GmailClient<span class=\"token punctuation\">(</span>\n    <span class=\"token string\">\"john.doe@example.org\"</span><span class=\"token punctuation\">,</span>\n    secrets_json_string<span class=\"token operator\">=</span><span class=\"token string\">\"{...}\"</span><span class=\"token punctuation\">,</span> <span class=\"token comment\"># Generated on your Google console</span>\n    scopes<span class=\"token operator\">=</span><span class=\"token punctuation\">[</span>GmailClient<span class=\"token punctuation\">.</span>SCOPE_MODIFY<span class=\"token punctuation\">]</span> <span class=\"token comment\"># Scope constants out of the box</span>\n<span class=\"token punctuation\">)</span></code></pre></div>\n<h3>List messages</h3>\n<p><strong>Official SDK</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">messages <span class=\"token operator\">=</span> client<span class=\"token punctuation\">.</span>users<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>messages<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token builtin\">list</span><span class=\"token punctuation\">(</span>userId<span class=\"token operator\">=</span><span class=\"token string\">\"john.doe@example.org\"</span><span class=\"token punctuation\">,</span> q<span class=\"token operator\">=</span><span class=\"token string\">\"receipts\"</span><span class=\"token punctuation\">,</span> maxResult<span class=\"token operator\">=</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>execute<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token comment\"># messages is now a dict with previews</span>\n<span class=\"token keyword\">for</span> preview <span class=\"token keyword\">in</span> messages<span class=\"token punctuation\">[</span><span class=\"token string\">\"messages\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n    message <span class=\"token operator\">=</span> client<span class=\"token punctuation\">.</span>users<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>messages<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span>userId<span class=\"token operator\">=</span><span class=\"token string\">\"john.doe@example.org\"</span><span class=\"token punctuation\">,</span> <span class=\"token builtin\">id</span><span class=\"token operator\">=</span>preview<span class=\"token punctuation\">[</span><span class=\"token string\">\"id\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">for</span> header <span class=\"token keyword\">in</span> message<span class=\"token punctuation\">[</span><span class=\"token string\">\"payload\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"headers\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">if</span> header<span class=\"token punctuation\">[</span><span class=\"token string\">\"name\"</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">==</span> <span class=\"token string\">\"Subject\"</span><span class=\"token punctuation\">:</span>\n            <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>header<span class=\"token punctuation\">[</span><span class=\"token string\">\"value\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p><strong>Gmail Wrapper</strong></p>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">messages <span class=\"token operator\">=</span> client<span class=\"token punctuation\">.</span>get_messages<span class=\"token punctuation\">(</span>query<span class=\"token operator\">=</span><span class=\"token string\">\"receipts\"</span><span class=\"token punctuation\">,</span> limit<span class=\"token operator\">=</span><span class=\"token number\">10</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">for</span> message <span class=\"token keyword\">in</span> messages<span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span>message<span class=\"token punctuation\">.</span>subject<span class=\"token punctuation\">)</span> <span class=\"token comment\"># Gmail Wrapper will automatically lazy-load the properties as you need them</span></code></pre></div>\n<h3>How can I use it?</h3>\n<p>From the examples you could have a taste of the official SDK difficulties and how a higher-level library can help (We did not even mention <a href=\"https://developers.google.com/gmail/api/guides/sending#creating_messages\">composing</a> messages, <a href=\"https://stackoverflow.com/questions/32589476/how-to-send-a-reply-with-gmail-api/32591614#32591614\">replying</a> to messages, or reading attachments).</p>\n<p>If you are interested in learning more about this package there is detailed documentation on the GitHub repository.</p>\n<p>To install, you already guess it: <code class=\"language-text\">pip install gmail-wrapper</code></p>\n<p>Of course the initial build of Gmail Wrapper has limitations.\nFor example, sending emails with attachments or authenticating with non-renewable tokens is not possible.\nHowever, these are solvable issues that can easily be addressed by the community.\nSo please don’t forget to contribute if you find any bugs or if you think something can be improved!\nWe will be more than happy to review your suggestions or pull-requests.</p>","excerpt":"If you’ve ever had to read or write emails using the Official Gmail Python SDK, then you know it is a pain for multiple reasons: It is verbose, using dozens of chained objects like  It is not intuitive (How do I authenticate? How do I read my messages? How do I send a message? I don’t know...) It uses plain dictionaries as the default response, regardless of the number of classes used (What are the fields? I’ll have to look the docs again) We use Gmail for several automated tasks at Loadsmart…","frontmatter":{"date":"July 22, 2020","path":"/blog/introducing-gmail-wrapper","title":"Introducing Gmail Wrapper","comments":true,"author":"Luiz Rosa"},"fields":{"readingTime":{"text":"3 min read"}}}},"pageContext":{}},
    "staticQueryHashes": ["63159454"]}