<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Reinaldo Coelho Sartorelli</title>
    <description>The latest articles on DEV Community by Reinaldo Coelho Sartorelli (@reinaldocoelho).</description>
    <link>https://dev.to/reinaldocoelho</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F187422%2F0951d88e-35b4-429c-a971-f8094d1ea14f.jpeg</url>
      <title>DEV Community: Reinaldo Coelho Sartorelli</title>
      <link>https://dev.to/reinaldocoelho</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/reinaldocoelho"/>
    <language>en</language>
    <item>
      <title>Muito foda o artigo, parabéns. Minha primeira experiência com isso com com o modelo Perceptron na faculdade, fazendo o cálculo no Excel.</title>
      <dc:creator>Reinaldo Coelho Sartorelli</dc:creator>
      <pubDate>Thu, 13 Mar 2025 11:24:58 +0000</pubDate>
      <link>https://dev.to/reinaldocoelho/muito-foda-o-artigo-parabens-minha-primeira-experiencia-com-isso-com-com-o-modelo-perceptron-na-5895</link>
      <guid>https://dev.to/reinaldocoelho/muito-foda-o-artigo-parabens-minha-primeira-experiencia-com-isso-com-com-o-modelo-perceptron-na-5895</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/angelobelchior" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F47320%2F55835eda-0aa6-48d3-878c-8e3b4fe77a7c.png" alt="angelobelchior"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/angelobelchior/reinventando-a-roda-criando-uma-rede-neural-com-csharp-3mg3" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Reinventando a Roda: Criando uma Rede Neural com csharp&lt;/h2&gt;
      &lt;h3&gt;Angelo Belchior ・ Feb 26&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#csharp&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#redeneural&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ia&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#feedforward&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>csharp</category>
      <category>redeneural</category>
      <category>ia</category>
      <category>feedforward</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Reinaldo Coelho Sartorelli</dc:creator>
      <pubDate>Thu, 13 Mar 2025 11:10:57 +0000</pubDate>
      <link>https://dev.to/reinaldocoelho/-3lj3</link>
      <guid>https://dev.to/reinaldocoelho/-3lj3</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/angelobelchior" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F47320%2F55835eda-0aa6-48d3-878c-8e3b4fe77a7c.png" alt="angelobelchior"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/angelobelchior/reinventando-a-roda-criando-uma-rede-neural-com-csharp-3mg3" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Reinventando a Roda: Criando uma Rede Neural com csharp&lt;/h2&gt;
      &lt;h3&gt;Angelo Belchior ・ Feb 26&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#csharp&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#redeneural&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#ia&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#feedforward&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>csharp</category>
      <category>redeneural</category>
      <category>ia</category>
      <category>feedforward</category>
    </item>
    <item>
      <title>Artigo muito bom sobre Async/Await com Dotnet, super recomendo...</title>
      <dc:creator>Reinaldo Coelho Sartorelli</dc:creator>
      <pubDate>Mon, 03 Feb 2025 23:21:11 +0000</pubDate>
      <link>https://dev.to/reinaldocoelho/artigo-muito-bom-sobre-asyncawait-com-dotnet-super-recomendo-3f6d</link>
      <guid>https://dev.to/reinaldocoelho/artigo-muito-bom-sobre-asyncawait-com-dotnet-super-recomendo-3f6d</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/angelobelchior" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F47320%2F55835eda-0aa6-48d3-878c-8e3b4fe77a7c.png" alt="angelobelchior"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/angelobelchior/taskconfigureawait-deadlock-e-pink-floyd-416g" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Async/Await: Task.ConfigureAwait, Deadlock e Pink Floyd&lt;/h2&gt;
      &lt;h3&gt;Angelo Belchior ・ Oct 25 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>dotnet</category>
    </item>
    <item>
      <title>Entendendo definitivamente o e-mail</title>
      <dc:creator>Reinaldo Coelho Sartorelli</dc:creator>
      <pubDate>Mon, 22 Jan 2024 13:59:34 +0000</pubDate>
      <link>https://dev.to/reinaldocoelho/email-4kpp</link>
      <guid>https://dev.to/reinaldocoelho/email-4kpp</guid>
      <description>&lt;p&gt;Neste artigo vou compartilhar tudo que sei a respeito de e-mails, iniciando por uma visão geral do que é, como funciona a troca de e-mails, sua estrutura e o que mais eu conseguir organizar.&lt;/p&gt;

&lt;p&gt;Este artigo &lt;strong&gt;não será um tutorial&lt;/strong&gt; que explica como configurar, instalar ou usar qualquer técnologia relacionada a e-mail, mas sim uma visão geral de como funciona.&lt;/p&gt;

&lt;h2&gt;
  
  
  Glossário
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Introdução

&lt;ol&gt;
&lt;li&gt;O que é e-mail&lt;/li&gt;
&lt;li&gt;Palavras chaves ao se falar de e-mails&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;Entendendo

&lt;ol&gt;
&lt;li&gt;Como é um e-mail&lt;/li&gt;
&lt;li&gt;Como funciona a troca de e-mail&lt;/li&gt;
&lt;li&gt;O que são e onde entram servidores de Anti-spam&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;Mão na massa

&lt;ol&gt;
&lt;li&gt;Usando Telnet para enviar um e-mail na unha&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;Conclusão

&lt;ol&gt;
&lt;li&gt;Referências&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  O que é e-mail
&lt;/h2&gt;

&lt;p&gt;Um e-mail como o próprio nome diz é uma forma eletônica de "trocar cartas", ou seja, uma forma de comunicação "formal" entre as pessoas utilizando um computador.&lt;/p&gt;

&lt;p&gt;Para um e-mail funcionar, basta que exista ao menos um servidor de e-mail (que contenha os endereços de e-mail) que possa ser acessado por pessoas conectadas numa rede de computadores (Local ou Internet), e que essas pessoas utilizem um programa como cliente de e-mail (que pode ser um programa de terminal, gráfico ou um site - conhecidos normalmente por webmail-).&lt;/p&gt;

&lt;p&gt;Alguns exemplos de clientes de e-mail são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;De terminal:

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.mutt.org/"&gt;Mutt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://alpineapp.email/"&gt;Alpine&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Gráficos:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.thunderbird.net/pt-BR/"&gt;Thunderbird&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.microsoft.com/pt-br/microsoft-365/outlook/email-and-calendar-software-microsoft-outlook"&gt;Outlook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Webmail:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.encontact.com.br/"&gt;enContact&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mail.google.com/"&gt;Gmail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://outlook.live.com/owa/"&gt;Outlook Web&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Palavras chaves ao se falar de e-mails
&lt;/h2&gt;

&lt;p&gt;Ao falarmos de e-mail parece ser simples e direto - escrevo o e-mail, envio e ele é recebido pelo destinatário - porém se começarmos a estudar seu funcionamento, vamos nos deparar com uma série de termos que são utilizados em sua configuração e infra-estrutura, e que se não forem explicados, farão falta para entender todo o seu funcionamento.&lt;/p&gt;

&lt;p&gt;Neste tópico, vou explicar esses termos e seus significados, e tentar deixar o mais claro possível o que cada um deles representa, para depois podermos junta-los e entender como cada um executa seu papel no todo.&lt;/p&gt;

&lt;p&gt;Iremos apresentar agora:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EML&lt;/li&gt;
&lt;li&gt;SMTP&lt;/li&gt;
&lt;li&gt;POP3&lt;/li&gt;
&lt;li&gt;IMAP&lt;/li&gt;
&lt;li&gt;MX&lt;/li&gt;
&lt;li&gt;SPF&lt;/li&gt;
&lt;li&gt;DKIM&lt;/li&gt;
&lt;li&gt;DMARC&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  EML
&lt;/h3&gt;

&lt;p&gt;A extensão de arquivo &lt;code&gt;.eml&lt;/code&gt; é utilizada para representar um arquivo de e-mail - ou seja, um arquivo que contém dentro dele a estrutura de um e-mail -, e apesar de ser a estrutura "padrão" e mais comum, não é a única estrutura de e-mail existente, podendo ser encontradas outras extensões de arquivos que representam e-mails.&lt;/p&gt;

&lt;p&gt;Algumas outras que você pode encontrar são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;emlx - Utilizada pela &lt;a href="https://en.wikipedia.org/wiki/Apple_Mail"&gt;Apple Mail&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;msg - Utilizada pelo &lt;a href="https://en.wikipedia.org/wiki/Microsoft_Outlook"&gt;Microsoft Outlook&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;mbox/mbx - Utilizada pelo &lt;a href="https://en.wikipedia.org/wiki/Mozilla_Thunderbird"&gt;Mozilla Thunderbird&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Opera_Mail"&gt;Opera Mail&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Eudora_(email_client)"&gt;Eudora&lt;/a&gt; e &lt;a href="https://en.wikipedia.org/wiki/KMail"&gt;KMail&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E apesar de todas estas outras estruturas que representam e-mails, praticamente todos os clientes conseguem importar e exportar para o formato &lt;code&gt;.eml&lt;/code&gt;, sendo assim, o formato mais utilizado para troca de e-mails entre clientes.&lt;/p&gt;

&lt;p&gt;O formato básico de uma mensagem de e-mail é definido pelo &lt;a href="https://tools.ietf.org/html/rfc5322"&gt;RFC 5322&lt;/a&gt;, e &lt;em&gt;é composto por duas partes: o cabeçalho e o corpo&lt;/em&gt;. (A RFC-5322 substituiu a RFC-2822 em 2008, que por sua vez substituiu a RFC-822 em 2001 - que foi o padrão de e-mail por décadas, e havia sido publicada em 1982 baseada na RFC-733 para a ARPANET -).&lt;/p&gt;

&lt;p&gt;Vamos falar mais sobre a estrutura do EML no tópico Como é um e-mail.&lt;/p&gt;

&lt;h3&gt;
  
  
  SMTP
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol"&gt;SMTP&lt;/a&gt; é a sigla para &lt;code&gt;Simple Mail Transfer Protocol&lt;/code&gt;, ou seja, Protocolo Simples de Transferência de E-mail. Que em resumo significa que ele contém as regras necessárias para que um servidor de e-mail consiga se comunicar com outro, podendo enviar e receber e-mails.&lt;/p&gt;

&lt;p&gt;Servidores de e-mails e outros agentes de transferência de mensagens utilizam o SMTP para enviar e receber mensagens de e-mail. Clientes de e-mail (nível de usuário) normalmente usam o SMTP apenas para enviar mensagens para um servidor de e-mail para retransmissão (normalmente enviam e-mails na porta 587 ou 465 conforme RFC-8314).&lt;/p&gt;

&lt;p&gt;A origem dos SMTP's começou em 1980, construído sobre conceitos implementados na ARPANET desde 1971. Ele foi atualizado, modificado e extendido multiplas vezes. O protocolo em uso comum hoje tem estrutura extensível com várias extensões para autenticação, criptografia, transferência de dados binários e endereços de e-mail internacionalizados. Servidores SMTP comumente utilizam o protocolo TCP na porta 25 (para comunicações em texto plano) e 587 (para comunicações criptografadas).&lt;/p&gt;

&lt;h4&gt;
  
  
  Visão simples do protocolo
&lt;/h4&gt;

&lt;p&gt;SMTP é um protocolo de texto simples, no qual um cliente SMTP fala com um servidor SMTP e o servidor responde. O cliente SMTP envia comandos, e o servidor SMTP responde com códigos de status e respostas de texto. Por exemplo, o cliente SMTP pode enviar o comando &lt;code&gt;HELO&lt;/code&gt; e o servidor SMTP responderá com um código de status &lt;code&gt;250&lt;/code&gt; e uma resposta de texto &lt;code&gt;mail.example.com Hello client.example.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Uma transação SMTP (após a conexão efetuada com o servidor) consiste em três sequências de comandos/respostas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comando &lt;strong&gt;MAIL&lt;/strong&gt;, para estabelecer o endereço de retorno (Também referido como return-path, reverse-path, bounce address, mfrom, ou envelope sender). Nele normalmente é informado o endereço de e-mail do remetente.&lt;/li&gt;
&lt;li&gt;Comando &lt;strong&gt;RCPT&lt;/strong&gt;, para estabelecer o endereço do destinatário (Também referido como forward-path, envelope recipient, ou envelope to). Nele normalmente é informado o endereço de e-mail do destinatário.&lt;/li&gt;
&lt;li&gt;Comando &lt;strong&gt;DATA&lt;/strong&gt; para sinalizar o início do texto da mensagem (No caso o conteúdo de texto EML do e-mail a ser enviado - Consiste em um cabeçalho de mensagem e um corpo de mensagem separados por uma linha vazia -). DATA é na verdade um grupo de comandos, e o servidor responde duas vezes: uma vez para o próprio comando DATA, para reconhecer que está pronto para receber o texto, e a segunda vez após a sequência de fim-de-dados (normalmente uma linha final é indicada por um &lt;code&gt;.&lt;/code&gt;[ponto final]), para aceitar ou rejeitar a mensagem inteira.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Além disso, o cliente SMTP pode usar o comando &lt;strong&gt;VRFY&lt;/strong&gt; para verificar se um nome de usuário ou alias de e-mail é válido, ou o comando &lt;strong&gt;EXPN&lt;/strong&gt; para expandir um nome de lista de distribuição.&lt;/p&gt;

&lt;p&gt;Ao final do comando &lt;strong&gt;DATA&lt;/strong&gt;, cada servidor pode responder com um código que pode ser positivo (2xx), negativo (4xx ou 5xx), ou interromper a conexão (1xx ou 3xx). Além disso, o servidor pode responder com uma mensagem de status de texto opcional, e o cliente SMTP pode responder com um comando &lt;strong&gt;RSET&lt;/strong&gt; para reiniciar a transação.&lt;/p&gt;

&lt;h2&gt;
  
  
  POP3
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Post_Office_Protocol"&gt;POP3&lt;/a&gt; é a sigla para &lt;code&gt;Post Office Protocol&lt;/code&gt;, ou seja, Protocolo de Correio Postal. Que em resumo significa que ele contém as regras necessárias para que um cliente de e-mail consiga se comunicar com um servidor de e-mail, podendo baixar e-mails.&lt;/p&gt;

&lt;p&gt;O POP3 é um protocolo de aplicação em camadas que permite que um cliente de e-mail recupere mensagens de e-mail de um servidor de e-mail remoto. O POP3 foi projetado para ser compatível com vários formatos de caixa de correio. O POP3 permite que um cliente de e-mail faça o download de todas as mensagens de e-mail de um servidor de e-mail remoto. O POP3 é um protocolo de texto simples que usa o TCP na porta 110. Um cliente de e-mail que usa o POP3 normalmente se conecta ao servidor de e-mail, baixa todas as mensagens de e-mail e as exclui do servidor de e-mail, mas as mensagens de e-mail podem ser baixadas sem serem excluídas ou podem ser mantidas no servidor de e-mail para serem baixadas por outros dispositivos.&lt;/p&gt;

&lt;p&gt;O POP3 foi projetado em 1984 (RFC-918) e atualizado em 1988 (RFC-1081) e 1996 (RFC-1939). O POP3 foi substituído pelo IMAP, que oferece mais recursos.&lt;/p&gt;

&lt;h2&gt;
  
  
  IMAP
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Internet_Message_Access_Protocol"&gt;IMAP&lt;/a&gt; é a sigla para &lt;code&gt;Internet Message Access Protocol&lt;/code&gt;, ou seja, Protocolo de Acesso a Mensagens da Internet. Que em resumo significa que ele contém as regras necessárias para que um cliente de e-mail consiga se comunicar com um servidor de e-mail, podendo baixar e-mails.&lt;/p&gt;

&lt;p&gt;O IMAP é um protocolo de aplicação em camadas que permite que um cliente de e-mail recupere mensagens de e-mail de um servidor de e-mail remoto. O IMAP foi projetado para ser compatível com vários formatos de caixa de correio. O IMAP permite que um cliente de e-mail faça o download de mensagens de e-mail individuais de um servidor de e-mail remoto. O IMAP é um protocolo de texto simples que usa o TCP na porta 143. Um cliente de e-mail que usa o IMAP normalmente se conecta ao servidor de e-mail, baixa mensagens de e-mail individuais e as exclui do servidor de e-mail, mas as mensagens de e-mail podem ser baixadas sem serem excluídas ou podem ser mantidas no servidor de e-mail para serem baixadas por outros dispositivos.&lt;/p&gt;

&lt;h2&gt;
  
  
  MX
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/MX_record"&gt;MX&lt;/a&gt; é a sigla para &lt;code&gt;Mail Exchanger&lt;/code&gt;, que especifica qual é o Servidor de e-mail responsável por aceitar mensagens através de um nome de domínio (@dominio.com por exemplo).&lt;/p&gt;

&lt;p&gt;O MX é um registro DNS que aponta um servidor de e-mail para aceitar mensagens para um domínio. Este registro de DNS contém o nome de domínio de um servidor de e-mail e um valor de prioridade, ou seja, ele permite que você tenha uma lista de servidores e ordene-os por prioridade.&lt;/p&gt;

&lt;p&gt;O MX é um registro de DNS obrigatório para que um servidor de e-mail possa receber mensagens de e-mail.&lt;/p&gt;

&lt;p&gt;O registro de DNS apresenta a seguinte estrutura:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dominio         TTL     Classe  Tipo    Prioridade   Host do email
example.com.    1936    IN      MX      10           onemail.example.com.
example.com.    1936    IN      MX      10           twomail.example.com.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No caso acima temos dois servidores de e-mail para o domínio &lt;code&gt;example.com&lt;/code&gt;, e ambos tem a mesma prioridade, ou seja, o servidor de e-mail que for enviar uma mensagem para o domínio &lt;code&gt;example.com&lt;/code&gt; pode escolher um dos dois servidores para enviar a mensagem.&lt;/p&gt;

&lt;h2&gt;
  
  
  SPF
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Sender_Policy_Framework"&gt;SPF&lt;/a&gt; é a sigla para &lt;code&gt;Sender Policy Framework&lt;/code&gt;, ou seja, "Estrutura de Política do Remetente". Que em resumo significa que ele contém as regras necessárias para que um servidor de e-mail consiga validar se um servidor de e-mail é autorizado a enviar mensagens em nome de um domínio.&lt;/p&gt;

&lt;p&gt;O SPF é um registro de DNS consultado quando um e-mail é enviado, ele contém a lista de servidores que podem enviar e-mails em nome daquele domínio, e é consultando esta lista, que o servidor que está recebendo a mensagem verifica se o servidor que está dizendo ser o remetente da mensagem é realmente autorizado a enviar mensagens em nome do domínio que está informando.&lt;/p&gt;

&lt;p&gt;Caso o servidor que está recebendo a mensagem não encontre o registro SPF, ele pode considerar a mensagem como SPAM, pois não tem como saber se o servidor que está enviando a mensagem é realmente autorizado a enviar mensagens em nome do domínio que está informando.&lt;/p&gt;

&lt;p&gt;Existem algumas nuances sobre o SPF como por exemplo, ele pode ser configurado para informar que o servidor deve Recusar o recebimento caso o SPF não esteja condizendo com o esperado, ou apenas marcar a mensagem como SPAM, ou ainda, aceitar a mensagem mesmo que o SPF não esteja condizendo com o esperado.&lt;/p&gt;

&lt;p&gt;Para mais informações sobre SPF, seguem alguns links de apoio que podem ajudar com detalhes:&lt;/p&gt;

&lt;p&gt;Documento oficial do SPF (rfc 7208):&lt;br&gt;
&lt;a href="https://datatracker.ietf.org/doc/html/rfc7208"&gt;https://datatracker.ietf.org/doc/html/rfc7208&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tabela de Registros de SPF, informando detalhes referentes ao texto preenchido no campo valor:&lt;br&gt;
&lt;a href="https://mxtoolbox.com/dmarc/spf/spf-record-tags"&gt;https://mxtoolbox.com/dmarc/spf/spf-record-tags&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  DKIM
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail"&gt;DKIM&lt;/a&gt; é a sigla para &lt;code&gt;DomainKeys Identified Mail&lt;/code&gt;, é um método de autenticação de e-mail projetado para detectar endereços de remetente forjados em e-mails (spoofing de e-mail), uma técnica frequentemente usada em phishing e spam de e-mail.&lt;/p&gt;

&lt;p&gt;DKIM permite ao recipiente checar se o e-mail foi autorizado pelo proprietário do domínio do remetente. Ele faz isso criptografando o conteúdo do cabeçalho e do corpo do e-mail usando uma chave criptográfica publicada no DNS do domínio do remetente. Um destinatário pode usar uma chave pública publicada no DNS para decodificar o conteúdo criptografado e verificar se ele corresponde ao conteúdo do e-mail.&lt;/p&gt;

&lt;p&gt;DKIM é um Internet Standard. Ele foi difinido na &lt;a href="https://datatracker.ietf.org/doc/html/rfc6376"&gt;RFC 6376&lt;/a&gt;, datado de Setembro de 2011, com atualizações em &lt;a href="https://datatracker.ietf.org/doc/html/rfc8301"&gt;RFC 8301&lt;/a&gt; e &lt;a href="https://datatracker.ietf.org/doc/html/rfc8463"&gt;RFC 8463&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Exemplo de um cabeçalho DKIM inserido em um e-mail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DKIM-Signature: v=1; a=rsa-sha256; d=example.net; s=brisbane;
     c=relaxed/simple; q=dns/txt; i=foo@eng.example.net;
     t=1117574938; x=1118006938; l=200;
     h=from:to:subject:date:keywords:keywords;
     z=From:foo@eng.example.net|To:joe@example.com|
       Subject:demo=20run|Date:July=205,=202005=203:44:08=20PM=20-0700;
     bh=MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=;
     b=dzdVyOfAKCdLXdJOc9G2q8LoXSlEniSbav+yuU4zGeeruD00lszZ
              VoG4ZHRNiYzR
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  DMARC
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/DMARC"&gt;DMARC&lt;/a&gt; é a sigla para &lt;code&gt;Domain-based Message Authentication, Reporting and Conformance&lt;/code&gt;, ou seja, Autenticação de Mensagens Baseada em Domínio, Relatórios e Conformidade.&lt;/p&gt;

&lt;p&gt;Ele é designado para dar aos proprietários de domínios de e-mail a capacidade de proteger seu domínio contra uso não autorizado, comumente conhecido como spoofing de e-mail. O objetivo e o resultado primário da implementação do DMARC é proteger um domínio contra uso em ataques de comprometimento de e-mail comercial, e-mail de phishing, golpes de e-mail e outras atividades de ameaças cibernéticas.&lt;/p&gt;

&lt;p&gt;Uma vez que a entrada de DNS DEMARC é publicada, qualquer servidor de e-mail que receba um e-mail de um domínio protegido pelo DMARC pode verificar a autenticidade do e-mail. Se o e-mail passar na autenticação, ele será entregue na caixa de entrada do destinatário. Se o e-mail falhar na autenticação, ele pode ser entregue na pasta de spam ou rejeitado completamente, dependendo da política de DMARC publicada pelo proprietário do domínio.&lt;/p&gt;

&lt;p&gt;DMARC extende dois mecanismos de autenticação de e-mail existentes, Sender Policy Framework (SPF) e DomainKeys Identified Mail (DKIM). Ele permite que o proprietário administrativo de um domínio publique uma política em seus registros DNS para especificar como verificar o campo From: apresentado aos usuários finais; como o receptor deve lidar com falhas - e fornece um mecanismo de relatório para as ações executadas sob essas políticas.&lt;/p&gt;

&lt;p&gt;DMARC foi publicado na &lt;a href="https://datatracker.ietf.org/doc/html/rfc7489"&gt;RFC 7489&lt;/a&gt; em Março de 2015.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como é um e-mail
&lt;/h2&gt;

&lt;p&gt;Um e-mail - em sua estrutura EML - é composto por duas partes: o cabeçalho e o corpo. O cabeçalho é composto por uma série de campos em formato de Chave/Valor, e o corpo é composto por uma série de linhas de texto organizada por algumas regras que o que podem separá-lo em "aquivos" de tipo específicos.&lt;/p&gt;

&lt;p&gt;O cabeçalho e o corpo de um e-mail são separados por uma linha vazia.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sobre o Cabeçalho
&lt;/h3&gt;

&lt;p&gt;O cabeçalho de um e-mail é composto por uma série de campos em formato de Chave/Valor, onde cada campo é separado por uma quebra de linha, e cada campo é composto por uma chave e um valor separados por dois pontos &lt;code&gt;:&lt;/code&gt;.&lt;br&gt;
Alguns campos podem ter mais de um valor, e neste caso, os valores são separados por ponto e vírgula &lt;code&gt;;&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Sobre o Corpo
&lt;/h3&gt;

&lt;p&gt;Existem diversas formas de representar a estrutura do corpo de um e-mail, e uma delas é chamada de Multi-part MIME, que é uma estrutura que permite que o corpo de um e-mail seja composto por diversos "arquivos" de tipos diferentes, podendo dar subporte a arquivos de mídia como imagens, vídeos, áudios, etc.&lt;/p&gt;
&lt;h3&gt;
  
  
  Mais detalhes
&lt;/h3&gt;

&lt;p&gt;Um exemplo de um EML simples pode ser verificado na figura abaixo, onde se destaca a separação entre o cabeçalho e o corpo do e-mail:&lt;/p&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mrhsV4Cv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/email/assets/estrutura-eml.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mrhsV4Cv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/email/assets/estrutura-eml.png" alt="Estrutura de um EML" width="800" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Todos os detalhes de como se formam a estrutura de um EML podem ser encontrados na &lt;a href="https://tools.ietf.org/html/rfc5322"&gt;RFC 5322&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Como funciona a troca de e-mail
&lt;/h2&gt;

&lt;p&gt;Quando falamos sobre a troca de e-mails e nos referimos as comuninações entre os servidores, estamos falando sobre algumas entidades conceituais que não citamos ainda, são elas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MUA - Mail User Agent (Cliente de e-mail)

&lt;ul&gt;
&lt;li&gt;Podem ser clientes de terminal, gráficos ou webmail.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MSA - Mail Submission Agent (Agente de envio de e-mail)

&lt;ul&gt;
&lt;li&gt;Servidor de e-mail que recebe o pedido de envio do e-mail e prepara na fila de envio (normalmente o mesmo servidor do MTA).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MTA - Mail Transfer Agent (Agente de transferência de e-mail)

&lt;ul&gt;
&lt;li&gt;Servidor que a partir do e-mail em fila, efetua a tentativa de entrega a cada um dos destinatários.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MDA - Mail Delivery Agent (Agente de entrega de e-mail)

&lt;ul&gt;
&lt;li&gt;Servidor de e-mail que recebe o e-mail, e pode armazená-lo (junto ao MRA para obtenção via POP/IMAP posterior), ou entregar diretamente ao MUA do destinatário.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MRA - Mail Retrieval Agent (Agente de recuperação de e-mail)

&lt;ul&gt;
&lt;li&gt;Servidor de e-mail que armazena os e-mails recebidos, e permite que o usuário os recupere via POP/IMAP.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos desenhar uma sequência de troca de e-mails entre dois usuários, para entendermos como funciona a troca de e-mails entre os servidores.&lt;/p&gt;

&lt;p&gt;Figura:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kYkU09c6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/email/assets/fluxo-envio-email.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kYkU09c6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/email/assets/fluxo-envio-email.png" alt="Figura com Fluxo de envio de e-mail" width="800" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Diagrama &lt;a href="https://mermaid.js.org/"&gt;MermaidJs&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    sequenceDiagram

    box Usuários/Cliente de e-mail
    participant A as alice@origem.com (MUA)
    participant B as bob@destino.com (MUA)
    end

    box Servidor origem.com
    participant MSA as Agente de envio (MSA)
    participant MTA as Agente de transferência (MTA)
    end

    box DNS destino.com
    participant MX as Dominio MX
    end

    box Servidores destino.com
    participant AntiSpam as Anti-Spam (SpamAssassin)
    participant MDA as Agente de entrega (MDA)
    participant MRA as Agente de recuperação (MRA)
    end

    A --&amp;gt;&amp;gt; MSA: Envia e-mail
    MSA --&amp;gt;&amp;gt; MTA: Agenda e prepara repasse
    MTA --&amp;gt;&amp;gt; MX: Consulta servidor de entrega
    MX --&amp;gt;&amp;gt; MTA: Responde IP do servidor de entrega
    MTA --&amp;gt;&amp;gt; AntiSpam: Efetua entrega do e-mail
    AntiSpam --&amp;gt;&amp;gt; MDA: Repassa o e-mail já analisado
    MDA --&amp;gt;&amp;gt; MRA: Armazena e-mail
    MRA --&amp;gt;&amp;gt; B: Notifica recebimento de e-mail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O processo acima pode se repetir para cada destinatário de e-mail individualmente (principalmente se a entrega é referente a domínios diferentes).&lt;/p&gt;

&lt;h2&gt;
  
  
  O que são e onde entram servidores de Anti-spam
&lt;/h2&gt;

&lt;p&gt;Servidores de Anti-spam são servidores de e-mail que tem como objetivo principal efetuar um filtro e agir como um portal (Gateway) de entrada de e-mails, ou seja, eles recebem os e-mails e os encaminham para o servidor de e-mail do destinatário após efetuarem a varredura e análise do conteúdo. Normalmente são referenciados pelo dominio MX, onde recebem o e-mail antes de repassar ao servidor adequado de entrega.&lt;/p&gt;

&lt;p&gt;Um antispam não necessáriamente rejeita um e-mail suspeito, essa ação é configurável e pode ser definida pelo administrador do servidor de e-mail, e normalmente é feita através de uma pontuação, onde o e-mail é analisado e recebe uma pontuação, e caso a pontuação seja maior que o valor configurado, o e-mail é rejeitado, caso contrário, ele é aceito.&lt;/p&gt;

&lt;p&gt;Existem servidores Antispam que podem ser instalados como um servidor adicional, um dos mais famosos é o &lt;a href="https://spamassassin.apache.org/"&gt;Spam Assassin&lt;/a&gt;, e existem também serviços de Anti-spam que podem ser contratados, como por exemplo o &lt;a href="https://www.spamexperts.com/"&gt;Spam Experts&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usando Telnet para enviar um e-mail na unha
&lt;/h2&gt;

&lt;p&gt;Abaixo mostrarei como você pode enviar um e-mail diretamente do seu terminal para um servidor de envio (MSA), simulando o comportamento que um cliente de e-mail faria para enviar um e-mail.&lt;/p&gt;

&lt;p&gt;Para esse exemplo vamos precisar de alguns pré-requisitos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ter o cliente Telnet instalado (Windows ou Linux)
1.1. Caso vá efetuar conexão num servidor com criptografia, precisa também do programa openssl instalado&lt;/li&gt;
&lt;li&gt;Ter acesso a um servidor de e-mail que aceite conexões na porta 25 (ou 587 se for necessário logar com usuário e senha)&lt;/li&gt;
&lt;li&gt;Ter um endereço de e-mail válido para enviar e receber o e-mail de teste&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Primeiro, precisamos nos conectar via telnet ao servidor de e-mail&lt;/p&gt;

&lt;p&gt;Para um modo simples, sem conexão criptografada, podemos apenas apontar para o servidor e porta para solicitar conexão:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## Iniciar efetuando a chamada do telnet para o servidor de e-mail e a porta&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;telnet &amp;lt;endereco_servidor&amp;gt; &amp;lt;porta&amp;gt; &lt;span class="c"&gt;## Exemplo: telnet localhost 25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para o caso de conexão criptografada, precisamos informar que queremos iniciar a conexão com o comando &lt;code&gt;STARTTLS&lt;/code&gt; por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;openssl s_client &lt;span class="nt"&gt;-starttls&lt;/span&gt; smtp &lt;span class="nt"&gt;-connect&lt;/span&gt; &amp;lt;endereco_servidor&amp;gt;:&amp;lt;porta&amp;gt; &lt;span class="nt"&gt;-crlf&lt;/span&gt; &lt;span class="nt"&gt;-ign_eof&lt;/span&gt;
&lt;span class="c"&gt;## Quando for necessário logar STARTTLS&lt;/span&gt;
&lt;span class="c"&gt;## Exemplo: openssl s_client -starttls smtp -connect localhost:25 -crlf -ign_eof&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após conectado no seridor, é necessário efetuar um comando de HandShake para iniciar a comunicação, e o comando mais comum é o &lt;code&gt;EHLO&lt;/code&gt; ou &lt;code&gt;HELO&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;EHLO meuservidor.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso o servidor necessite de autenticação (usuário e senha), os mesmos devem ser informados através do comando &lt;code&gt;AUTH LOGIN&lt;/code&gt;, e em seguida informando o usuário e senha em base64:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;AUTH LOGIN &lt;span class="c"&gt;# Informa que irá informar a autenticação&lt;/span&gt;
&lt;span class="nv"&gt;bWV1dXN1YXJpb0BtZXVkb21pbmlvLmNvbQ&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="c"&gt;## Login em base64&lt;/span&gt;
&lt;span class="nv"&gt;TWFuZUFjaG91UXVlRXVJYVBhc3NhckFTZW5oYU5laA&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="c"&gt;## Senha em base64&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Existem outros tipos de autenticação que podem ser informados como &lt;code&gt;AUTH PLAIN&lt;/code&gt; (Para dados em Plain Text) ou &lt;code&gt;AUTH CRAM-MD5&lt;/code&gt; (Para dados em MD5).&lt;/p&gt;

&lt;p&gt;Em seguida, precisamos informar o remetente da mensagem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;MAIL FROM: &amp;lt;teste@meudominio.com.br&amp;gt; &lt;span class="c"&gt;# Informa o remetente. Obrigatório informar &amp;lt; e &amp;gt; para indicar o endereço.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na linha seguinte, informamos o endereço do destinatário (Caso queira enviar para mais de um destinatário, basta repetir o comando &lt;code&gt;RCPT TO:&lt;/code&gt; para cada um dos destinatários):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;RCPT TO: &amp;lt;destinatario@dominio-dele.com&amp;gt; &lt;span class="c"&gt;# Informa o destinatário da mensagem neste servidor.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E finalmente para encerrar precisamos enviar o conteúdo do e-mail (no caso o conteúdo do EML), e para isso usamos o comando &lt;code&gt;DATA&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;DATA &lt;span class="c"&gt;# Ao informar ele deve apresentar um retorno com o código 354&lt;/span&gt;
&lt;span class="c"&gt;# Todo conteúdo abaixo é a estrutura de um EML normal, e deve ser enviado linha a linha.&lt;/span&gt;
FROM: teste@meudominio.com.br
TO: destinatario@dominio-dele.com
CC: outro-em-copia@outro-dominio.com.br
Message-ID: &amp;lt;xpto-message-id-unico@meudominio.com.br&amp;gt;
SUBJECT: Hello World!
MIME-Version: 1.0
Content-Type: text/html&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"ISO-8859-1"&lt;/span&gt;
&amp;lt;&lt;span class="o"&gt;!&lt;/span&gt;DOCTYPE HTML&amp;gt;
&amp;lt;html&amp;gt;
 &amp;lt;body&amp;gt;
  teste
 &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="c"&gt;## O ponto é quem efetua a conclusão do processo e dispara o envio.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao entrar com o comando &lt;code&gt;DATA&lt;/code&gt; e pressionar &lt;code&gt;ENTER&lt;/code&gt;, o servidor irá aguardar que você envie todo o conteúudo do e-mail, e só irá considerar que você concluiu quando encontrar uma linha final contendo apenas um &lt;code&gt;.&lt;/code&gt;, o que indica o final do conteúdo EML a ser enviado.&lt;/p&gt;

&lt;p&gt;Caso não queira efetuar todos esses passos na mão, existem servidores onde você pode efetuar o envio de e-mails para testes, como por exemplo o &lt;a href="https://mxtoolbox.com/SuperTool.aspx"&gt;MxtoolBox&lt;/a&gt;, onde você pode informar o servidor de e-mail e ele executará um teste.&lt;/p&gt;

&lt;p&gt;Alguns outros comandos também existem, porém são menos comuns, por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;VRFY &amp;lt;usuario&amp;gt; &lt;span class="c"&gt;# Verifica se o usuário existe no servidor&lt;/span&gt;
EXPN &amp;lt;lista&amp;gt; &lt;span class="c"&gt;# Expande uma lista de distribuição&lt;/span&gt;
HELP &lt;span class="c"&gt;# Exibe a lista de comandos disponíveis&lt;/span&gt;
NOOP &lt;span class="c"&gt;# Não faz nada, apenas retorna um OK&lt;/span&gt;
RSET &lt;span class="c"&gt;# Reinicia o processo de envio&lt;/span&gt;
QUIT &lt;span class="c"&gt;# Encerra a conexão&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um exemplo de envio simples efetuado manualmente por telnet seria:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GODHO0Lt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/email/assets/envio-por-telnet-exemplo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GODHO0Lt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/email/assets/envio-por-telnet-exemplo.png" alt="Figura de exemplo de envio por telnet" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Explicação Wikipedia

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Email"&gt;Email&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol"&gt;SMTP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Post_Office_Protocol"&gt;POP3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Internet_Message_Access_Protocol"&gt;IMAP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/MX_record"&gt;MX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Sender_Policy_Framework"&gt;SPF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail"&gt;DKIM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/DMARC"&gt;DMARC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;RFCs referentes a e-mail:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc5321"&gt;RFC 5321&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc5322"&gt;RFC 5322&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc2045"&gt;RFC 2045&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc2046"&gt;RFC 2046&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc2047"&gt;RFC 2047&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc2049"&gt;RFC 2049&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc2821"&gt;RFC 2821&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc2822"&gt;RFC 2822&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc3461"&gt;RFC 3461&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc3462"&gt;RFC 3462&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc3463"&gt;RFC 3463&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc3464"&gt;RFC 3464&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc3465"&gt;RFC 3465&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc3466"&gt;RFC 3466&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc3467"&gt;RFC 3467&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc3468"&gt;RFC 3468&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc3469"&gt;RFC 3469&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc4409"&gt;RFC 4409&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Outros sites e documentos:

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mailtrap.io/blog/smtp-commands-and-responses/"&gt;Comandos de SMTP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://mxtoolbox.com/SuperTool.aspx"&gt;MxtoolBox&lt;/a&gt; - Site para testes de e-mail&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://spamassassin.apache.org/"&gt;Spam Assassin&lt;/a&gt; - Servidor de Anti-spam&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>email</category>
    </item>
    <item>
      <title>Como monto meu ambiente Windows do Zero</title>
      <dc:creator>Reinaldo Coelho Sartorelli</dc:creator>
      <pubDate>Tue, 24 Sep 2019 21:47:50 +0000</pubDate>
      <link>https://dev.to/reinaldocoelho/como-monto-meu-ambiente-windows-do-zero-4m3i</link>
      <guid>https://dev.to/reinaldocoelho/como-monto-meu-ambiente-windows-do-zero-4m3i</guid>
      <description>&lt;p&gt;Motivado pelo post do &lt;a class="mentioned-user" href="https://dev.to/luizcarlosfaria"&gt;@luizcarlosfaria&lt;/a&gt;:&lt;br&gt;
&lt;a href="https://gago.io/blog/dev-desktop-fresh-setup-windows-features-tools/"&gt;Dev Desktop fresh setup windows features tools&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Porque automatizar
&lt;/h2&gt;

&lt;p&gt;Porque devemos automatizar nosso setup de Desktop?&lt;br&gt;
Pelo mesmo motivo pelo qual fazemos qualquer automação, para poupar tempo e esforço.&lt;br&gt;
Se você não tem a necessidade de vez ou outra recriar sua máquina, provavelmente este artigo não é para você.&lt;/p&gt;
&lt;h2&gt;
  
  
  O que vou usar
&lt;/h2&gt;

&lt;p&gt;Para o processo, vou utilizar basicamente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Script PowerShell - Instalação de pacotes Windows.&lt;/li&gt;
&lt;li&gt;Chocolatey.org - Gerenciador de pacotes para instalação de aplicativos.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Começando
&lt;/h2&gt;

&lt;p&gt;Imagine que você acabou de formatar a máquina e precisa reinstalar tudo (ou quase, você entenderá ao final) que você tinha na máquina para voltar as atividades.&lt;/p&gt;

&lt;p&gt;E agora, como você pode preparar seu ambiente novamente em 3 passos?&lt;/p&gt;
&lt;h3&gt;
  
  
  1 - Instando as Features do Windows
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NOTA:&lt;/strong&gt; A instalação de features do windows varia se você estiver tratando de uma versão Desktop ou Server, por isso vale dar uma lida &lt;a href="https://peter.hahndorf.eu/blog/WindowsFeatureViaCmd.html"&gt;neste artigo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NOTA2:&lt;/strong&gt; Este post está apresentando como tratar em Windows10 Desktop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Atualmente o powershell nos dá bastante poder em relação ao windows e nos permite instalar praticamente tudo via script.&lt;br&gt;
Para isso bastam 2 passos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Liberar acesso a política de execução de script do powershell.&lt;/li&gt;
&lt;li&gt;Escolher a lista de features que gostaria de instalar.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Abaixo segue o script básico que uso na minha máquina como desenvolvedor para ter acesso a funções de IIS, Hyper-V, DotNet Core Hosting e Telnet Client (basicamente o mais importante).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// code/config-windows.ps1

#######################################################
### PASSO 1 - Efetua liberação de acesso ao powershell.
#######################################################
Set-ExecutionPolicy Bypass -Scope Process

# ##############################################################################################
### PASSO 2 - Efetua um teste de conexão com a internet para garantir os recursos necessários.
###     ALERTA: O Windows tem comandos diferentes de acordo com a sua versão, se os comandos abaixo
###             não funcionarem, verifique: https://peter.hahndorf.eu/blog/WindowsFeatureViaCmd.html
# ##############################################################################################
Write-Host "Verificando se ha conexao com a internet..."
$hasInternet = (Test-Connection google.com -Count 3 -Quiet);
if ($hasInternet -eq $false) {
  Write-Host "Concluido teste de internet com FALHA..."
  return $false
}
Write-Host "Concluido teste de internet com sucesso..."

Write-Host "Instalando recurso Hostable Web Core"
Enable-WindowsOptionalFeature -Online -FeatureName "IIS-HostableWebCore" -NoRestart

Write-Host "Instalando HTTP Redirect"
Enable-WindowsOptionalFeature -Online -FeatureName "IIS-HttpRedirect" -NoRestart

Write-Host "Instalando WebDAV (File access and manipulation. More: https://www.cloudwards.net/what-is-webdav/)"
Enable-WindowsOptionalFeature -Online -FeatureName "IIS-WebDAV" -NoRestart

Write-Host "Instalando recurso WebSocket"
Enable-WindowsOptionalFeature -Online -FeatureName "IIS-WebSockets" -NoRestart

Write-Host "Instalando Logging IIS"
Enable-WindowsOptionalFeature -Online -FeatureName "IIS-CustomLogging" -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName "IIS-HttpLogging" -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName "IIS-LoggingLibraries" -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName "IIS-ODBCLogging" -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName "IIS-ManagementScriptingTools" -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName "IIS-HttpTracing" -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName "IIS-RequestMonitor" -NoRestart

Write-Host "Instalando DotNetFramework"
Enable-WindowsOptionalFeature -Online -FeatureName "WCF-Services45" -NoRestart

Write-Host "Ativando recurso: ASPNET45"
Enable-WindowsOptionalFeature -Online -FeatureName "IIS-ASPNET45" -NoRestart # -LimitAccess

Write-Host "Ativando recurso: Hyper-V"
Enable-WindowsOptionalFeature -Online -FeatureName "Microsoft-Hyper-V" -NoRestart # -LimitAccess
Enable-WindowsOptionalFeature -Online -FeatureName "Microsoft-Hyper-V-Management-Clients" -NoRestart # -LimitAccess
Enable-WindowsOptionalFeature -Online -FeatureName "Microsoft-Hyper-V-Management-PowerShell" -NoRestart # -LimitAccess
Enable-WindowsOptionalFeature -Online -FeatureName "Microsoft-Hyper-V-Offline" -NoRestart # -LimitAccess
Enable-WindowsOptionalFeature -Online -FeatureName "Microsoft-Hyper-V-Online" -NoRestart # -LimitAccess

## Detalhes em: https://docs.microsoft.com/en-us/iis/install/installing-iis-85/installing-iis-85-on-windows-server-2012-r2
Write-Host "Instalando recurso: IIS"
Enable-WindowsOptionalFeature -Online -FeatureName "IIS-WebServer" -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName "IIS-WebServerManagementTools" -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName "IIS-ManagementConsole" -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName "IIS-DefaultDocument" -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName "IIS-HttpLogging" -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName "IIS-LoggingLibraries" -NoRestart

Write-Host "Instalando recurso: Application Initialization"
Enable-WindowsOptionalFeature -Online -FeatureName "IIS-ApplicationInit" -NoRestart

## Outros apoios opcionais:
Enable-WindowsOptionalFeature -Online -FeatureName "TelnetClient" -NoRestart

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2 - Instando o Chocolatey
&lt;/h3&gt;

&lt;p&gt;Estando com o windows ajustado, temos agora que instalar nosso gerenciador de pacotes, para que possamos instalar os aplicativos que vamos usar em nosso ambiente.&lt;/p&gt;

&lt;p&gt;No site do &lt;a href="https://chocolatey.org/install"&gt;chocolatey&lt;/a&gt; você tem os passos mais recentes da instalação, mas se for utilizar a forma mais simples (com o repositório do nuget.org), é só executar o comando powershell de instalação.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NOTA:&lt;/strong&gt; Sim, é possível instalar um repositório privado de programas, seja para você ou para a empresa, isso também se encontra na documentação do site.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para nosso exemplo, precisamos apenas executar o script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// code/install-chocolatey.ps1

Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Informação adicional:&lt;/strong&gt; O &amp;amp; antes dos comandos no Powershell é uma das formas de executar comandos console no script powershell.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3 - Instalando os programas
&lt;/h3&gt;

&lt;p&gt;Agora que temos o windows atualizado e o chocolatey instalado, podemos colocar nossa lista de programas para instalar e ir tomar um café...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// code/install-programs.ps1

﻿## Programas basicos
&amp;amp; cinst 7zip -y
&amp;amp; cinst GoogleChrome -y
&amp;amp; cinst ChocolateyGUI -y
&amp;amp; cinst notepadplusplus -y

## Office
&amp;amp; cinst libreoffice -y

## Desenvolvimento
&amp;amp; cinst dotnetcore-sdk -y
&amp;amp; cinst git -y
&amp;amp; cinst sql-server-management-studio -y
&amp;amp; cinst nodejs -y
&amp;amp; cinst visualstudio2019community -y
&amp;amp; cinst visualstudiocode -y
&amp;amp; cinst kdiff3 -y

## Meus Programas
&amp;amp; cinst dropbox -y
&amp;amp; cinst skype -y
&amp;amp; cinst vlc -y
&amp;amp; cinst slack -y

## Jogos
&amp;amp; cinst steam -y

## Container
&amp;amp; cinst docker -y
&amp;amp; cinst docker-compose -y
&amp;amp; cinst docker-machine -y
&amp;amp; cinst docker-desktop -y

## VMs as a Code
&amp;amp; cinst terraform -y
&amp;amp; cinst packer -y

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando o script terminar, sua máquina estará pronta, com todos os programas que você tinha instalados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como encontrar novos programas
&lt;/h2&gt;

&lt;p&gt;Uma das suas dúvidas neste momento pode ser "E como eu encontro outros programas?". O choco (apelido carinhoso do chocolatey) tem vários comandos úteis, um deles é o &lt;strong&gt;search&lt;/strong&gt; que permite pesquisar no repositório.&lt;/p&gt;

&lt;p&gt;Imagine que você gostaria de saber por exemplo o que existem de opções relacionadas a office no repositório, então você poderia pesquisar com o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// code/chocolatey-search.txt

&amp;amp; choco search office

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você terá um resultado parecido com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// code/resultado-pesquisa.txt

Chocolatey v0.10.15
office-to-pdf 1.8 [Approved]
officeribboneditor 4.4.2 - Possibly broken
kingsoft-office-free 9.1.0.20140820 - Possibly broken
office-online-chrome 1.5.0.20170115 [Approved]
Office365ProPlus 2016.20190418 [Approved]
wps-office-free 11.2.0.8970 [Approved] Downloads cached for licensed users
Office365Business 11509.33604 [Approved]
microsoft-office-deployment 16.0.11901.20022 [Approved]
cryptopro-office-signature 2.0.11980 [Approved] Downloads cached for licensed users
OfficeProPlus2013 15.0.4827 [Approved] Downloads cached for licensed users
disableofficenag-winconfig 0.0.1 [Approved]
Office365HomePremium 2016.20160728 [Approved] Downloads cached for licensed users
disableofficemacros-winconfig 0.0.1 [Approved]
officecustomuieditor 1.1 - Possibly broken
8x8virtualoffice 6.2.4.4 [Approved]
office2013-proofingtools-nl 15.0.4420.1017 [Approved] Downloads cached for licensed users
office365-2016-deployment-tool 16.0.7614.3602 [Approved] Downloads cached for licensed users - Possibly broken for FOSS users (due to original download location changes by vendor)
officedevtools 14.0.23930 [Approved] Downloads cached for licensed users
visualstudio2017-workload-office 1.2.2 [Approved]
visualstudio2019-workload-office 1.0.0 [Approved]
libreoffice-help 5.2.0 [Approved] - Possibly broken
windows-iso-downloader 8.21 [Approved] Downloads cached for licensed users
OffCAT 2.1 [Approved] Downloads cached for licensed users - Possibly broken for FOSS users (due to original download location changes by vendor)
crealogix-paymaker-office 5.0.8.1 [Approved] Downloads cached for licensed users - Possibly broken for FOSS users (due to original download location changes by vendor)
libreoffice-fresh 6.2.5 [Approved] Downloads cached for licensed users
libreoffice-still 6.0.7 [Approved] Downloads cached for licensed users - Possibly broken for FOSS users (due to original download location changes by vendor)
officetabenterprise 9.80 - Possibly broken
officetabfree 9.70.20140510 - Possibly broken
officeremote 1.1.3.0 [Approved]
vstor2010 10.0.60828 [Approved] Downloads cached for licensed users
onlyoffice 5.3.5 [Approved] Downloads cached for licensed users
officegate-configuration-tool 1.2.8 [Approved] Downloads cached for licensed users
Excel.Viewer 12.0.6219.1000 - Possibly broken
Powerpoint.Viewer 12.0.6219.1000 - Possibly broken
Word.Viewer 12.0.6219.1000 - Possibly broken
visualstudio2019-workload-officebuildtools 1.0.0 [Approved]
visualstudio2017-workload-officebuildtools 1.0.1 [Approved]
sharepoint.2010.sdk 12.0.0.1 - Possibly broken
FoxitReader 9.6.0.25144 [Approved] Downloads cached for licensed users
SkypeForBusiness 11107.33602 [Approved] Downloads cached for licensed users - Possibly broken for FOSS users (due to original download location changes by vendor)
invantive-control-for-excel 17.32.70 [Approved] Downloads cached for licensed users
CutePDF 3.2 [Approved] Downloads cached for licensed users
contract-tools 1.30.6.0 [Approved] Downloads cached for licensed users
officeins 1.20 [Approved] Downloads cached for licensed users
wsus-offline-update 11.8.1 [Approved] Downloads cached for licensed users
project.2010.sdk 12.0.0.1 - Possibly broken
kontur-addtotrusted 2.0.18.2 [Approved] Downloads cached for licensed users
kontur-addtotrusted.portable 2.0.18.2 [Approved] Downloads cached for licensed users
kontur-plugin 3.10.2 [Approved] Downloads cached for licensed users
wordcontentcontroltoolkit 1.3 - Possibly broken
SkypeForBusinessBasic 11107.33602 [Approved] Downloads cached for licensed users - Possibly broken for FOSS users (due to original download location changes by vendor)
previewhandlerpack 1.0.0.0 - Possibly broken
kontur-certificates 4.7.27.6074 [Approved] Downloads cached for licensed users
tomboy 1.15.7 [Approved] Downloads cached for licensed users
rutoken-web-tool 1.4.0.42 [Approved] Downloads cached for licensed users
cryptopro-pdf 2.0.0811 [Approved] Downloads cached for licensed users - Possibly broken for FOSS users (due to original download location changes by vendor)
gosuslugi-plugin 3.0.7.0 [Approved] Downloads cached for licensed users
microsoft-teams.install 1.2.00.24753 [Approved] Downloads cached for licensed users
microsoft-teams 1.2.00.24753 [Approved] Downloads cached for licensed users
yed 3.19 [Approved]
onenote 16.0.11929.20300 [Approved] Downloads cached for licensed users
OpenOffice 4.1.6 [Approved]
produkey.install 1.93 [Approved] Downloads cached for licensed users
produkey.portable 1.93 [Approved] Downloads cached for licensed users
ProduKey 1.92 [Approved] - Possibly broken
FileFormatConverters 1.0.1 - Possibly broken
rutoken-drivers 4.2.5.0 [Approved] Downloads cached for licensed users
rutoken-egais-drivers 4.3.2.0 [Approved] Downloads cached for licensed users
rutoken-magistra-drivers 1.06.00.0035 [Approved] Downloads cached for licensed users
rutoken-web-plugin 1.6.2.0 [Approved] Downloads cached for licensed users
rutoken-plugin 4.0.1.0 [Approved] Downloads cached for licensed users
libreoffice 5.4.4.20180111 [Approved] - Possibly broken
libreoffice-oldstable 5.3.7.20180111 [Approved] - Possibly broken
driver-officegate 1.0.0.0 [Approved] Downloads cached for licensed users
MSAccess2010-redist 1.0
MSAccess2010-redist-x64 1.1 [Approved]
MSAccess2010-redist-x86 1.2 [Approved]
azure-information-protection-client 1.48.204.0 [Approved] Downloads cached for licensed users - Possibly broken for FOSS users (due to original download location changes by vendor)
azure-information-protection-unified-labeling-client 2.0.779.0 [Approved] Downloads cached for licensed users - Possibly broken for FOSS users (due to original download location changes by vendor)
MSFilterPack2-redist-x64 1.1 [Approved]
msoidcli 2.1 [Approved] Downloads cached for licensed users
rubberduck 1.4.3 [Approved] Downloads cached for licensed users
msoid-cli 7.250 [Approved] Downloads cached for licensed users
brutaldoom-goingdown 1.0.0 [Approved] Downloads cached for licensed users
winscan2pdf 4.98 [Approved]
kopano-deskapp-nightly 2.4.1 [Approved]
tidytabs 1.3.5 [Approved] - Possibly broken
tidytabs.portable 1.3.5 [Approved] Downloads cached for licensed users - Possibly broken for FOSS users (due to original download location changes by vendor)
tidytabs.install 1.3.5 [Approved] Downloads cached for licensed users - Possibly broken for FOSS users (due to original download location changes by vendor)
cdmessenger 3.3 [Approved] Downloads cached for licensed users
ekeyfinder 0.1.7 [Approved]
teamviewer-chrome 13.0.281 [Approved]
polleverywhere 2.11.1 [Approved] Downloads cached for licensed users
made2010 2016.07.01 [Approved] Downloads cached for licensed users
projectlibre.portable 1.9.1 [Approved] Downloads cached for licensed users
InSync 1.5.5.37367 [Approved] Downloads cached for licensed users
xmlspy 2019.3.1 [Approved] Downloads cached for licensed users
ammyy-admin 3.9.0.0 [Approved]
hdguard 10.0.0.4 [Approved] Downloads cached for licensed users
softkey-revealer.portable 2.8.0.20161009 [Approved] Downloads cached for licensed users
greenshot 1.2.10.6 [Approved] Downloads cached for licensed users
keyfinder 2.0.10.13 [Approved]
expandrive 7.0.16 [Approved] Downloads cached for licensed users
doPDF 10.3.115 [Approved] Downloads cached for licensed users
bioviadraw-ae 2018.0.0.20180925 [Approved] Downloads cached for licensed users
password-generator 3.0.0 [Approved] Downloads cached for licensed users - Possibly broken for FOSS users (due to original download location changes by vendor)
invantive-dotnet-optimizer 17.8.8 [Approved]
clamav 0.99.3 [Approved] Downloads cached for licensed users
hardentools 1.0 [Approved]
teamviewer 14.6.2452 [Approved] Downloads cached for licensed users
sparkleshare 1.5.0.20161115 [Approved] Downloads cached for licensed users
batch-docs 5.6.0 [Approved] Downloads cached for licensed users
biorhythms-calculator 2.0.0 [Approved] Downloads cached for licensed users - Possibly broken for FOSS users (due to original download location changes by vendor)
batch-word-replace 5.6.0 [Approved] Downloads cached for licensed users
envelope-printer 2.0.1 [Approved] Downloads cached for licensed users
save-to-google-drive-chrome 2.1.1 [Approved]
openchrom 1.3.0 [Approved] Downloads cached for licensed users
ultimate-settings-panel 6.3 [Approved] Downloads cached for licensed users
gsuite-migration-exchange 5.1.20.0 [Approved] Downloads cached for licensed users
dropbox 81.4.195 [Approved] Downloads cached for licensed users
leanify 0.4.2 [Approved] Downloads cached for licensed users
ost2 2.13.0.28 [Approved] Downloads cached for licensed users
bginfo 4.28 [Approved] Downloads cached for licensed users
123 packages found.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Outras opções principais de comando no chocolatey são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;choco install [nome do pacote]&lt;/em&gt; - Instala o programa.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;choco uninstall [nome do pacote]&lt;/em&gt; - Remove o programa.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;choco update [nome do pacote]&lt;/em&gt; - Atualiza o programa.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É possível também utilizar algumas abreviações como por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;cup all -y&lt;/em&gt; - Atualiza todos os programas que tiverem versão atualizada.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limitações
&lt;/h2&gt;

&lt;p&gt;Quando utilizamos a instalação padrão e o repositório publico do Chocolatey, você normalmente não terá acesso a programas que não sejam freeware, trial ou opensource.&lt;/p&gt;

&lt;p&gt;Os programas licensiados como pacote Office da Microsoft por exemplo não se encontram na listagem.&lt;/p&gt;

&lt;p&gt;Se você tem a necessidade de ter programas registrados o que pode fazer é criar um repositório seu e criar os scripts de instalação você mesmo para o seu programa.&lt;/p&gt;

&lt;p&gt;A boa notícia é que com algumas exceções, você consegue ter pelo menos a grande maioria dos seus programas instalados, já que o chocolatey está contando com um repositório bem abrangente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusões
&lt;/h2&gt;

&lt;p&gt;Se você achou que executar 3 scripts ainda assim é trabalhoso, pode juntá-los num só e executar apenas um script para efetuar todos esses passos em sequência, e ao formatar a máquina ter praticamente tudo instalado com literalmente um clique.&lt;/p&gt;

&lt;p&gt;Eu sou muito adepto a projetos open-source e tenho basicamente todo o meu pacote de programas disponíveis no Chocolatey.&lt;/p&gt;

&lt;p&gt;Espero que tenham gostado, e me informem se este artigo te ajudou em alguma coisa.&lt;/p&gt;

</description>
      <category>windows</category>
      <category>chocolatey</category>
      <category>install</category>
    </item>
    <item>
      <title>Dá pra gerar serviço Windows/Linux com .Net?</title>
      <dc:creator>Reinaldo Coelho Sartorelli</dc:creator>
      <pubDate>Mon, 09 Sep 2019 01:49:18 +0000</pubDate>
      <link>https://dev.to/reinaldocoelho/da-pra-gerar-servico-windows-linux-com-net-5g2m</link>
      <guid>https://dev.to/reinaldocoelho/da-pra-gerar-servico-windows-linux-com-net-5g2m</guid>
      <description>&lt;p&gt;Recentemente tive a necessidade de manter um código de serviço Windows que também pudesse ser executado como um serviço no Linux.&lt;/p&gt;

&lt;p&gt;Estudando algumas possibilidades, a maneira mais elegante que encontrei foi aproveitar o mesmo projeto dotnetcore para gera o serviço do Windows ou um CLI que permite a configuração como serviço no Linux.&lt;/p&gt;

&lt;p&gt;Vou explicar em seguida, todos os passos que fiz para que isso funcionasse utilizando a biblioteca TopShelf e gerando uma compilação para cada plataforma.&lt;/p&gt;

&lt;p&gt;Todo código apresentado abaixo está disponível no GitHub:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/reinaldocoelho/dotnet-service-cross-platform"&gt;dotnet-service-cross-platform&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  O que é a biblioteca TopShelf
&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://topshelf-project.com/"&gt;TopShelf&lt;/a&gt; é uma biblioteca que visa facilitar e organizar o processo para gerar serviço Windows.&lt;/p&gt;

&lt;p&gt;A partir da versão 4.1, está suportando o padrão &lt;strong&gt;netstandard2.0&lt;/strong&gt; que nos permite compilar o projeto para FullFramework e dotnetcore.&lt;/p&gt;

&lt;p&gt;Atualmente ela trabalha da seguinte forma, você cria uma aplicação console utilizando a biblioteca TopShelf, ela irá entender automaticamente alguns comandos como “install” por exemplo, que efetua a instalação do serviço do Windows. Se você não informar nenhum parâmetro esperado pelo TopShelf, a aplicação irá executar como um console, e isso nos permite fazer o que esperamos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando o código comum
&lt;/h2&gt;

&lt;p&gt;O código comum será um projeto console em dotnetcore (estou usando a versão 2.1 no caso), onde vou adicionar a dependência para a biblioteca TopShelf.&lt;/p&gt;

&lt;p&gt;A sequência inicial de comandos para criar o projeto será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;c:\code\simple-service-counter&amp;gt; dotnet new console
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida adicionamos a referência ao TopShelf:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;c:\code\simple-service-counter &amp;gt; dotnet add package Topshelf --version 4.1.0.177-develop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida vamos a um detalhe importante, vamos ajustar o projeto para dar suporte a mais de um Framework, possibilitando que nosso build compile para ambas as plataformas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yhmlClIA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/da-pra-gerar-servico-windows-linux-com-dotnet/assets/image1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yhmlClIA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/da-pra-gerar-servico-windows-linux-com-dotnet/assets/image1.png" alt="Repare que a tag de projeto foi renomeada para “TargetFrameworks”, no plural, indicando que o projeto aceitará mais de um Framework." title="Repare que a tag de projeto foi renomeada para “TargetFrameworks”, no plural, indicando que o projeto aceitará mais de um Framework." width="656" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos criar uma classe (&lt;strong&gt;ImplementacaoServico.cs&lt;/strong&gt;) que será nosso código do serviço. Nosso serviço será um simples contador, mas você poderá implementar o que precisar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RlinkvRR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/da-pra-gerar-servico-windows-linux-com-dotnet/assets/image2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RlinkvRR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/da-pra-gerar-servico-windows-linux-com-dotnet/assets/image2.png" alt="Classe com a implamentação do contador (nosso serviço Fake)." title="Classe com a implamentação do contador (nosso serviço Fake)." width="683" height="930"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos agora configurar a classe inicial do projeto console para utilizar o TopShelf e chamar nossa lógica.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--j2r86mSw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/da-pra-gerar-servico-windows-linux-com-dotnet/assets/image3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--j2r86mSw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/da-pra-gerar-servico-windows-linux-com-dotnet/assets/image3.png" alt="Implementação simples do método Main, incluindo a chamada do serviço." title="Implementação simples do método Main, incluindo a chamada do serviço." width="702" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Perfeito, com esses poucos passos você pode executar seu projeto simplesmente para verificar se está funcionando como um console normal.&lt;/p&gt;

&lt;p&gt;Execute o comando abaixo para ver seu serviço executado como um console:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;c:\code\simple-service-counter &amp;gt; dotnet run --framework net461 (ou netcoreapp2.1)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se tudo estiver correto, você deverá ter um resultado como este:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lchI-IpA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/da-pra-gerar-servico-windows-linux-com-dotnet/assets/image4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lchI-IpA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/da-pra-gerar-servico-windows-linux-com-dotnet/assets/image4.png" alt="Resultado de console esperado se o código estiver correto." title="Resultado de console esperado se o código estiver correto." width="784" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tudo OK até aqui? Então vamos seguir para gerar e instalar o serviço no Windows e em seguida no Linux.&lt;/p&gt;

&lt;h2&gt;
  
  
  Publicando e instalando no Windows
&lt;/h2&gt;

&lt;p&gt;Primeiramente vamos publicar nosso serviço apontando para o framework 4.6.1 que nos permite instalar o serviço no windows.&lt;/p&gt;

&lt;p&gt;Execute o seguinte comando para gerar a publicação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;c:\code\simple-service-counter &amp;gt; dotnet publish simple-service-counter.csproj -c Release -f net461 -o dist\windows --self-contained
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos instala-lo no windows, para isso entre na pasta “dist\windows” dentro da pasta do projeto e digite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;c:\code\simple-service-counter\dist\windows &amp;gt; simple-service-counter.exe install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E você deverá ter a seguinte saída:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U_Y8ZyCS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/da-pra-gerar-servico-windows-linux-com-dotnet/assets/image5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U_Y8ZyCS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/da-pra-gerar-servico-windows-linux-com-dotnet/assets/image5.png" alt="Saída esperada com a instalação correta do serviço." title="Saída esperada com a instalação correta do serviço." width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se você abrir o gerenciador de serviços do Windows, poderá iniciar e parar o serviço.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3lbJtv30--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/da-pra-gerar-servico-windows-linux-com-dotnet/assets/image6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3lbJtv30--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/da-pra-gerar-servico-windows-linux-com-dotnet/assets/image6.png" alt="Serviço instalado já nos registros de serviços do windows. (neste momento pode ser iniciado e parado)." title="Serviço instalado já nos registros de serviços do windows. (neste momento pode ser iniciado e parado)." width="800" height="595"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para remover o serviço, somente digite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;c:\code\simple-service-counter\dist\windows &amp;gt; simple-service-counter.exe uninstall
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fácil né.&lt;/p&gt;

&lt;h2&gt;
  
  
  Publicando e instalando no Linux
&lt;/h2&gt;

&lt;p&gt;Para o Linux vamos fazer uma publicação utilizando dotnetcore 2.1 e publicar para Linux utilizando a opção &lt;strong&gt;self-contained&lt;/strong&gt; (Que leva com a publicação todas as dependências, incluindo o framework evitando a necessidade de instalá-lo no Linux).&lt;/p&gt;

&lt;p&gt;Para gerar a publicação, execute o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;c:\code\simple-service-counter &amp;gt; dotnet publish simple-service-counter.csproj -c Release -f netcoreapp2.1 -o dist\linux -r linux-x64 --self-contained
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos compactar a pasta “&lt;strong&gt;dist\linux&lt;/strong&gt;” onde foi publicado o projeto e vamos levar esta pasta para um servidor (ou VM) com Linux (meu caso Lubuntu 18.10).&lt;/p&gt;

&lt;p&gt;Note que o arquivo compactado fica grande ~30MB. E isso é porque está levando junto todas as dependências, incluindo o framework.&lt;/p&gt;

&lt;p&gt;Copie o arquivo compactado para sua máquina Linux. ( Use o programa scp ou outro recurso qualquer para copiar).&lt;/p&gt;

&lt;p&gt;Já no Linux, descompacte o arquivo com o comando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ unzip &amp;lt;arquivo&amp;gt;.zip -d ~/meuservico
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seguida precisamos dar permissão de execução para o programa executável, então entre na pasta onde estão os arquivos e altere a permissão para:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ chmod 755 simple-service-counter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos agora testar se nosso console funciona simplesmente executando ele no Shell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ./simple-service-counter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Veja que a saída de console do programa funciona conforme esperado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JZJxsAlM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/da-pra-gerar-servico-windows-linux-com-dotnet/assets/image7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JZJxsAlM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/da-pra-gerar-servico-windows-linux-com-dotnet/assets/image7.png" alt="Resultado funcional!" title="Resultado funcional!" width="800" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O que precisamos agora para torná-lo um serviço, que possa ser iniciado e parado nos padrões &lt;em&gt;systemd&lt;/em&gt; é seguir os passos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Criar um arquivo de configuração em “&lt;em&gt;/etc/systemd/system/servico-counter.service&lt;/em&gt;”, com o conteúdo:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Unit]
Description=Servico contador
After=network.target
[Service]
User=root
Restart=on-failure
Type=exec
ExecStart=/&amp;lt;LOCAL&amp;gt;/meuservico/linux/simple-service-counter
[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Iniciar o serviço executando:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo systemctl start servico-counter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Verificar o status do serviço para verificar se está em execução, com o comando:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo systemctl status servico-counter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esta checagem se estiver ok irá apresentar a seguinte saida:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XSyqZOIg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/da-pra-gerar-servico-windows-linux-com-dotnet/assets/image8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XSyqZOIg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/reinaldocoelho/dev.to/master/blog-posts/da-pra-gerar-servico-windows-linux-com-dotnet/assets/image8.png" alt="O status apresenta tanto a situação, como um possível erro ou um trecho da saída para confirmar a execução." title="O status apresenta tanto a situação, como um possível erro ou um trecho da saída para confirmar a execução." width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Podemos definir para que ele seja iniciado com o boot se desejar, utilizando o comando:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo systemctl enable servico-counter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Podemos também pará-lo, com o comando:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo systemctl stop servico-counter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Para remover o serviço, basta apagar o arquivo “/etc/systemd/system/servico-counter.service” e em seguida excluir a pasta da aplicação.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Simples também né!!!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Como vimos é muito simples criar uma estrutura que nos permita portar um serviço entre windows e Linux mantendo um único código fonte para ambos.&lt;/p&gt;

&lt;p&gt;Espero que este artigo ajude e que eu possa gerar muitos outros em seguida.&lt;/p&gt;

&lt;p&gt;Tem alguma dica, sugestão, crítica ou dúvida, pode me enviar.&lt;/p&gt;

&lt;p&gt;Muito obrigado.&lt;/p&gt;

&lt;h2&gt;
  
  
  NOTAS IMPORTANTES
&lt;/h2&gt;

&lt;p&gt;Um problema que identifiquei em todas as versões posteriores que utilizei do TopShelf é que algo nele não está mais permitindo a execução como console no Linux :-(.&lt;/p&gt;

&lt;p&gt;Abri uma issue no projeto do TopShelf para verificarem este ponto, ou entendermos o porque de ter parado:&lt;br&gt;
&lt;a href="https://github.com/Topshelf/Topshelf/issues/513"&gt;Topshelf#513&lt;/a&gt;&lt;/p&gt;

</description>
      <category>services</category>
      <category>dotnet</category>
      <category>topshelf</category>
    </item>
  </channel>
</rss>
