<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Pedro Cabido - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Pedro Cabido - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Wed, 24 Jun 2026 09:44:49 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/pedrocabido/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Enviar e-mails usando Python ]]>
                </title>
                <description>
                    <![CDATA[ Tradução em português continental (europeu) Como um exercício de aprendizagem, recentemente eu fui a fundo no Python 3 para ver como é que conseguiria enviar uma certa quantidade de e-mails. Poderão haver métodos mais simples de fazer isto em ambiente de produção. No entanto, este método resultou para mim. Portanto, ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/enviar-emails-usando-python/</link>
                <guid isPermaLink="false">61fc5e7853557304fa19eac9</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Pedro Cabido ]]>
                </dc:creator>
                <pubDate>Sat, 12 Feb 2022 05:18:41 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/02/1_qTKddOEkMZiri9ldfzBauQ.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/send-emails-using-code-4fcea9df63f/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Send Emails Using Python</a>
      </p><p><em>Tradução em português continental (europeu)</em></p><p>Como um exercício de aprendizagem, recentemente eu fui a fundo no Python 3 para ver como é que conseguiria enviar uma certa quantidade de e-mails. Poderão haver métodos mais simples de fazer isto em ambiente de produção. No entanto, este método resultou para mim.</p><p>Portanto, este é o cenário: temos os nomes e endereços de e-mail de um grupo de contactos. Vamos querer enviar uma mensagem para cada um desses contactos, enquanto adicionamos "<em>Querido [nome]</em>" ao topo da mensagem.</p><p>Por uma questão de simplicidade, guardaremos os detalhes dos contactos em um ficheiro em vez de em uma base de dados. Também poderemos guardar o template da mensagem que desejamos enviar num ficheiro.</p><p>O módulo <a href="https://docs.python.org/pt-br/3/library/smtplib.html">smtplib</a> do Python é basicamente tudo o que precisamos para enviar e-mails simples, sem linha de assunto ou outra informação adicional. Mas, para e-mails reais, precisamos de linhas de assunto e muitas outras informações - talvez até imagens e anexos.</p><p>É aqui que o <a href="https://docs.python.org/pt-br/3/library/email.html">módulo de e-mail</a> do Python nos é útil. Atenção que não é possível enviar mensagens de e-mail usando exclusivamente o módulo de <code>email</code>. Precisamos de uma combinação do <code>email</code> e do <code>smtplib</code>.</p><p>É aconselhável ver a documentação oficial completa de ambos os módulos.</p><p>Aqui estão os quatro passos básicos para enviar e-mails usando Python:</p><ol><li>Configurar o servidor SMTP e conectar-se à sua conta.</li><li>Criar o objecto da mensagem <code>MIMEMultipart</code> e adicionar-lhe os cabeçalhos apropriados para <code>From</code>, <code>To</code> e para o campo <code>Subject</code>.</li><li>Adicionar o corpo da mensagem.</li><li>Enviar a mensagem usando o servidor SMTP.</li></ol><p>Agora, vou guiá-lo por todo o processo.</p><p>Vamos dizer que temos o ficheiro de contactos <code>mycontacts.txt</code> como o seguinte:</p><pre><code class="language-bash">user@computer ~ $ cat mycontacts.txt
john johndoe@example.com
katie katie2016@example.com</code></pre><p>Cada linha representa um único contacto. Temos o nome seguido do endereço de e-mail. Estamos a guardar tudo em letras minúsculas. Vamos deixar para a lógica do programa, converter qualquer campo para letras maiúsculas ou para início de frase se necessário. Tudo isto é muito fácil em Python.</p><p>De seguida, temos o template da mensagem no ficheiro <code>message.txt</code>.</p><pre><code class="language-bash">user@computer ~ $ cat message.txt 

Querido ${PERSON_NAME}, 

Isto é uma mensagem de teste.
Tenha um bom fim-de-semana.

Cumprimentos.</code></pre><p>Reparou na palavra “<code>${PERSON_NAME}</code>”? Isto é um <em><a href="https://docs.python.org/pt-br/3.10/library/string.html#template-strings">template string</a> </em>em Python<em>. Template strings</em> podem ser trocadas facilmente com outras <em>strings</em>; neste exemplo, <code>${PERSON_NAME}</code> vai ser trocado pelo nome da pessoa, &nbsp;como veremos de seguida.</p><p>Agora, vamos começar com o código em Python. Primeiro, precisamos de ler os contactos do ficheiro <code>mycontacts.txt</code>. Vamos também generalizar isto na sua própria função.</p><!--kg-card-begin: html--><table class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="Python" data-tagsearch-path="read_contacts.py" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400; font-stretch: inherit; line-height: 1.4; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: var(--color-canvas-default); color: rgb(51, 51, 51);"><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-read_contacts-py-L1" class="blob-num js-line-number js-code-nav-line-number" data-line-number="1" style="box-sizing: inherit; margin: 0px; padding-top: 4px; padding-right: 10px !important; padding-bottom: 1px !important; padding-left: 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-read_contacts-py-LC1" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding-top: 4px; padding-right: 10px !important; padding-bottom: 1px !important; padding-left: 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);"><span class="pl-c" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(106, 115, 125);"># Function to read the contacts from a given contact file and return a</span></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-read_contacts-py-L2" class="blob-num js-line-number js-code-nav-line-number" data-line-number="2" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-read_contacts-py-LC2" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);"><span class="pl-c" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(106, 115, 125);"># list of names and email addresses</span></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-read_contacts-py-L3" class="blob-num js-line-number js-code-nav-line-number" data-line-number="3" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-read_contacts-py-LC3" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);"><span class="pl-k" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(215, 58, 73);">def</span> <span class="pl-en" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(111, 66, 193);">get_contacts</span>(<span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">filename</span>):</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-read_contacts-py-L4" class="blob-num js-line-number js-code-nav-line-number" data-line-number="4" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-read_contacts-py-LC4" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">    <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">names</span> <span class="pl-c1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(0, 92, 197);">=</span> []</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-read_contacts-py-L5" class="blob-num js-line-number js-code-nav-line-number" data-line-number="5" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-read_contacts-py-LC5" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">    <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">emails</span> <span class="pl-c1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(0, 92, 197);">=</span> []</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-read_contacts-py-L6" class="blob-num js-line-number js-code-nav-line-number" data-line-number="6" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-read_contacts-py-LC6" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">    <span class="pl-k" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(215, 58, 73);">with</span> <span class="pl-en" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(111, 66, 193);">open</span>(<span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">filename</span>, <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">mode</span><span class="pl-c1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(0, 92, 197);">=</span><span class="pl-s" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(3, 47, 98);">'r'</span>, <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">encoding</span><span class="pl-c1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(0, 92, 197);">=</span><span class="pl-s" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(3, 47, 98);">'utf-8'</span>) <span class="pl-k" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(215, 58, 73);">as</span> <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">contacts_file</span>:</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-read_contacts-py-L7" class="blob-num js-line-number js-code-nav-line-number" data-line-number="7" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-read_contacts-py-LC7" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">        <span class="pl-k" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(215, 58, 73);">for</span> <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">a_contact</span> <span class="pl-c1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(0, 92, 197);">in</span> <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">contacts_file</span>:</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-read_contacts-py-L8" class="blob-num js-line-number js-code-nav-line-number" data-line-number="8" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-read_contacts-py-LC8" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">            <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">names</span>.<span class="pl-en" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(111, 66, 193);">append</span>(<span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">a_contact</span>.<span class="pl-en" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(111, 66, 193);">split</span>()[<span class="pl-c1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(0, 92, 197);">0</span>])</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-read_contacts-py-L9" class="blob-num js-line-number js-code-nav-line-number" data-line-number="9" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-read_contacts-py-LC9" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">            <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">emails</span>.<span class="pl-en" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(111, 66, 193);">append</span>(<span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">a_contact</span>.<span class="pl-en" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(111, 66, 193);">split</span>()[<span class="pl-c1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(0, 92, 197);">1</span>])</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-read_contacts-py-L10" class="blob-num js-line-number js-code-nav-line-number" data-line-number="10" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-read_contacts-py-LC10" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">    <span class="pl-k" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(215, 58, 73);">return</span> <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">names</span>, <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">emails</span></td></tr></tbody></table><!--kg-card-end: html--><p><a href="https://gist.github.com/anonymous/8cadf1b238f5dfea2e29133cb3026670/raw/39a08994f3d46f20a3ff3cf9b7e8ba7117ac4cf3/read_contacts.py">view raw</a><a href="https://gist.github.com/anonymous/8cadf1b238f5dfea2e29133cb3026670#file-read_contacts-py">read_contacts.py</a>, hospedado com ❤ no <a href="https://github.com/">GitHub</a></p><p>A função <code>get_contacts()</code> recebe um nome de um ficheiro como argumento. Ela abrirá o ficheiro, lerá cada linha (ou seja, cada contacto), dividirá no nome e no e-mail e depois vai acrescentá-los em duas listas separadas. Finalmente, a função retorna as duas listas.</p><p>Também precisamos de uma função para ler o ficheiro do template (como o <code>message.txt</code>) e retornar um objecto <code>Template</code> feito com os seus conteúdos.</p><!--kg-card-begin: html--><table class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="Python" data-tagsearch-path="read_template.py" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400; font-stretch: inherit; line-height: 1.4; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: var(--color-canvas-default); color: rgb(51, 51, 51);"><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-read_template-py-L1" class="blob-num js-line-number js-code-nav-line-number" data-line-number="1" style="box-sizing: inherit; margin: 0px; padding-top: 4px; padding-right: 10px !important; padding-bottom: 1px !important; padding-left: 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 28.2344px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-read_template-py-LC1" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding-top: 4px; padding-right: 10px !important; padding-bottom: 1px !important; padding-left: 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);"><span class="pl-k" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(215, 58, 73);">from</span> <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">string</span> <span class="pl-k" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(215, 58, 73);">import</span> <span class="pl-v" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(227, 98, 9);">Template</span></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-read_template-py-L2" class="blob-num js-line-number js-code-nav-line-number" data-line-number="2" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 28.2344px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-read_template-py-LC2" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">
</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-read_template-py-L3" class="blob-num js-line-number js-code-nav-line-number" data-line-number="3" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 28.2344px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-read_template-py-LC3" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);"><span class="pl-k" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(215, 58, 73);">def</span> <span class="pl-en" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(111, 66, 193);">read_template</span>(<span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">filename</span>):</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-read_template-py-L4" class="blob-num js-line-number js-code-nav-line-number" data-line-number="4" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 28.2344px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-read_template-py-LC4" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">    <span class="pl-k" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(215, 58, 73);">with</span> <span class="pl-en" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(111, 66, 193);">open</span>(<span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">filename</span>, <span class="pl-s" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(3, 47, 98);">'r'</span>, <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">encoding</span><span class="pl-c1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(0, 92, 197);">=</span><span class="pl-s" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(3, 47, 98);">'utf-8'</span>) <span class="pl-k" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(215, 58, 73);">as</span> <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">template_file</span>:</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-read_template-py-L5" class="blob-num js-line-number js-code-nav-line-number" data-line-number="5" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 28.2344px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-read_template-py-LC5" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">        <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">template_file_content</span> <span class="pl-c1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(0, 92, 197);">=</span> <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">template_file</span>.<span class="pl-en" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(111, 66, 193);">read</span>()</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-read_template-py-L6" class="blob-num js-line-number js-code-nav-line-number" data-line-number="6" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 28.2344px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-read_template-py-LC6" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">    <span class="pl-k" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(215, 58, 73);">return</span> <span class="pl-v" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(227, 98, 9);">Template</span>(<span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">template_file_content</span>)</td></tr></tbody></table><!--kg-card-end: html--><p><a href="https://gist.github.com/anonymous/7829542adaf1714ad9bc472eef94afe2/raw/7448fd6d86886e4e80cf274f9775449fa84857b3/read_template.py">view raw</a><a href="https://gist.github.com/anonymous/7829542adaf1714ad9bc472eef94afe2#file-read_template-py">read_template.py</a>, hospedado com ❤ no <a href="https://github.com/">GitHub</a></p><p>Tal como a função anterior, esta também recebe o nome do ficheiro como argumento.</p><p>Para enviar o e-mail, vamos ter de usar o <a href="https://pt.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol">SMTP (Simple Mail Transfer Protocol)</a>. Como mencionado anteriormente, o Python fornece bibliotecas para gerir esta tarefa.</p><!--kg-card-begin: html--><table class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="Python" data-tagsearch-path="setup_smtp.py" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400; font-stretch: inherit; line-height: 1.4; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: var(--color-canvas-default); color: rgb(51, 51, 51);"><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-setup_smtp-py-L1" class="blob-num js-line-number js-code-nav-line-number" data-line-number="1" style="box-sizing: inherit; margin: 0px; padding-top: 4px; padding-right: 10px !important; padding-bottom: 1px !important; padding-left: 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 28.2344px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-setup_smtp-py-LC1" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding-top: 4px; padding-right: 10px !important; padding-bottom: 1px !important; padding-left: 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);"><span class="pl-c" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(106, 115, 125);"># import the smtplib module. It should be included in Python by default</span></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-setup_smtp-py-L2" class="blob-num js-line-number js-code-nav-line-number" data-line-number="2" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 28.2344px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-setup_smtp-py-LC2" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);"><span class="pl-k" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(215, 58, 73);">import</span> <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">smtplib</span></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-setup_smtp-py-L3" class="blob-num js-line-number js-code-nav-line-number" data-line-number="3" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 28.2344px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-setup_smtp-py-LC3" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);"><span class="pl-c" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(106, 115, 125);"># set up the SMTP server</span></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-setup_smtp-py-L4" class="blob-num js-line-number js-code-nav-line-number" data-line-number="4" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 28.2344px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-setup_smtp-py-LC4" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);"><span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">s</span> <span class="pl-c1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(0, 92, 197);">=</span> <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">smtplib</span>.<span class="pl-v" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(227, 98, 9);">SMTP</span>(<span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">host</span><span class="pl-c1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(0, 92, 197);">=</span><span class="pl-s" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(3, 47, 98);">'your_host_address_here'</span>, <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">port</span><span class="pl-c1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(0, 92, 197);">=</span><span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">your_port_here</span>)</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-setup_smtp-py-L5" class="blob-num js-line-number js-code-nav-line-number" data-line-number="5" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 28.2344px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-setup_smtp-py-LC5" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);"><span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">s</span>.<span class="pl-en" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(111, 66, 193);">starttls</span>()</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-setup_smtp-py-L6" class="blob-num js-line-number js-code-nav-line-number" data-line-number="6" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 28.2344px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-setup_smtp-py-LC6" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);"><span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">s</span>.<span class="pl-en" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(111, 66, 193);">login</span>(<span class="pl-v" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(227, 98, 9);">MY_ADDRESS</span>, <span class="pl-v" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(227, 98, 9);">PASSWORD</span>)</td></tr></tbody></table><!--kg-card-end: html--><p><a href="https://gist.github.com/anonymous/6f021d0916da60b0d6441726be9446aa/raw/d8a87112243b94f819bddb3174ebd9ca747d3bae/setup_smtp.py">view raw</a><a href="https://gist.github.com/anonymous/6f021d0916da60b0d6441726be9446aa#file-setup_smtp-py">setup_smtp.py</a>, hospedado com ❤ no <a href="https://github.com/">GitHub</a></p><p>No código acima, vamos importar a <code>smtplib</code> e então criar a <a href="https://docs.python.org/pt-br/3/library/smtplib.html#smtplib.SMTP">instância SMTP</a> que vai encapsular a ligação SMTP. Ela recebe como parâmetro o endereço do host e o número da porta. Ambos dependem inteiramente nas definições de SMTP do nosso provedor de e-mail particular. No caso do Outlook, por exemplo, a linha 4 de cima seria:</p><pre><code class="language-py">s = smtplib.SMTP(host='smtp-mail.outlook.com', port=587)</code></pre><p>Aqui, deverá ser utilizado o endereço do host e o número da porta do nosso fornecedor de e-mail para que tudo funcione.</p><p><code>MY_ADDRESS</code> e <code>PASSWORD</code> acima, são duas variáveis que mantêm o endereço de e-mail completo e a password da conta que estamos a utilizar.</p><p>Agora, será um bom momento para extrair a informação de contacto e o template da mensagem usando as funções que definimos acima.</p><pre><code class="language-py">names, emails = get_contacts('mycontacts.txt')  # lê contactos
message_template = read_template('message.txt')</code></pre><p>Agora, para cada um dos contactos, vamos enviar um e-mail separado.</p><!--kg-card-begin: html--><table class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="Python" data-tagsearch-path="send_email.py" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 400; font-stretch: inherit; line-height: 1.4; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: var(--color-canvas-default); color: rgb(51, 51, 51);"><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-send_email-py-L1" class="blob-num js-line-number js-code-nav-line-number" data-line-number="1" style="box-sizing: inherit; margin: 0px; padding-top: 4px; padding-right: 10px !important; padding-bottom: 1px !important; padding-left: 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC1" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding-top: 4px; padding-right: 10px !important; padding-bottom: 1px !important; padding-left: 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);"><span class="pl-c" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(106, 115, 125);"># import necessary packages</span></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-send_email-py-L2" class="blob-num js-line-number js-code-nav-line-number" data-line-number="2" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC2" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);"><span class="pl-k" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(215, 58, 73);">from</span> <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">email</span>.<span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">mime</span>.<span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">multipart</span> <span class="pl-k" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(215, 58, 73);">import</span> <span class="pl-v" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(227, 98, 9);">MIMEMultipart</span></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-send_email-py-L3" class="blob-num js-line-number js-code-nav-line-number" data-line-number="3" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC3" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);"><span class="pl-k" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(215, 58, 73);">from</span> <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">email</span>.<span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">mime</span>.<span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">text</span> <span class="pl-k" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(215, 58, 73);">import</span> <span class="pl-v" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(227, 98, 9);">MIMEText</span></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-send_email-py-L4" class="blob-num js-line-number js-code-nav-line-number" data-line-number="4" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC4" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">
</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-send_email-py-L5" class="blob-num js-line-number js-code-nav-line-number" data-line-number="5" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC5" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);"><span class="pl-c" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(106, 115, 125);"># For each contact, send the email:</span></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-send_email-py-L6" class="blob-num js-line-number js-code-nav-line-number" data-line-number="6" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC6" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);"><span class="pl-k" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(215, 58, 73);">for</span> <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">name</span>, <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">email</span> <span class="pl-c1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(0, 92, 197);">in</span> <span class="pl-en" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(111, 66, 193);">zip</span>(<span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">names</span>, <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">emails</span>):</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-send_email-py-L7" class="blob-num js-line-number js-code-nav-line-number" data-line-number="7" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC7" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">    <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">msg</span> <span class="pl-c1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(0, 92, 197);">=</span> <span class="pl-v" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(227, 98, 9);">MIMEMultipart</span>()       <span class="pl-c" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(106, 115, 125);"># create a message</span></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-send_email-py-L8" class="blob-num js-line-number js-code-nav-line-number" data-line-number="8" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC8" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">
</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-send_email-py-L9" class="blob-num js-line-number js-code-nav-line-number" data-line-number="9" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC9" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">    <span class="pl-c" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(106, 115, 125);"># add in the actual person name to the message template</span></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-send_email-py-L10" class="blob-num js-line-number js-code-nav-line-number" data-line-number="10" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC10" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">    <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">message</span> <span class="pl-c1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(0, 92, 197);">=</span> <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">message_template</span>.<span class="pl-en" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(111, 66, 193);">substitute</span>(<span class="pl-v" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(227, 98, 9);">PERSON_NAME</span><span class="pl-c1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(0, 92, 197);">=</span><span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">name</span>.<span class="pl-en" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(111, 66, 193);">title</span>())</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-send_email-py-L11" class="blob-num js-line-number js-code-nav-line-number" data-line-number="11" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC11" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">
</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-send_email-py-L12" class="blob-num js-line-number js-code-nav-line-number" data-line-number="12" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC12" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">    <span class="pl-c" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(106, 115, 125);"># setup the parameters of the message</span></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-send_email-py-L13" class="blob-num js-line-number js-code-nav-line-number" data-line-number="13" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC13" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">    <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">msg</span>[<span class="pl-s" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(3, 47, 98);">'From'</span>]<span class="pl-c1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(0, 92, 197);">=</span><span class="pl-v" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(227, 98, 9);">MY_ADDRESS</span></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-send_email-py-L14" class="blob-num js-line-number js-code-nav-line-number" data-line-number="14" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC14" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">    <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">msg</span>[<span class="pl-s" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(3, 47, 98);">'To'</span>]<span class="pl-c1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(0, 92, 197);">=</span><span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">email</span></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-send_email-py-L15" class="blob-num js-line-number js-code-nav-line-number" data-line-number="15" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC15" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">    <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">msg</span>[<span class="pl-s" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(3, 47, 98);">'Subject'</span>]<span class="pl-c1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(0, 92, 197);">=</span><span class="pl-s" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(3, 47, 98);">"This is TEST"</span></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-send_email-py-L16" class="blob-num js-line-number js-code-nav-line-number" data-line-number="16" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC16" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">
</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-send_email-py-L17" class="blob-num js-line-number js-code-nav-line-number" data-line-number="17" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC17" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">    <span class="pl-c" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(106, 115, 125);"># add in the message body</span></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-send_email-py-L18" class="blob-num js-line-number js-code-nav-line-number" data-line-number="18" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC18" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">    <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">msg</span>.<span class="pl-en" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(111, 66, 193);">attach</span>(<span class="pl-v" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(227, 98, 9);">MIMEText</span>(<span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">message</span>, <span class="pl-s" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(3, 47, 98);">'plain'</span>))</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-send_email-py-L19" class="blob-num js-line-number js-code-nav-line-number" data-line-number="19" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC19" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">
</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-send_email-py-L20" class="blob-num js-line-number js-code-nav-line-number" data-line-number="20" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC20" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">    <span class="pl-c" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(106, 115, 125);"># send the message via the server set up earlier.</span></td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-send_email-py-L21" class="blob-num js-line-number js-code-nav-line-number" data-line-number="21" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC21" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">    <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">s</span>.<span class="pl-en" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(111, 66, 193);">send_message</span>(<span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">msg</span>)</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; background-color: transparent;"><td id="file-send_email-py-L22" class="blob-num js-line-number js-code-nav-line-number" data-line-number="22" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC22" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">    </td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;"><td id="file-send_email-py-L23" class="blob-num js-line-number js-code-nav-line-number" data-line-number="23" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: var(--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; width: 35.4531px; min-width: inherit; color: var(--color-fg-subtle); text-align: right; white-space: nowrap; cursor: pointer; user-select: none; background: linear-gradient(to right, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 0% 0% / 20px 100% no-repeat rgba(0, 0, 0, 0);"></td><td id="file-send_email-py-LC23" class="blob-code blob-code-inner js-file-line" style="box-sizing: inherit; margin: 0px; padding: 1px 10px !important; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 20px; font-family: ui-monospace, SFMono-Regular, &quot;SF Mono&quot;, Menlo, Consolas, &quot;Liberation Mono&quot;, monospace; font-size: 12px; vertical-align: top; position: relative; overflow: visible; color: var(--color-fg-default); overflow-wrap: normal; white-space: pre; text-align: left; background: linear-gradient(to left, rgb(255, 255, 255) 50%, rgba(255, 255, 255, 0) 100%) 100% 0px / 20px 100% no-repeat rgba(0, 0, 0, 0);">    <span class="pl-k" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline; color: rgb(215, 58, 73);">del</span> <span class="pl-s1" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 12px; vertical-align: baseline;">msg</span></td></tr></tbody></table><!--kg-card-end: html--><p><a href="https://gist.github.com/anonymous/2c6e97c2cdedd00471f4f4b42ea0662d/raw/ab815803b1d1c0bd19b126b7a98d37b9e4c10f34/send_email.py">view raw</a><a href="https://gist.github.com/anonymous/2c6e97c2cdedd00471f4f4b42ea0662d#file-send_email-py">send_email.py</a>, hospedado com❤ no <a href="https://github.com/">GitHub</a></p><p>Para cada <code>name</code> e <code>email</code> (do ficheiro de contactos), vamos criar um objecto <a href="https://docs.python.org/pt-br/3/library/email.mime.html#email.mime.multipart.MIMEMultipart">MIMEMultipart</a>, configurando os headers do tipo conteúdo <code>From</code>, <code>To</code>, <code>Subject</code> como um dicionário de palavras-chave. Depois, vamos anexar o corpo da mensagem ao objecto <code>MIMEMultipart</code> como simples texto. Será relevante ler a documentação para encontrar mais informação sobre outros tipos de MIME que é possível experimentar.</p><p>Também, de notar na linha 10 (do código acima), que estamos a substituir <code>${PERSON_NAME}</code> com o nome que está a ser extraído do ficheiro de contactos usando o <a href="https://docs.python.org/pt-br/3.10/library/string.html#template-strings">mecanismo de templates em Python</a>.</p><p>Neste caso em particular, &nbsp;estamos a eliminar o objecto <code>MIMEMultipart</code> e a recriá-lo de cada vez que iterarmos através do ciclo <em>for</em>.</p><p>Assim que isto está feito, poderemos enviar mensagens usando a útil função do objecto SMTP <a href="https://docs.python.org/pt-br/3/library/smtplib.html#smtplib.SMTP.send_message">send_message()</a>, a qual criámos anteriormente.</p><p>Aqui está o código completo:</p><p>E aqui estamos! Acredito que o código agora é suficientemente claro.</p><p>Fique à vontade para copiar o código e alterá-lo como for necessário.</p><p>Para além da documentação oficial do Python, também quero mencionar <a href="http://naelshiab.com/tutorial-send-email-python/">este recurso</a> (em inglês), que me ajudou imenso.</p><p>Feliz programação :)</p><p><em>Este post foi originalmente publicado <a href="https://arjunkrishnababu96.gitlab.io/post/send-emails-using-code/">aqui</a> (em inglês). Obrigado pela leitura!</em></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial de React Router – como usar render, redirect, switch, link e mais, com exemplos de código ]]>
                </title>
                <description>
                    <![CDATA[ Traduç [/portuguese/news/author/pedrocabido]ão em português continental (europeu) Se só agora começou com React, provavelmente a sua cabeça ainda está a dar voltas relativamente ao conceito de Single-Page App (SPA) ou Aplicação de Página Única. Tradicionalmente, o roteamento funciona assim: vamos imaginar que escreveu  /contact como URL. O navegador, então, fará ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/tutorial-de-react-router-como-usar-render-redirect-switch-link-e-mais-com-exemplos-de-codigo/</link>
                <guid isPermaLink="false">61f6517853557304fa19d147</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Pedro Cabido ]]>
                </dc:creator>
                <pubDate>Thu, 10 Feb 2022 12:40:17 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/02/5f9c9ad1740569d1a4ca27f2.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/react-router-tutorial/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">React Router Tutorial – How to Render, Redirect, Switch, Link, and More, With Code Examples</a>
      </p><p><em>Tradu<a href="https://www.freecodecamp.org/portuguese/news/author/pedrocabido">ç</a>ão em português continental (europeu)</em></p><p>Se só agora começou com React, provavelmente a sua cabeça ainda está a dar voltas relativamente ao conceito de Single-Page App (SPA) ou Aplicação de Página Única.</p><p>Tradicionalmente, o roteamento funciona assim: vamos imaginar que escreveu <code>/contact</code> como URL. O navegador, então, fará uma solicitação GET para o servidor e este devolverá uma página HTML como resposta.</p><p>Com o novo paradigma de SPA, no entanto, todos as solicitações do URL são servidos usando código do lado do client.</p><p>Se aplicarmos isto ao contexto do React, cada página será um componente do React. O React-Router combina o URL e carrega o componente para essa página específica.</p><p>Tudo acontece tão rápido e na perfeição, que o utilizador obtém uma experiência parecida com uma aplicação nativa no navegador. Não há uma página branca entre as transições de roteamento.</p><p>Neste artigo, aprenderemos como usar o React-Router e seus componentes para criar uma Single-Page App. Para isso, vamos abrir o nosso editor de texto favorito e vamos começar.</p><h2 id="configurar-o-projecto"><strong>Configurar o projecto</strong></h2><p>Vamos criar um novo projecto do React correndo o seguinte comando:</p><pre><code class="language-sh">yarn create react-app react-router-demo</code></pre><p>Usaremos o yarn para instalar dependências, mas, em alternativa, também poderá ser utilizado o npm.</p><p>A seguir, vamos instalar o <code>react-router-dom</code>.</p><pre><code>yarn add react-router-dom</code></pre><p>Para o estilo dos componentes, usaremos o framework Bulma CSS. Por isso, vamos adicioná-la também.</p><pre><code>yarn add bulma</code></pre><p>A seguir, vamos importar <code>bulma.min.css</code> no ficheiro <code>index.js</code> e limpar todo o código desnecessário do ficheiro <code>App.js</code>.</p><pre><code class="language-js">import "bulma/css/bulma.min.css";</code></pre><p>Agora que temos o projecto configurado, vamos começar por criar alguns componentes da página.</p><h2 id="criar-os-componentes-da-p-gina"><strong>Criar os componentes da página</strong></h2><p>Vamos criar a pasta pages dentro da pasta src, onde colocaremos todos os componentes da página.</p><p>Para esta demonstração, vamos criar três páginas - a página principal (Home), Sobre (About) e a página do perfil (Profile).</p><p>Vamos colar o seguinte código nos componentes Home e About.</p><pre><code class="language-jsx">// pages/Home.js

import React from "react";

const Home = () =&gt; (
  &lt;div&gt;
    &lt;h1 className="title is-1"&gt;Esta é a página principal&lt;/h1&gt;
    &lt;p&gt;
      Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras gravida,
      risus at dapibus aliquet, elit quam scelerisque tortor, nec accumsan eros
      nulla interdum justo. Pellentesque dignissim, sapien et congue rutrum,
      lorem tortor dapibus turpis, sit amet vestibulum eros mi et odio.
    &lt;/p&gt;
  &lt;/div&gt;
);

export default Home;
</code></pre><pre><code class="language-jsx">// pages/About.js

import React from "react";

const About = () =&gt; (
  &lt;div&gt;
    &lt;h1 className="title is-1"&gt;Esta é a página Sobre&lt;/h1&gt;
    &lt;p&gt;
      Class aptent taciti sociosqu ad litora torquent per conubia nostra, per
      inceptos himenaeos. Vestibulum ante ipsum primis in faucibus orci luctus
      et ultrices posuere cubilia curae; Duis consequat nulla ac ex consequat,
      in efficitur arcu congue. Nam fermentum commodo egestas.
    &lt;/p&gt;
  &lt;/div&gt;
);

export default About;
</code></pre><p>Mais tarde, no artigo, criaremos a página de perfil.</p><h2 id="criar-o-componente-navbar"><strong>Criar o componente Navbar</strong></h2><p>Vamos começar por criar a barra de navegação para a nossa aplicação. Este componente fará uso do componente &lt;NavLink /&gt; do react-router-dom.<br><br>Vamos criar a pasta "components" dentro da pasta src.</p><pre><code class="language-jsx">// components/Navbar.js

import React, { useState } from "react";
import { NavLink } from "react-router-dom";

const Navbar = () =&gt; {
  const [isOpen, setOpen] = useState(false);
  return ( 
  	&lt;nav
      className="navbar is-primary"
      role="navigation"
      aria-label="main navigation"
    &gt;
      &lt;div className="container"&gt;
      	{/* ... */}
      &lt;/div&gt;
    &lt;/nav&gt;
  );
 };
 
 export default Navbar;</code></pre><p>A variável de estado <code>isOpen</code> será usada para acionar o menu nos dispositivos móveis ou tablets.</p><p>Para isso, vamos adicionar o menu <em>hamburguer</em>.</p><pre><code class="language-jsx">const Navbar = () =&gt; {
  const [isOpen, setOpen] = useState(false);
  return ( 
  	&lt;nav
      className="navbar is-primary"
      role="navigation"
      aria-label="main navigation"
    &gt;
      &lt;div className="container"&gt;
      &lt;div className="navbar-brand"&gt;
          &lt;a
            role="button"
            className={`navbar-burger burger ${isOpen &amp;&amp; "is-active"}`}
            aria-label="menu"
            aria-expanded="false"
            onClick={() =&gt; setOpen(!isOpen)}
          &gt;
            &lt;span aria-hidden="true"&gt;&lt;/span&gt;
            &lt;span aria-hidden="true"&gt;&lt;/span&gt;
            &lt;span aria-hidden="true"&gt;&lt;/span&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      	{/* ... */}
      &lt;/div&gt;
    &lt;/nav&gt;
  );
 };</code></pre><p>Para adicionar o link no menu, vamos usar o componente <code>&lt;NavLink /&gt;</code> do <code>react-router-dom</code>.</p><p>O componente <code>NavLink</code> fornece uma forma declarativa para navegar pela aplicação. É parecido com o componente <code>Link</code>, à excepção de que se pode aplicar um estilo activo no link se ele estiver activo.</p><p>Para especificar qual a rota para onde navegar, usamos a propriedade <code>to</code> e passamos o nome do caminho.</p><p>A propriedade <code>activeClassName</code> adicionará uma classe <em>active</em> no link se ele estiver activo.</p><pre><code class="language-jsx">&lt;NavLink
    className="navbar-item"
    activeClassName="is-active"
    to="/"
    exact
&gt;
	Home
&lt;/NavLink&gt;</code></pre><p>No navegador, o componente <code>NavLink</code> é renderizado como uma marca <code>&lt;a&gt;</code> com o atributo <code>href</code> com o valor que foi passado na propriedade <code>to</code>.</p><p>Além disso, aqui vamos especificar a propriedade <code>exact</code> para que combine precisamente com o URL.</p><p>Vamos adicionar todos os links e terminar o componente <code>Navbar</code>.</p><pre><code class="language-jsx">import React, { useState } from "react";
import { NavLink } from "react-router-dom";

const Navbar = () =&gt; {
  const [isOpen, setOpen] = useState(false);
  return (
    &lt;nav
      className="navbar is-primary"
      role="navigation"
      aria-label="main navigation"
    &gt;
      &lt;div className="container"&gt;
        &lt;div className="navbar-brand"&gt;
          &lt;a
            role="button"
            className={`navbar-burger burger ${isOpen &amp;&amp; "is-active"}`}
            aria-label="menu"
            aria-expanded="false"
            onClick={() =&gt; setOpen(!isOpen)}
          &gt;
            &lt;span aria-hidden="true"&gt;&lt;/span&gt;
            &lt;span aria-hidden="true"&gt;&lt;/span&gt;
            &lt;span aria-hidden="true"&gt;&lt;/span&gt;
          &lt;/a&gt;
        &lt;/div&gt;

        &lt;div className={`navbar-menu ${isOpen &amp;&amp; "is-active"}`}&gt;
          &lt;div className="navbar-start"&gt;
            &lt;NavLink className="navbar-item" activeClassName="is-active" to="/"&gt;
              Página Principal
            &lt;/NavLink&gt;

            &lt;NavLink
              className="navbar-item"
              activeClassName="is-active"
              to="/about"
            &gt;
              Sobre
            &lt;/NavLink&gt;

            &lt;NavLink
              className="navbar-item"
              activeClassName="is-active"
              to="/profile"
            &gt;
              Perfil
            &lt;/NavLink&gt;
          &lt;/div&gt;

          &lt;div className="navbar-end"&gt;
            &lt;div className="navbar-item"&gt;
              &lt;div className="buttons"&gt;
                &lt;a className="button is-white"&gt;Log in&lt;/a&gt;
              &lt;/div&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/nav&gt;
  );
};

export default Navbar;
</code></pre><p>De notar que adicionámos aqui um botão de Login. Voltaremos ao componente <code>Navbar</code> outra vez quando discutirmos as rotas protegidas, mais à frente neste guia.</p><h2 id="renderizar-as-p-ginas"><strong>Renderizar as páginas</strong></h2><p>Agora que o componente <code>Navbar</code> está configurado, vamos adicioná-lo à página e começar a renderizar as páginas.</p><p>Uma vez que a barra de navegação é um componente comum a todas as páginas, em vez de chamar o componente em cada uma das páginas, utilizaremos uma abordagem diferente e optaremos por renderizar a <code>Navbar</code> em um layout comum.</p><pre><code class="language-jsx">// App.js

function App() {
  return (
    &lt;&gt;
      &lt;Navbar /&gt;
      &lt;div className="container mt-2" style={{ marginTop: 40 }}&gt;
        {/* Renderize a página aqui */}
      &lt;/div&gt;
    &lt;/&gt;
  );
}</code></pre><p>Agora, vamos adicionar os componentes da página ao <em>container</em>.</p><pre><code class="language-jsx">// App.js

function App() {
  return (
    &lt;&gt;
      &lt;Navbar /&gt;
      &lt;div className="container mt-2" style={{ marginTop: 40 }}&gt;
        &lt;Home /&gt;
      	&lt;About /&gt;
      &lt;/div&gt;
    &lt;/&gt;
  );
}</code></pre><p>Se virmos os resultados agora, vamos notar que ambos os componentes de página, da página principal e de Sobre são renderizados na página. Isso acontece porque ainda não adicionámos nenhuma lógica de roteamento.</p><p>Vamos precisar de importar o componente <code>BrowserRouter</code> do React Router para adicionar a capacidade de rotear os componentes. Tudo o que precisamos de fazer é envolver todos os componentes da página dentro do componente <code>BrowserRouter</code>. Isto fará com que todos os componentes da página tenham lógica de roteamento. Perfeito!</p><p>Mais uma vez, no entanto, nada vai mudar com os resultados - ainda veremos ambas as páginas a ser renderizadas. Precisamos de renderizar o componente da página só quando o URL combina com um caminho em particular. É aqui que o componente <code>Route</code> do React Router entra em jogo.</p><p>O componente <code>Router</code> tem uma propriedade <code>path</code>, que aceita o caminho da página. O componente da página deverá ser envolvido com o <code>Router</code>, como mostrado abaixo:</p><pre><code class="language-jsx">&lt;Route path="/about"&gt;
  &lt;About /&gt;
&lt;/Route&gt;</code></pre><p>Vamos fazer o mesmo para o componente <code>Home</code>.</p><pre><code class="language-jsx">&lt;Route exact path="/"&gt;
  &lt;Home /&gt;
&lt;/Route&gt;</code></pre><p>A propriedade <code>exact</code> acima, diz ao componente <code>Router</code> para combinar exactamente com o caminho. Se não adicionarmos a propriedade <code>exact</code> o caminho <code>/</code>, combinará com todas as rotas a começar com <code>/</code>, incluindo <code>/about</code>.</p><p>Se formos agora ver os resultados, continuaremos a ver ambos os componentes a serem renderizados. No entanto, se formos a <code>/about</code>, notaremos que somente o componente <code>About</code> é renderizado. Este comportamento acontece porque o roteador continua a combinar o URL com as rotas, mesmo depois de já ter combinado com a rota inicial.</p><p>Temos então de dizer ao roteador para parar de fazer combinações assim que combinar com uma rota. Isto é feito usando o componente <code>Switch</code> do React Router.</p><pre><code class="language-jsx">function App() {
  return (
    &lt;BrowserRouter&gt;
      &lt;Navbar /&gt;
      &lt;div className="container mt-2" style={{ marginTop: 40 }}&gt;
        &lt;Switch&gt;
          &lt;Route exact path="/"&gt;
            &lt;Home /&gt;
          &lt;/Route&gt;
          &lt;Route path="/about"&gt;
            &lt;About /&gt;
          &lt;/Route&gt;
        &lt;/Switch&gt;
      &lt;/div&gt;
    &lt;/BrowserRouter&gt;
  );
}</code></pre><p>E aqui temos! Configurámos com sucesso o roteamento na nossa aplicação React.</p><h2 id="rotas-protegidas-e-redirecionamentos"><strong>Rotas protegidas e redirecionamentos</strong></h2><p>Ao trabalhar com aplicações do mundo real, teremos determinadas rotas por trás de sistemas de autenticação. Teremos rotas ou páginas que só conseguirão ser acedidas por um utilizador autenticado. Nesta secção, aprenderemos como implementar estas rotas.</p><p><em><strong>Por favor, observe-se</strong> que não criaremos nenhum formulário de autenticação nem teremos um servidor para autenticar utilizadores. Em uma aplicação real, não implementaremos a autenticação da forma como é demonstrada aqui.</em></p><p>Vamos criar o componente da pagina de perfil, que so deverá ser acedido por um utilizador autenticado.</p><pre><code class="language-jsx">// pages/Profile.js

import { useParams } from "react-router-dom";

const Profile = () =&gt; {
  const { name } = useParams();
  return (
    &lt;div&gt;
      &lt;h1 className="title is-1"&gt;Esta é a página de perfil&lt;/h1&gt;
      &lt;article className="message is-dark" style={{ marginTop: 40 }}&gt;
        &lt;div className="message-header"&gt;
          &lt;p&gt;{name}&lt;/p&gt;
        &lt;/div&gt;
        &lt;div className="message-body"&gt;
          Lorem ipsum dolor sit amet, consectetur adipiscing elit.{" "}
          &lt;strong&gt;Pellentesque risus mi&lt;/strong&gt;, tempus quis placerat ut, porta
          nec nulla. Vestibulum rhoncus ac ex sit amet fringilla. Nullam gravida
          purus diam, et dictum &lt;a&gt;felis venenatis&lt;/a&gt; efficitur. Aenean ac{" "}
          &lt;em&gt;eleifend lacus&lt;/em&gt;, in mollis lectus. Donec sodales, arcu et
          sollicitudin porttitor, tortor urna tempor ligula, id porttitor mi
          magna a neque. Donec dui urna, vehicula et sem eget, facilisis sodales
          sem.
        &lt;/div&gt;
      &lt;/article&gt;
    &lt;/div&gt;
  );
};
</code></pre><p>Vamos pegar o nome do utilizador vindo do URL usando os parâmetros da rota.</p><p>Adicionamos a rota Profile (perfil) no roteador.</p><pre><code class="language-jsx">&lt;Route path="/profile/:name"&gt;
  &lt;Profile /&gt;
&lt;/Route&gt;</code></pre><p>Neste momento a página de perfil pode ser acedida diretamente. Por isso, para a tornar uma rota autenticada, vamos criar um componente de alta ordem (em inglês, HOC ou <em>high-order component</em>) para envolver a lógica de autenticação.</p><pre><code class="language-jsx">const withAuth = (Component) =&gt; {
  const AuthRoute = () =&gt; {
    const isAuth = !!localStorage.getItem("token");
    // ...
  };

  return AuthRoute;
};</code></pre><p>Para determinar se um utilizador está autenticado ou não, usamos o token de autenticação guardado no navegador quando o utilizador se autentica. Se o utilizador não estiver autenticado, redirecionamos o utilizador para a página principal. O componente <code>Redirect</code> do React Router pode ser usado para redirecionar o utilizador para outro caminho.</p><pre><code class="language-jsx">const withAuth = (Component) =&gt; {
  const AuthRoute = () =&gt; {
    const isAuth = !!localStorage.getItem("token");
    if (isAuth) {
      return &lt;Component /&gt;;
    } else {
      return &lt;Redirect to="/" /&gt;;
    }
  };

  return AuthRoute;
};</code></pre><p>Também poderemos passar outros tipos de informação do utilizador, tais como o nome e o ID de utilizador, usando as propriedades do componente envolvente.</p><p>De seguida, usamos o HOC <code>withAuth</code> no componente de perfil.</p><pre><code class="language-jsx">import withAuth from "../components/withAuth";

const Profile = () =&gt; {
 // ...
}

export default withAuth(Profile);</code></pre><p>Agora, se tentarmos visitar <code>/profile/JohnDoe</code>, seremos redirecionados para a página principal. Isto acontece porque o token de autenticação não está gravado na memória do nosso navegador.</p><p>Muito bem, então, vamos voltar para o componente da <code>Navbar</code> e adicionar as funcionalidades de Login e Logout. Quando o utilizador é autenticado, mostra o botão de Logout, mas quando o utilizador não está autenticado, mostramos o botão de Login.</p><pre><code class="language-jsx">// components/Navbar.js

const Navbar = () =&gt; {
	// ...
    return (
    	&lt;nav
          className="navbar is-primary"
          role="navigation"
          aria-label="main navigation"
        &gt;
        &lt;div className="container"&gt;
        	{/* ... */}
            &lt;div className="navbar-end"&gt;
            &lt;div className="navbar-item"&gt;
              &lt;div className="buttons"&gt;
                {!isAuth ? (
                  &lt;button className="button is-white" onClick={loginUser}&gt;
                    Login
                  &lt;/button&gt;
                ) : (
                  &lt;button className="button is-black" onClick={logoutUser}&gt;
                    Logout
                  &lt;/button&gt;
                )}
              &lt;/div&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
        &lt;/nav&gt;
    );
}

</code></pre><p>Quando o utilizador clica no botão de Login, vamos colocar um token falso na memória local e redirecionar o utilizador para a página de perfil.</p><p>Não poderemos, no entanto, utilizar o componente Redirect neste caso – precisamos de direcionar o utilizador programaticamente. Por razões de segurança, os tokens sensíveis usados para autenticação são normalmente guardados nos cookies.</p><p>O React Router tem o HOC <code>withRouter</code>, que tira partido da API History ao injectar o objecto <code>history</code> nas propriedades do componente. Para além disso, passa para o componente envolvente as propriedades <code>match</code> e <code>location</code>.</p><pre><code class="language-jsx">// components/Navbar.js

import { NavLink, withRouter } from "react-router-dom";

const Navbar = ({ history }) =&gt; { 
  const isAuth = !!localStorage.getItem("token");

  const loginUser = () =&gt; {
    localStorage.setItem("token", "some-login-token");
    history.push("/profile/Vijit");
  };

  const logoutUser = () =&gt; {
    localStorage.removeItem("token");
    history.push("/");
  };
  
  return ( 
   {/* ... */}
  );
};

export default withRouter(Navbar);</code></pre><p>E <em>voilà</em>! É isto. Também conquistámos a terra das rotas autenticadas. Assista a esta apresentação <a href="https://react-router-demo.vijitail.dev/">aqui</a> e encontre o código completo <a href="https://github.com/vijitail/react-router-demo">neste repositório</a> para referência.</p><h2 id="conclus-o"><strong>Conclusão</strong></h2><p>Espero que agora já tenha uma pequena ideia de como funciona o roteamento em geral no lado do cliente e de como implementar o roteamento em React utilizando a biblioteca React Router.</p><p>Neste guia, aprendemos os componentes vitais do React Router como <code>Route</code>, &nbsp;<code>withRouter</code>, <code>Link</code> e por aí em diante, mas também alguns conceitos avançados como rotas autenticadas, que são necessárias para construir uma aplicação.</p><p>Verifica a <a href="https://reactrouter.com/docs/en/v6">documentação do React Router</a> para obter uma visão mais detalhada de cada um dos componentes.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
