terça-feira, 8 de setembro de 2009

Por que Delphi?




Antes de ser um texto apaixonado de um fanboy qualquer de uma tecnologia qualquer, isso é um texto explicativo do básico do básico sobre
linguagens de programação e compiladores.




Muitas pessoas confundem erroneamente uma linguagem de programação com o seu compilador e com a IDE em que se programa, caso houver uma. Muitas pessoas também confundem
o fato de uma linguagem ser "compilada" ou "interpretada" por um outro sistema como uma limitação da linguagem em si.




O que deve ficar claro para qualquer programador, iniciante ou experiente, é que a linguagem é a parte mais abstrata e flexível do ato de programar em si.




Uma linguagem de programação, assim como a linguagem natural nativa de um povo ou civilização qualquer, não passa de um conjunto de simbolos, grupos de simbolos, palavras
e regras gramaticais para interligação e relacionamento entre esses simbolos.




Mais do que isso, uma linguagem, seja nas artes, nas exatas ou em qualquer campo do conhecimento, é uma maneira de expressar idéias, conceitos, padrões e transmitir informações.
Portanto, uma linguagem de programação é uma maneira de um programador, seja ele humano ou não, transmitir informações e/ou dados a um outro programador, humano ou não, ou a um computador.




Quando eu digo "programador, humano ou não" me refiro ao fato de que o programador pode ser também um sistema ou programa de computador, que simplesmente
traduzem um texto ou programa num nível mais alto e menos específico para um nível mais baixo e mais específico de linguagem.




Sim, programas podem gerar programas, que por sua vez podem gerar programas, e assim por diante. Por exemplo você pode usar um compilador de C para compilar o código fonte do interpretador de PHP ou Python, e depois criar um programa em PHP ou Python para que ele possa ser "rodado".




Isto posto, qualquer pessoa ou empresa pode criar qualquer tipo de linguagem de programação. Ela terá utilidade somente abstrata (ou didática) a menos que uma pessoa ou empresa crie um compilador ou interpretador para essa linguagem.




As possibilidades de uma linguagem podem ser nulas ou infinitas, tudo depende do compilador. Qualquer linguagem pode ser usada para criar sistemas operacionais, rotinas de boot, páginas web, drivers de dispositivo e sistemas comerciais, industriais ou games, bastando que exista um compilador para isso.




Por exemplo a linguagem Pascal. Ela já passou por diversas evoluções e modificações, existem diversos "filhos" dela, como Oxygene, object pascal etc..., mas em essência ela continua a mesma.
Existem vários compiladores de pascal, desde o Turbo Pascal Compiler, passando pelo compilador do Delphi, o Free Pascal Compiler e outros, para outros sistemas operacionais e fins.
A linguagem C também possui o GCC open-source, o compilador C da microsoft, o compilador C da Borland/Embarcadero e assim por diante.




Onde quero chegar com isso?

Programadores inexperientes têm a tendência de culpar uma linguagem pelo que se pode ou não produzir com ela. Por exemplo, dizem que com C você pode criar programas em baixo nível, como Sistemas Operacionais e Drivers de Dispositivo, enquanto que em Pascal você não pode fazer isso.

Eu costumo dizer que simplesmente EU, pessoalmente, AINDA não consegui encontrar um compilador de pascal ou qualquer uma de suas derivadas que me permita compilar um driver de dispositivo.

Repare que a culpa não é da linguagem e sim do compilador. Poderia ser o contrário. Se existisse um compilador capaz de compilar drivers de dispositivo em Pascal mas não em C, as pessoas iriam usar Pascal para criar driver de dispositivo e afirmar exatamente o crontrário: que "não dá" para escrever drivers de dispositivo em C.




Com tantas linguagens e tecnologias, amplas ou específicas, conhecidas ou não, que pipocam todo dia, é até um pecado culpar a linguagem pelo que ela pode ou não produzir.

Por exemplo, suponhamos que não existisse nenhum poeta na frança, seria correto dizer que é impossível fazer poesia em Francês? Ou se não existisse nenhum músico na Itália, seria correto dizer que não se pode fazer música em Italiano?




A verdade é que, da mesma forma que existem compiladores com certas capacidades para uma linguagem, poderiam existir compiladores com essa mesma capacidade para qualquer outra.




Eu digo compiladores porque para uma linguagem gerar um executável nativo de um sistema, arquitetura ou processador, ou seja, para gerar um arquivo binário do seu estado mais puro, que nada mais é do que um conjunto de instruções para um determinado processador, uma linguagem precisa de um compilador.




No caso dos interpretadores, eles nada mais são do que programas que leem trechos ou linhas de código, as interpretam e executam, ou as compilam para um formato binário em memória, sob demanda, em tempo de execução e fazem o que tem que fazer.




Os iniciantes insistem em dizer, por exemplo, que C, C++ e Pascal são compilados enquanto que Java, Python, PHP e C# são interpretados.




Eu insisto em dizer que uma linguagem pode ser compilada ou interpretada a medida que exista um compilador ou interpretador para ela. Como programador eu sei que nada impede ninguém de criar um
interpretador para C++, ou uma máquina virtual para Pascal.

Da mesma forma, uma empresa qualquer poderia criar um compilador de Java, que transformasse um codigo fonte Java em um binário puro e nativo de uma determinada arquitetura. Da mesma forma poderiam ser criados compiladores de Python ou PHP, que fizesse, inclusive, drivers de dispositivo em PHP.

Eu já vi, por exemplo, Basic rodar compilado e interpretado. COBOL compilado e interpretado, e assim por diante.




As possibilidades sempre foram infinitas, é só usar a imaginação.

A única coisa que me impede de criar agora um compilador ou interpretador de Portugol agora é o tempo e a dificuldade envolvida.




Muitas pessoas ainda dizem que a melhor linguagem de todas é o Assembly, porque todos os compiladores um dia foram escritos em Assembly, portanto Assembly é a mãe de todos os compiladores e de todas as linguagens.




Vão engano.

Pense no seguinte: Ao criar o primeiro martelo da humanidade, alguém usou uma pedra para fixar o cabo de madeira no martelo propriamente dito, certo?

E ao criar o segundo martelo? Será que não foi mais fácil e inteligente usar o primeiro martelo para montar o segundo?

Assim também é com as linguagens de programação. Da mesma forma como no passado foi usado Assembly para criar o primeiro compilador de C, hoje usa-se muito o C para se criar Assemblers, das mais diversas plataformas.

Se você duvida, faça uma rápida busca no Google e confira o Nasm, um assembler GNU, open-source muito usado e difundido no universo GNU. Baixe os fontes dele, ele é totalmente escrito em C.

Ele poderia ser escrito em pascal, por exemplo. E a única coisa que impediu que ele fosse escrito em assembly foi a praticidade.




Mais uma vez eu repito: qualquer linguagem pode escrever absolutamente qualquer programa, e qualquer programa pode ser escrito em qualquer linguagem. Tudo depende, em primeira instância, do conhecimento e criatividade do programador, e em segunda instância do compilador.

Compiladores e Assemblers também são programas, onde existe uma entrada (um arquivo de código fonte), existe um processamento, e existe uma saída (um arquivo binário, executável, um programa ou parte dele, uma dll etc). Por isso compiladores e assemblers podem ser escritos também em qualquer linguagem.




As pessoas também confundem a linguagem com a IDE. Por exemplo muitos dizem: "eu gosto mais de delphi, porque é fortemente tipado" se referindo à linguagem, quando deveriam dizer "eu gosto mais de object pascal".

Ou dizem : "eu gosto mais de C#, porque nele você cria web sites muito intuitivamente" referindo - se a IDE visual studio, quando na verdade deveriam dizer que gostam de Visual Studio.




Uma IDE, ou Integrated Development Environment (ambiente de desenvolvimento integrado) nada mais é do que um conjunto de softwares que atuam como uma grande caixa de
ferramentas para programadores. Uma IDE contém um editor de código fonte, geralmente com iluminação e destaque de sintaxe, pré validação de sintaxe, recursos para auto-completar código etc...

Uma IDE é uma ferramenta que ajuda e torna mais prático a criação ou formulação de um arquivo de código fonte, bem como o agrupamento de vários desses arquivos em um projeto.

A IDE pode conter geradores de codigos, wizzards, templates, integração com bancos de dados ou leitores / visualizadores / editores de bancos de dados, ou UML. Integração com sistemas de versionamento de código, componentes, snippets, ferramentas de desenho de páginas e formulários e, o mais importante:

Toda a IDE possui uma integração com um compilador. A IDE é uma espécie de "Word" para código fonte. Mas depois do código fonte salvo, a IDE "chama" ou executa um compilador,
que pode ou não vir junto com ela, mandando que o compilador compile o arquivo de código salvo por ela, gerando assim um programa executável.

Muitas IDE's também acompanham um vasto conjunto de bibliotecas de funções e classes, bem como exemplos e snippets, para facilitar o processo de codificação.

Além disso uma função interessante das IDE's é o help, sensível a contexto, tanto da própria IDE e suas ferramentas, como da linguagem para a qual ela foi desenvolvida.




Uma ide não precisa ser específica para apenas uma linguagem, muito menos para um único compilador. Um exemplo disso é o próprio visual studio, que serve para se
escrever código em C#, C++ ou VB, e também possui integração com compiladores dessas três linguagens. Você pode instalar para o Visual Studio, na forma de plugin, uma nova linguagem
e um novo compilador, como no caso da linguagem Oxygene, evolução do object pascal, e o Delphi Prism.

Outras IDE's assim são o Eclipse e o NetBeans, onde você pode instalar novas linguagens e configurar um ou mais compiladores para cada linguagem. Por exemplo eu configurei meu NetBeans para usar tanto o GCC como o Borland C++ para compilar a linguagem C. Eu posso escolher qual usar.




As vezes, aliás, quase sempre, uma empresa adiciona um novo comando ou sintaxe a uma linguagem, criando assim uma nova vertente ou dialeto dela, para criar um recurso especial ou atender uma necessidade específica num novo compilador que está criando.

Isso é muito normal e não é um problema, visto que grande parte da linguagem continua a mesma. Além disso existem padrões, e se você nivelar por baixo verá que
se um código fonte em uma determinada linguagem for escrito visando a intersecção ou o mínimo dos recursos de todos os seus compiladores então você garante
a portabilidade desse código entre os seus vários compiladores, sistemas, plataformas etc.

Isso eleva exponencialmente o número de plataformas, sistemas, bibliotecas e suas combinações nas quais podemos trabalhar.




Linguagens de programação podem ser um assunto tão infinito quanto literatura, poesia ou matemática, por isso eu escolhi algumas dentre as quais gostaria de trabalhar.




Como linguagem eu escolhi o Pascal e Object Pascal devido não somente à facilidade de aprendizado, mas à facilidade de ensino. É uma linguagem robusta, flexível,
fortemente tipada e nem por isso limitada, muito similar ao Portugol, elegante, onde eu posso fazer minha programação tanto sob o paradigma estruturado como sob o
paradigma orientado a objetos. Muitos professores de universidades consideram, ou pelo menos deveriam considerar, pascal como uma boa opção de linguagem ao se ensinar programação.

Eu não teria a prepotência ou a arrogância de discordar de Niklaus Wirth.




Como IDE para trabalhar com Object Pascal eu escolhi o Delphi e sua contraparte Open-Source Lazarus, pela facilidade de se criar formularios e Interfaces com o usuário ricas,
repletas de controles, eventos e interatividade com os usuários, além da facilidade de acesso a diversos bancos de dados, facilidade de deploy, uma certa medida de portabilidade entre outras questões.

Todo compilador e/ou IDE vem junto com uma biblioteca ou conjunto de bibliotecas de classes e funções, com fontes ou simplesmente pré-compiladas, em uma ou mais linguagens.

Essas bibliotecas, as vezes publicas e com contribuições da comunidade, as vezes privadas, contam com um alto gral de robustez, devido ao amplo número de contribuições e correções a que se submeteram, número de usuários e tempo de uso.

No caso do Delphi não podia ser diferente, com as bibliotecas RTL, VCL (de componentes visuais) e a JCL e JVCL do projeto JEDI, fornecem um leque gigante de ferramentas para desenvolvimento, deploy, design etc...

E o lazarus, com sua LCL não fica devendo em nada nesse quesito.




O Delphi pode não ser mais barato que os concorrentes proprietários similares, mas existem versões gratuitas do Delphi, por exemplo o Turbo Explorer Delphi 2006, que como unica limitação impede que você instale pacotes e componentes de terceiros,
limitação esta que pode ser facilmente contornada instanciando - se os componentes em runtime. Versões mais antigas do Delphi, como o 3 e o 4 també já foram distribuídas gratuitamente, e não deixam a desejar se o assunto for ensino e aprendizado de programação.

Como alternativa ao desenvolvimento profissional, com baixo custo, temos o Lazarus, que é o "Delphi" do Free Pascal, livre de todas as formas como um software arte deve ser.




Outra característica marcante do Delphi é o desenvolvimento multi camadas usando sockets, COM e COM+, DataSnap entre outras tecnologias, e a rapidez em desenvolver um sistema nesses moldes.




Os programadores inexperientes tem a mania de "Malhar" ou "Humilhar" uma determinada linguagem e enaltecer outras, ou idolatrar uma linguagem em detrimento de outras, mas o bom programador, o experiente,
procura pelo menos conhecer o básico e os objetivos ou vantagens de todas elas.

Como eu disse todas as linguagens podem servir para todas as coisas e atender a todas as necessidades dependendo do conhecimento, experiência e criatividade do programador.




Existem por aí muitas dicas de como se tornar um bom programador. Eu dou a minha dica aqui, sobre como se tornar um bom programador:


  • Conhecimento de inglês, desejável inglês fluente

  • Conhecimento de matemática, pelo menos para não passar vergonha

  • Apreço pela leitura, vontade de ler, gosto por ler, desejável leitura dinâmica

  • Deve aprender a PROGRAMAR, e não aprender uma linguagem de programação.





Inglês é óbvio o porquê de aprender e eu não vou entrar no assunto. Leitura dinâmica deveria ser ensinada na escola, na primeira ou segunda série, logo depois de se ensinar o indivíduo a ler. No máximo deveria ser matéria do ensino médio.

Porquê? Simples, por causa da velocidade e sazonalidade com que livros de tecnologia, principalmente programação, são escritos. São escritos em um ano e tornam-se obsoletos no ano seguinte.

A leitura simplesmente intelectualiza o indivíduo, não importa qual é a área.




Acho que todo programador deveria saber muito sobre a linguagem que mais GOSTA, o suficiente sobre uma linguagem interpretada qualquer: (Java, Perl, Python, PHP, Ruby...), o suficiente sobre a linguagem que mais TRABALHA, e o básico de C.

C é uma grande linguagem. É a única linguagem que todos respeitam, ninguem xinga, ninguém malha e ela é respeitada por todos, até pelos que não a utilizam no seu dia a dia ou simplesmente não a conhecem a fundo.




Qualquer programador tem que saber C, não simplesmente porque ela é uma grande linguagem, mas porque foram escritos grandes compiladores para ela.




Batendo novamente na tecla de linguagens compiladas (quando existe um compilador para elas) e linguagens interpretadas (quando existe apenas um interpretador para elas), todos nós sabemos a diferença entre as duas:

As linguagens compiladas geram um programa mais rápido (o compilador gera), enquanto a maioria das linguagens interpretadas geram programas fáceis de se fazer ou dar manutenção, com recursos de reflexão e metaprogramação.

Linguagens compiladas geram executaveis nativos, menores, mais rápidos, embora sejam mais complicadas. Linguagens interpretadas são mais fáceis e flexíveis, tornando-as mais produtivas, embora sejam mais lentas e pesadas.

Linguagens compiladas precisam ser recompiladas em outros sistemas operacionais, se for possível, enquanto que linguagens interpretadas são portáveis direto para outros sistemas operacionais contanto que tenham o runtime, máquina virtual, interpretador ou conjunto
de frameworks correto e adequado ao programa, e VOCÊ tenha paciência de levar tudo isso pra cá e pra lá.

Todas as linguagens servem para fazer programas, porém,
linguagens compiladas fazem drivers de dispositivos e programas em modo kernel enquanto linguagens interpretadas tem uma certa facilidade para se fazer scripts e páginas da web.

O Delphi é compilado, ou melhor, uma ferramenta para se compilar object pascal, embora o compilador não tenha todos os recursos de um compilador C. Eu nunca vi um programa em modo kernel feito em Delphi... EU nunca vi, você pode ter visto.

Mesmo assim o Delphi possui todas as facilidades e flexibilidades de uma linguagem Interpretada, OO, dinâmica como Java ou Ruby. Além de ser produtiva e gerar executáveis rápidos.




Não, tudo isso acima é besteira e ao mesmo tempo não é, COMO EU JÁ DISSE: Não adianta bater na tecla de linguagens interpretadas Vs. Linguagens compiladas porque, como eu já disse novamente, todos já sabemos a diferença.




Java? Eu curto, acho legal, respeito os fanáticos (sim linguagem de programação, para alguns, é como religião, existem fanáticos), mas eu não curto a JVM em si. Não acho legal ser obrigado a ter 1GB de ram pra rodar um hello world com
todos os recursos da JVM que eu não vou usar. Não acho legal precisar de uma supermáquina pra rodar o TD-REDF, validador e transmissor de nota fiscal paulista do governo, que é capaz de transformar em uma carroça o mesmo computador que roda O SEU SISTEMA COM RAPIDEZ E LEVEZA.

A medida que eu for precisando de Java no meu trabalho eu vou usando, porque não, afinal ele está no topo da literatura, no apogeu do uso, no ápice das contribuições da comunidade, literalmente bombando.

Daqui pra frente o que vier pode ser decadência....




Existem, claro, outras implementações da JVM, para outras plataformas, assim como existem para .Net etc... Acredito ainda que parte do peso e performance de aplicativos feitos em Java se devam a problemas de design e projeto por parte de seus idealizadores, e não culpa da JVM em si.




Nem sempre, ou quase nunca, o problema é da linguagem, compilador, interpretador, vm, computador....




Tem programador que faz caca em Delphi e culpa o Delphi, faz caca em Java e culpa o Java, faz caca em Assembly e culpa o Assembly, simplesmente faz caca e não assume.

Assim como um BOM PROGRAMADOR programa bem em qualquer linguagem, um PROGRAMADOR MEDÍOCRE FAZ MEDIOCRIDADE EM QUALQUER LINGUAGEM.




Programadores medíocres são aqueles que sabem uma linguagem apenas, mas não sabem programar de verdade.

Eles vivem se perguntando: "o que será do futuro?", "O que será do mercado?" , "A linguagem x está falindo?" , "Compensa aprender y?", "o que vai ser do meu emprego/carreira se a linguagem z morrer?", "A empresa a comprou a b, que vai ser de mim?", "a linguagem K está morrendo, morrerei junto?" ....





Eu digo aqui, com todas as letras, o que será do futuro e do mercado:

DANE-SE O FUTURO E O MERCADO!

Eu faço meu próprio futuro, eu faço meu próprio mercado.




Eu gosto de Delphi, gosto de C#, C e outras linguagens. Vou continuar a usar todas as que eu gostar, tanto pessoalmente como profissionalmente de acordo com minhas necessidades ou vontades.

É assim que funciona.

Nenhuma linguagem desaparece, elas evoluem como a ortografia do nosso bom e velho português.

Sim, fábricas de compiladores podem, um dia, desaparecer, assim como poetas e romancistas morrem, mas não levam a linguagem junto para o túmulo.

E os bons de verdade, meu amigo, são e serão sempre IMORTAIS...



sexta-feira, 4 de setembro de 2009

O dilema do envio de e-mail


Hoje em dia um sistema enviar um e-mail automático é não só comum como uma necessidade. Sistemas enviam e-mails automáticos para usuarios que se cadastram num sistema, enviam login e senha para quem esqueceu, enviam as ofertas da semana e uma infinidade de eventos que acontecem em sistemas online.
Mas não são apenas os sistemas web como e-commerce ou sites de rede social, mas ERP's, CRM, SCM e HRM também enviam e-mails. Pipelines de produção avisam gerentes quando uma variável atingiu um valor crítico ou exige atenção. Por exemplo, quando um determinado produto ou insumo no estoque atinge um determinado nivel, o responsável recebe um e-mail, e , as vezes, o fornecedor também recebe um e-mail com a proposta de compra.
Programas de monitoria de rede, de segurança etc enviam e-amils.
Enfim, as aplicações precisam enviar e-mails para os mais diversos fins. Cada linguagem tem a sua maneira e a sua peculiaridade. Mas o que é necessário para enviar um e-mail?
Pasmem, embora o spam seja uma prática muito feia, quem faz afirma que surte efeitos. Eu mesmo já conheci e comprei várias coisas legais através de spam. Mas foi pouca coisa. O resto eu configurei pra ir pro lixo mesmo. Aliás, o melhor anti-spam que eu conheço é o do gmail. Parabéns para o pessoal da Google.
O mínimo que você precisará é de um servidor de SMTP anônimo, no qual você não precise se autenticar para mandar um e-mail. Esses servidores aceitam que você envie e-mails apenas do host onde está o próprio servidor, ou de algum outro host do mesmo domínio. O IIS já vem com um servidor de smtp. A configuração do servidor de SMTP, bem como as configurações de relay fogem ao escopo desse artigo.
Vamos abordar aqui como mandar um e-mail através de um SMTP anônimo usando o .Net framework 1.1. Depois falaremos sobre como mandar e-mails através de servidores de SMTP autenticado e por último falaremos desses dois assuntos no .Net framework 2.0 ou superior.
Primeiro de tudo, seja em C# ou seja em VB.Net você vai precisar colocar isso no seu using:
using System.Web.Mail;
Depois digite o código da Listagem 1, abaixo, no evento que for disparar um e-mail, por exemplo o evento onclick de um botão, na página de fale conosco.
Listagem 1:

MailMessage message = new MailMessage();
try
{
 //crio o objeto MailMessage, que contem o conjunto de parametros de uma mensagem de e-mail

 //aqui eu configuro os parâmetros da mensagem em si
 message.From = "[[nome]]@[[domínio]]"; //e-mail do remetente, deve vir do web.config (mas pode ser  fixo se for uma unica pagina de fale conosco e você não tiver acesso ao web.config)
 message.To = "vitorrubio@gmail.com"; //e-mail do destinatário, deve vir de um textbox
 message.Subject = "teste 1"; //assunto, deve vir de um textbox, ou do web.config
 message.Body = "Isto é uma mensagem de teste."; //corpo da mensagem, deve vir de um textbox

 //aqui eu configuro os parametros do servidor de SMTP SEM AUTENTICAÇÃO
 SmtpMail.SmtpServer = "[[servidor]]"; //servidor de smtp, deve vir do web.config (mas pode ser  fixo se for uma unica pagina de fale conosco e você não tiver acesso ao web.config)
  
 SmtpMail.Send(message);

 Label1.Text = "e-mail enviado com sucesso!";
}
catch (Exception ex)
{
 Label1.Text = "Erro ao enviar e-mail " + ex.Message;

 //concatena todas as inner exceptions:

 //loop para concatenar todas as exceptions ao longo do caminho, porque a exception mais externa não é muito conclusiva
 while (ex.InnerException != null)
 {
  ex = ex.InnerException;
  Label1.Text += " --- Inner Exception --- " + ex.ToString();
 }
}
Repare bem que no catch eu coloco a mensagem de erro e o exception mais externo no label, mas eu crio um laço while para concatenar as mensagens de todos os exceptions mais internos. Faço o loop enquanto a minha exception corrente EX tiver um inner exception diferente de null. Essa é minha condição de parada. Depois eu substituo o proprio EX pelo inner exception dele mesmo, para que eu não entre num loop infinito.
Com todas essas excessões mostradas a mim eu posso saber o motivo exato de o e-mail não ter sido enviado. É necessário um inglês mínimo.
Agora se você estiver tentando mandar e-mail através de um servidor autenticado, como Terra ou Yahoo, assim você não vai conseguir. Terá de usar alguns artifícios e preencher alguns campos especiais que a Microsoft preparou no objeto message. Você confere isso na listagem 2.
Listagem 1:

MailMessage message = new MailMessage();
try
{
 //crio o objeto MailMessage, que contem o conjunto de parametros de uma mensagem de e-mail

 //aqui eu configuro os parâmetros da mensagem em si
 message.From = "[remetente]"; //e-mail do remetente, deve vir do web.config
 message.To = "vitor@rt.com.br"; //e-mail do destinatário, deve vir de um textbox
 message.Subject = "teste 1"; //assunto, deve vir de um textbox, ou do web.config
 message.Body = "Isto é uma mensagem de teste."; //corpo da mensagem, deve vir de um textbox

 //aqui eu configuro os parametros do servidor de SMTP. A autenticação você pode ver logo abaixo
 SmtpMail.SmtpServer = "[servidor de smtp]"; //servidor de smtp, deve vir do web.config


 /*
  * Mas, se você precisar de mandar um e-mail num servidor smtp com autenticação....
  * num servidor que não é seu.... aí você vai precisar dessa gambiarra da microsoft
 */


 //se você precisar enviar e-mail através de um servidor com autenticação, por exemplo terra ou yahoo, utilize esses parametros
 message.Fields["http://schemas.microsoft.com/cdo/configuration/smtsperver"] = "[servidor de smtp]"; //server
 message.Fields["http://schemas.microsoft.com/cdo/configuration/smtpserverport"] = 25;//porta, geralmente é a 25 quando não usa ssl
 message.Fields["http://schemas.microsoft.com/cdo/configuration/sendusing"] = 2;
 message.Fields["http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"] = 1; //marca se tem que autenticar
 message.Fields["http://schemas.microsoft.com/cdo/configuration/sendusername"] = "[seu login]"; //user
 message.Fields["http://schemas.microsoft.com/cdo/configuration/sendpassword"] = "[sua senha]"; //senha


 SmtpMail.Send(message);

 Label1.Text = "e-mail enviado com sucesso!";
}
catch (Exception ex)
{
 Label1.Text = "Erro ao enviar e-mail " + ex.Message;

 //concatena todas as inner exceptions:

 while (ex.InnerException != null)
 {
  ex = ex.InnerException;
  Label1.Text += " --- Inner Exception --- " + ex.ToString();
 }
} 
 


Observe aqui que
preenchemos alguns campos especiais do objeto Message. Você pode, inclusive, colocar todo o código numa única página .aspx sem precisar de um codebehind. Você não precisa nem de visual studio ou #develop para fazer essa página, qualquer bloco de notas resolve. Veja como fica no proximo snippet:



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >

<html>
<head>
 <title>MandaEmailDireto</title>
 <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
 <meta name="CODE_LANGUAGE" Content="C#">
 <meta name=vs_defaultClientScript content="JavaScript">
 <meta name=vs_targetSchema content="http://schemas.microsoft.com/intellisense/ie5">
</head>
<body >

 <form id="Form1" method="post" runat="server">
<P>
 <asp:Label id=Label1 runat="server">Label</asp:Label></P>
<P>

<asp:Button style="Z-INDEX: 0" id=Button1 runat="server" Text="Button"></asp:Button></P>
 <script language=C# runat=server>

public void Page_Load(object sender, System.EventArgs e)
{
Response.Write("Página Carregada!<br>");
}

override protected void OnInit(EventArgs e)
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
base.OnInit(e);
}

public void Button1_Click(object sender, System.EventArgs e)
{

System.Web.Mail.MailMessage message = new System.Web.Mail.MailMessage();
try
{
 //crio o objeto MailMessage, que contem o conjunto de parametros de uma mensagem de e-mail

 //aqui eu configuro os parâmetros da mensagem em si
 message.From = "[remetente]"; //e-mail do remetente, deve vir do web.config
 message.To = "[destinatario]"; //e-mail do destinatário, deve vir de um textbox
 message.Subject = "teste 1"; //assunto, deve vir de um textbox, ou do web.config
 message.Body = "Isto é uma mensagem de teste."; //corpo da mensagem, deve vir de um textbox

 //aqui eu configuro os parametros do servidor de SMTP SEM AUTENTICAÇÃO
 System.Web.Mail.SmtpMail.SmtpServer = "[servidor]"; //servidor de smtp, deve vir do web.config


 /*
  * Mas, se você precisar de mandar um e-mail num servidor smtp com autenticação....
  * num servidor que não é seu.... aí você vai precisar dessa gambiarra da microsoft
 */


 //se você precisar enviar e-mail através de um servidor com autenticação, por exemplo terra ou yahoo, utilize esses parametros
 message.Fields["http://schemas.microsoft.com/cdo/configuration/smtsperver"] = "[servidor]"; //server
 message.Fields["http://schemas.microsoft.com/cdo/configuration/smtpserverport"] = 25;//porta, geralmente é a 25 quando não usa ssl
 message.Fields["http://schemas.microsoft.com/cdo/configuration/sendusing"] = 2;
 message.Fields["http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"] = 1; //marca se tem que autenticar
 message.Fields["http://schemas.microsoft.com/cdo/configuration/sendusername"] = "[login]"; //user
 message.Fields["http://schemas.microsoft.com/cdo/configuration/sendpassword"] = "[senha]"; //senha


 System.Web.Mail.SmtpMail.Send(message);

 Label1.Text = "e-mail enviado com sucesso!";
}
catch (Exception ex)
{
 Label1.Text = "Erro ao enviar e-mail " + ex.Message;

 //concatena todas as inner exceptions:

 while (ex.InnerException != null)
 {
  ex = ex.InnerException;
  Label1.Text += " --- Inner Exception --- " + ex.ToString();
 }
}
} 
 </script>


  </form>

</body>
</html>
Atente que para esses casos de servidores de SMTP autenticados, e até mesmo para alguns casos de servidores de SMTP anônimos do seu próprio domínio, o servidor pode exigir que o domínio do remetente seja o mesmo domínio dele. Ou seja, para mandar um e-mail pelo SMTP do yahoo, o remetente precisa ser do yahoo (não que o yahoo seja assim, isso é só um exemplo).
Não precisamos preencher todos esses dados especiais na mensagem no .Net 2.0.
O que precisamos é instanciar um objeto SMTPClient e preencher corretamente os valores das propriedades.
Vamos ver como fazer no próximo snippet:
  protected void Button1_Click(object sender, EventArgs e)
{
SmtpClient smtpCliente = new SmtpClient();
MailMessage message = new MailMessage();
try
{
 //duas variáveis MailAddress para o remetente e destinatário
 MailAddress fromAdress = new MailAddress("***remetente***", "nome do remetente"); //remetente
 MailAddress toAdress = new MailAddress("***destinatario 1 ****", "nome"); //destinatario 1
 MailAddress toAdress2 = new MailAddress("**destinatario 2 ***", "nome"); //destinatario 2

 message.From = fromAdress;
 message.To.Add(toAdress); //adiciona o destinatario 1
 message.To.Add(toAdress2); //adiciona o destinatario 2
 message.Subject = "Teste";
 message.Body = "mensagem de teste.";

 //configuração do smtp
 smtpCliente.Host = "***servidor***";

 ////credenciais, ou seja, login e senha. Essa parte não precisa se o servidor web for o proprio servidor de e-mail anonimo, ou se o servidor de e-mail anonimo permitir relay a partir do ip que você estiver tentando mandar.
 smtpCliente.Credentials = new NetworkCredential("***login***", "***senha***");

 smtpCliente.Send(message);
 Label1.Text = "e-mail enviado com sucesso!";
}
catch (Exception ex)
{
 Label1.Text = "Erro ao enviar e-mail " + ex.Message;

 //concatena todas as inner exceptions:

 while (ex.InnerException != null)
 {
  ex = ex.InnerException;
  Label1.Text += " --- Inner Exception --- " + ex.ToString();
 }
}
}
Analogamente podemos fazer o envio de e-mail com o código C# direto na página asp.net, conforme o snippet abaixo:

<%@ Import Namespace="System.Net.Mail" %>
<%@ Import Namespace="System.Net" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
 <title>Untitled Page</title>
</head>
<body>
 <form id="form1" runat="server">
 <div>

     <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
     <br />
     <br />
     <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
  
     <script language="C#" runat="server">
  
         protected void Page_Load(object sender, EventArgs e)
         {
             Response.Write("Página Carregada!");
         }
         protected void Button1_Click(object sender, EventArgs e)
         {
             SmtpClient smtpCliente = new SmtpClient();
             MailMessage message = new MailMessage();
             try
             {
                 //duas variáveis MailAddress para o remetente e destinatário
                 MailAddress fromAdress = new MailAddress("email do remetente", "nome do remetente"); //remetente
                 MailAddress toAdress = new MailAddress("destinatario 1", "nome"); //destinatario 1
                 MailAddress toAdress2 = new MailAddress("destinatario 2", "nome"); //destinatario 2

                 message.From = fromAdress;
                 message.To.Add(toAdress); //adiciona o destinatario 1
                 message.To.Add(toAdress2); //adiciona o destinatario 2
                 message.Subject = "Teste";
                 message.Body = "mensagem de teste.";

                 //configuração do smtp
                 smtpCliente.Host = "servidor";
              
                 //credenciais, ou seja, login e senha. Essa parte não precisa se o servidor web for o proprio servidor de e-mail anonimo, ou se o servidor de e-mail anonimo permitir relay a partir do ip que você estiver tentando mandar.
                 smtpCliente.Credentials = new NetworkCredential("login", "senha");

                 smtpCliente.Send(message);
                 Label1.Text = "e-mail enviado com sucesso!";
             }
             catch (Exception ex)
             {
                 Label1.Text = "Erro ao enviar e-mail:<br/> " + ex.Message;

                 //concatena todas as inner exceptions:

                 while (ex.InnerException != null)
                 {
                     ex = ex.InnerException;
                     Label1.Text += " --- Inner Exception --- " + ex.ToString();
                 }
             }
         }
     </script>

 </div>
 </form>
</body>
</html>
Onde quero chegar com tudo isso? Seguinte, para os web designers, que muitas vezes não são programadores e sabem apenas o básico, pode ser um desafio mandar um e-mail
pelo smtp do servidor, seja para um formulario de contato, fale conosco ou até mesmo cadastro. Por isso resolvi criar essa página como uma espécie de template
para que possa ser usada por webdesigners.
Abaixo você pode conferir todo o código desse template de envio de e-mail, com diversos camposde informações gerais, através de um script C# em uma página asp.net, com runat=server

<%@ Import Namespace="System.Net.Mail" %>
<%@ Import Namespace="System.Net" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
 <title>Fale Conosco</title>
</head>
<body>
 <form id="form1" runat="server">
 <div>

     <asp:Label ID="lbMensagem" runat="server" ForeColor="#FF3300"></asp:Label>
     <br />
     <br />
     <asp:Label ID="Label2" runat="server" Text="Nome"></asp:Label>
     <br />
     <asp:TextBox ID="txtNome" runat="server"></asp:TextBox>
     <br />
     <asp:Label ID="Label3" runat="server" Text="E-Mail"></asp:Label>
     <br />
     <asp:TextBox ID="txtEmail" runat="server"></asp:TextBox>
     <br />
     <asp:Label ID="Label4" runat="server" Text="Assunto"></asp:Label>
     <br />
     <asp:TextBox ID="txtAssunto" runat="server"></asp:TextBox>
     <br />
     <br />
     <asp:CheckBox ID="cbFumante" runat="server" Text="Fumante" />
     <br />
     <asp:CheckBox ID="cbConducao" runat="server" Text="Condução própria" />
     <br />
     <asp:CheckBox ID="cbSolteiro" runat="server" Text="Solteiro" />
     <br />
     <asp:RadioButtonList ID="rgSexo" runat="server">
         <asp:ListItem Selected="True">Masculino</asp:ListItem>
         <asp:ListItem>Feminino</asp:ListItem>
     </asp:RadioButtonList>
     <br />
     <br />
     <br />
     <asp:Label ID="Label5" runat="server" Text="Corpo da Mensagem"></asp:Label>
     <br />
     <asp:TextBox ID="txtCorpo" runat="server" Height="138px" TextMode="MultiLine"
         Width="299px"></asp:TextBox>
     <br />
     <br />
     <asp:Button ID="btEnviar" runat="server" onclick="btEnviar_Click"
         Text="Enviar" />
  
     <script language="C#" runat="server">
  
         protected void Page_Load(object sender, EventArgs e)
         {
             //isso serve simplesmente para saber se o asp.net está funcionando e a página foi carregada corretamente. Depois de testado pode ser omitido.
             Response.Write("Página Carregada!");
         }
         protected void btEnviar_Click(object sender, EventArgs e)
         {
             SmtpClient smtpCliente = new SmtpClient();
             MailMessage message = new MailMessage();
             try
             {
                 //duas variáveis MailAddress para o remetente e destinatário
                 MailAddress fromAdress = new MailAddress(txtEmail.Text, txtNome.Text); //remetente (campos textbox do cliente)
                 MailAddress toAdress = new MailAddress("vitorrubio@gmail.com", "Vitor Rubio"); //destinatario  (quem recebe na empresa)

                 message.From = fromAdress;
                 message.To.Add(toAdress); //adiciona o destinatario
                 message.Subject = txtAssunto.Text;
              
                 //vamos compor o corpo com todas as informações dadas pelo usuário
                 //criamos uma string chamada corpao: (pode ser um stringbuilder, mas precisa de um import de system.text)
              
                 string corpao = "";
              
                 //vamos concatenando (grudando) todas as informações
                 //o operador += concatena as strings. corpao += "laranja" é o mesmo que dizer "corpao recebe o que já estava escrito lá grudado com "laranja"
                 //"\r\n pula uma linha, como se tivesse dado um enter ou escrito um <br> no html
              
                 corpao += "Nome: " + txtNome.Text + "\r\n";
                 corpao += "E-Mail: " + txtEmail.Text + "\r\n";
                 corpao += "Assunto: " + txtAssunto.Text + "\r\n";
              
                 //pulamos mais uma linha
                 corpao += "\r\n";
              
                 //começamos a colocar as outras informações, sobre sexo etc. Essas informações não são strings (palavras ou cadeias de caracteres)
                 //mas são booleanas (lógica), com excessão de sexo que dá para pegar o valor selecionado e transformar em string
                 //entenda string como uma cadeia, ou sequencia, de caracteres, como palavras e frases.
              
                 //aqui concatenamos a palavra "Fumante: " e usamos o operador ternário para perguntar: A caixinha está clicada? Se sim então grude a palavra "sim", se não "não"
                 corpao += "Fumante: " + ((cbFumante.Checked)?"Sim":"Não") + "\r\n";
                 corpao += "Conducao Própria: " + ((cbConducao.Checked)?"Sim":"Não") + "\r\n";
                 corpao += "Solteiro: " + ((cbSolteiro.Checked)?"Sim":"Não") + "\r\n";
              
                 //agora o sexo, que não é nem checkbox nem textbox, mas é um radiogroup
                 corpao += "Sexo: " + rgSexo.SelectedValue.ToString() + "\r\n";
              
                 //pula duas linhas e poe a mensagem:
                 corpao +=  "\r\n\r\n";
                 corpao += txtCorpo.Text + "\r\n";
              
                 //e o body da mensagem é o corpão:
                 message.Body = corpao;
              
                 //facinho facinho!

                 //configuração do smtp
                 smtpCliente.Host = "localhost"; //use  o host fornecido pelo serviço de hospedagem, se precisar armazene no web.config
              
                 //credenciais, ou seja, login e senha. Essa parte não precisa se o servidor web for o proprio servidor de e-mail anonimo, ou se o servidor de e-mail anonimo permitir relay a partir do ip que você estiver tentando mandar.
                 //nesse caso, se usarmos o serviço de SMTP do proprio serviço de hosting/hospedagem/colocation provavelmente será um SMTP anônimo. Consulte seu fornecedor de serviços para tirar as dúvidas.
                 //smtpCliente.Credentials = new NetworkCredential("login", "senha");

                 smtpCliente.Send(message);
              
                 //colocamos, através do dream weaver, expression ou visual studio um label e demos o nome de lbMensagem
                 //usaremos a propriedade text do lbMensagem para avisar o usuario do sucesso ou fracasso do envio do e-mail
              
                 lbMensagem.Text = "e-mail enviado com sucesso!";
             }
             catch (Exception ex)
             {
                 //se der erro, veremos onde
                 lbMensagem.Text = "Erro ao enviar e-mail:<br/> " + ex.Message;

                 //concatena todas as inner exceptions:

                 while (ex.InnerException != null)
                 {
                     ex = ex.InnerException;
                     lbMensagem.Text += " --- Inner Exception --- " + ex.ToString();
                 }
             }
         }
     </script>

 </div>
 </form>
</body>
</html>

Aqui neste arquivo zipado temos vários exemplos do envio de e-mail através do C#
Os exemplos EnviaEmail_1.1 e EnviaEmailDireto_1.1 mostram como enviar e-mail através do .net framework 1.1 com e sem code behind. Ou seja, o "Direto" aqui significa que o código C# está direto na página, para ser compilado e executado em runtime, no server.
Os exemplos EnviaEmail_2.0 e EnviaEmailDireto_2.0 são análogos, mas para .net framework 2.0 ou superior.
Como dito anteriormente, para mandar e-mails a partir do próprio servidor de smtp ele deve estar configurado corretamente, com relay e tudo o mais, e o
destinatário tem que aceitar emails provindos do seu IP. Este Site pode te ajudar a configurar o SMTP.
Esses livros são apenas 3 de milhares que podem te ajudar a iniciar uma carreira de programador C# / Asp.net

http://www.livrariasaraiva.com.br/produto/produto.dll/detalhe?pro_id=130808&ID=C95552527D909041024070050

https://www.verticebooks.com.br/index.php?sub=produto&id=16172

http://www.livrariasaraiva.com.br/produto/produto.dll/detalhe?pro_id=944045&ID=C95552527D909041024070050
Espero que tenha sido util a todos.

have fun ;)



Postagens populares

Marcadores

delphi (60) C# (31) poo (21) Lazarus (19) Site aos Pedaços (15) sql (13) Reflexões (10) .Net (9) Humor (9) javascript (9) ASp.Net (8) api (8) Básico (6) Programação (6) ms sql server (5) Web (4) banco de dados (4) HTML (3) PHP (3) Python (3) design patterns (3) jQuery (3) livros (3) metaprogramação (3) Ajax (2) Debug (2) Dicas Básicas Windows (2) Pascal (2) games (2) linguagem (2) música (2) singleton (2) tecnologia (2) Anime (1) Api do Windows (1) Assembly (1) Eventos (1) Experts (1) GNU (1) Inglês (1) JSON (1) SO (1) datas (1) developers (1) dicas (1) easter egg (1) firebird (1) interfaces (1) introspecção (1) memo (1) oracle (1) reflexão (1)