Caros, segue abaixo código para criação de toolpart.
No arquivo .cs da webpart:
namespace test.VisualWebPart1
{
[ToolboxItemAttribute(false)]
public class VisualWebPart1 : WebPart
{
#region Properties
[WebBrowsable(true),
Personalizable(PersonalizationScope.Shared),
WebDisplayName("Título"),
Category("teste")]
public string title { get; set; }
[WebBrowsable(true),
Personalizable(PersonalizationScope.Shared),
WebDisplayName("Texto"),
Category("teste")]
public string text { get; set; }
#endregion
// Visual Studio might automatically update this path when you change the Visual Web Part project item.
private const string _ascxPath = @"~/_CONTROLTEMPLATES/destaque/VisualWebPart1/VisualWebPart1UserControl.ascx";
protected override void CreateChildControls()
{
VisualWebPart1UserControl control = Page.LoadControl(_ascxPath) as VisualWebPart1UserControl;
control.text = text;//tem que criar o objeto no .cs do ascx como public
control.title = title;//tem que criar o objeto no .cs do ascx como public
Controls.Add(control);
}
}
}
Mostrando postagens com marcador Códigos C#. Mostrar todas as postagens
Mostrando postagens com marcador Códigos C#. Mostrar todas as postagens
segunda-feira, 19 de novembro de 2012
Criando itens de toolpart
quinta-feira, 5 de julho de 2012
Leitor de RSS
Segue abaixo um exemplo de leitor de RSS, onde é possível selecionar a fonte do XML e a quantidade de notícias (nodes) a serem exibidos.
<script runat="server">
public void ProcessRSSItem(string rssURL)
{
System.Net.WebRequest myRequest = System.Net.WebRequest.Create(rssURL);
System.Net.WebResponse myResponse = myRequest.GetResponse();
System.IO.Stream rssStream = myResponse.GetResponseStream();
System.Xml.XmlDocument rssDoc = new System.Xml.XmlDocument();
rssDoc.Load(rssStream);
System.Xml.XmlNodeList rssItems = rssDoc.SelectNodes("rss/channel/item");
string title = "";
string link = "";
string description = "";
for (int i = 0; i < rssItems.Count; i++)
{
System.Xml.XmlNode rssDetail;
rssDetail = rssItems.Item(i).SelectSingleNode("title");
if (rssDetail != null)
{
title = rssDetail.InnerText;
}else
{
title = "";
}
rssDetail = rssItems.Item(i).SelectSingleNode("link");
if (rssDetail != null)
{
link = rssDetail.InnerText;
}
else
{
link = "";
}
rssDetail = rssItems.Item(i).SelectSingleNode("description");
if (rssDetail != null)
{
description = rssDetail.InnerText;
}
else
{
description = "";
}
if (i < 7)
{
Response.Write("<p><b><a href='" + link + "' target='new'>" + title + "</a></b><br/>");
}
}
}
</script>
<div class="rss">
<%
string rssURL = "http://online.wsj.com/xml/rss/3_7011.xml";
Response.Write("<font size=5><b><img src='http://apolo-homologa:4017/galleries/bt_rss.png'/>" + " WSJ" + "</b></font><Br />");
ProcessRSSItem(rssURL);
%>
</div>
<script runat="server">
public void ProcessRSSItem(string rssURL)
{
System.Net.WebRequest myRequest = System.Net.WebRequest.Create(rssURL);
System.Net.WebResponse myResponse = myRequest.GetResponse();
System.IO.Stream rssStream = myResponse.GetResponseStream();
System.Xml.XmlDocument rssDoc = new System.Xml.XmlDocument();
rssDoc.Load(rssStream);
System.Xml.XmlNodeList rssItems = rssDoc.SelectNodes("rss/channel/item");
string title = "";
string link = "";
string description = "";
for (int i = 0; i < rssItems.Count; i++)
{
System.Xml.XmlNode rssDetail;
rssDetail = rssItems.Item(i).SelectSingleNode("title");
if (rssDetail != null)
{
title = rssDetail.InnerText;
}else
{
title = "";
}
rssDetail = rssItems.Item(i).SelectSingleNode("link");
if (rssDetail != null)
{
link = rssDetail.InnerText;
}
else
{
link = "";
}
rssDetail = rssItems.Item(i).SelectSingleNode("description");
if (rssDetail != null)
{
description = rssDetail.InnerText;
}
else
{
description = "";
}
if (i < 7)
{
Response.Write("<p><b><a href='" + link + "' target='new'>" + title + "</a></b><br/>");
}
}
}
</script>
<div class="rss">
<%
string rssURL = "http://online.wsj.com/xml/rss/3_7011.xml";
Response.Write("<font size=5><b><img src='http://apolo-homologa:4017/galleries/bt_rss.png'/>" + " WSJ" + "</b></font><Br />");
ProcessRSSItem(rssURL);
%>
</div>
quarta-feira, 30 de maio de 2012
Removendo duplicidade no calendário Outlook
using System;
using System.Collections;
using System.Diagnostics;
using Microsoft.Office.Interop.Outlook;
namespace RemoveOutlookCalendarDuplicates
{
class MainClass
{
[STAThread]
static void Main(string[] args)
{
Application olApp = new ApplicationClass();
NameSpace outlookNS =
olApp.GetNamespace("MAPI");
MAPIFolder calendarFolder =
outlookNS.GetDefaultFolder(
OlDefaultFolders.olFolderCalendar);
while(true)
{
bool somethingDeleted = false;
Hashtable uniqueItems = new Hashtable();
foreach(AppointmentItem oi in calendarFolder.Items)
{
string uniqueKey =
String.Format("{0} {1} {2:yyyyMMddhhmmss} {3:yyyyMMddhhmmss}",
oi.Subject, oi.Location, oi.Start, oi.End);
if(uniqueItems.ContainsKey(uniqueKey))
{
Console.WriteLine("DELETED: " + uniqueKey);
oi.Delete();
somethingDeleted = true;
}
else
{
uniqueItems.Add(uniqueKey, String.Empty);
}
}
if(!somethingDeleted) break;
}
Console.WriteLine("** PRESS RETURN **");
Console.ReadLine();
}
}
}
using System.Collections;
using System.Diagnostics;
using Microsoft.Office.Interop.Outlook;
namespace RemoveOutlookCalendarDuplicates
{
class MainClass
{
[STAThread]
static void Main(string[] args)
{
Application olApp = new ApplicationClass();
NameSpace outlookNS =
olApp.GetNamespace("MAPI");
MAPIFolder calendarFolder =
outlookNS.GetDefaultFolder(
OlDefaultFolders.olFolderCalendar);
while(true)
{
bool somethingDeleted = false;
Hashtable uniqueItems = new Hashtable();
foreach(AppointmentItem oi in calendarFolder.Items)
{
string uniqueKey =
String.Format("{0} {1} {2:yyyyMMddhhmmss} {3:yyyyMMddhhmmss}",
oi.Subject, oi.Location, oi.Start, oi.End);
if(uniqueItems.ContainsKey(uniqueKey))
{
Console.WriteLine("DELETED: " + uniqueKey);
oi.Delete();
somethingDeleted = true;
}
else
{
uniqueItems.Add(uniqueKey, String.Empty);
}
}
if(!somethingDeleted) break;
}
Console.WriteLine("** PRESS RETURN **");
Console.ReadLine();
}
}
}
quarta-feira, 11 de abril de 2012
Upload simples (ASP.NET)
Segue abaixo o código a ser colocado no aspx:
A seguir o código a ser colocado no cs (code behind):
using System;using System.Collections;using System.Collections.Specialized;
using System.Configuration;using System.Text;
using System.Text.RegularExpressions;using System.Web;
using System.Web.Caching;using System.Web.SessionState;
using System.Web.Security;using System.Web.Profile;
using System.Web.UI;using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
partial class _Default : System.Web.UI.Page{ override protected void OnInit(EventArgs e)
{
base.OnInit(e);buttonUpload.Click += buttonUpload_Click;buttonMultiUpload.Click += buttonMultiUpload_Click;
}
override protected void OnLoad(System.EventArgs e){ base.OnLoad(e);if (! IsPostBack)
{
UploadedFiles.DataBind();
}
}
protected string[] GetUploadList(){ string folder = Server.MapPath("~/Uploads");string[] files = Directory.GetFiles(folder);
string[] fileNames = new string[files.Length];Array.Sort(files);
for (int i = 0; i < files.Length; i++)
{
fileNames[i] = Path.GetFileName(files[i]);
}
return fileNames;
}
protected void UploadThisFile(FileUpload upload)
{
if (upload.HasFile)
{
string theFileName = Path.Combine(Server.MapPath("~/Uploads"), upload.FileName);
if (File.Exists(theFileName))
{
File.Delete(theFileName);
}
upload.SaveAs(theFileName);
}
}
protected void buttonUpload_Click(object sender, System.EventArgs e)
{
UploadThisFile(FileUpload1);
UploadedFiles.DataBind();
}
protected void buttonMultiUpload_Click(object sender, System.EventArgs e)
{
UploadThisFile(multiUpload1);
UploadThisFile(multiUpload2);
UploadThisFile(multiUpload3);
UploadedFiles.DataBind();
}
}
A seguir o código a ser colocado no cs (code behind):
using System;using System.Collections;using System.Collections.Specialized;
using System.Configuration;using System.Text;
using System.Text.RegularExpressions;using System.Web;
using System.Web.Caching;using System.Web.SessionState;
using System.Web.Security;using System.Web.Profile;
using System.Web.UI;using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
partial class _Default : System.Web.UI.Page{ override protected void OnInit(EventArgs e)
{
base.OnInit(e);buttonUpload.Click += buttonUpload_Click;buttonMultiUpload.Click += buttonMultiUpload_Click;
}
override protected void OnLoad(System.EventArgs e){ base.OnLoad(e);if (! IsPostBack)
{
UploadedFiles.DataBind();
}
}
protected string[] GetUploadList(){ string folder = Server.MapPath("~/Uploads");string[] files = Directory.GetFiles(folder);
string[] fileNames = new string[files.Length];Array.Sort(files);
for (int i = 0; i < files.Length; i++)
{
fileNames[i] = Path.GetFileName(files[i]);
}
return fileNames;
}
protected void UploadThisFile(FileUpload upload)
{
if (upload.HasFile)
{
string theFileName = Path.Combine(Server.MapPath("~/Uploads"), upload.FileName);
if (File.Exists(theFileName))
{
File.Delete(theFileName);
}
upload.SaveAs(theFileName);
}
}
protected void buttonUpload_Click(object sender, System.EventArgs e)
{
UploadThisFile(FileUpload1);
UploadedFiles.DataBind();
}
protected void buttonMultiUpload_Click(object sender, System.EventArgs e)
{
UploadThisFile(multiUpload1);
UploadThisFile(multiUpload2);
UploadThisFile(multiUpload3);
UploadedFiles.DataBind();
}
}
sábado, 6 de agosto de 2011
Teclas de atalho em WinForms (C#)
Para criação de teclas de atalho customizadas via código, devemos primeiramente habilitar o KeyPreview do Form, através das propriedades do Form, ou através de código no evento Load do mesmo:
form1.KeyPreview = true;
Feito isso, você poderá utilizar os três eventos abaixo para colocar o seu código:
eventos: KeyUp, KeyUp e KeyDown
Utilizarei para exemplo o evento KeyUp:
if (e.KeyCode == Keys.Enter)//evento disparado ao soltar a tecla enter
{
//aqui vai seu código do atalho
}
Todas as teclas podem ser utilizadas, incluindo mais de uma (Ctrl+A, por exemplo).
form1.KeyPreview = true;
Feito isso, você poderá utilizar os três eventos abaixo para colocar o seu código:
eventos: KeyUp, KeyUp e KeyDown
Utilizarei para exemplo o evento KeyUp:
if (e.KeyCode == Keys.Enter)//evento disparado ao soltar a tecla enter
{
//aqui vai seu código do atalho
}
Todas as teclas podem ser utilizadas, incluindo mais de uma (Ctrl+A, por exemplo).
Filtros no objeto BindingSource (C#)
Muitas vezes essa única linha de código pode ajudar a filtrar dados de determinada tabela em um dataset. Sem necessidade de procedures ou SELECT's:
testeBindingSource.Filter = String.Format ("suaColuna='valor'"); //Filtro simples sem argumento
testeBindingSource.Filter = String.Format ("suaColuna='{0}'", argumento); //Filtro composto com 1 argumento
Para eliminar o filtro:
testeBindingSource.Filter = String.Empty;
Lembro que o seguinte comando é executado em runtime, podendo estar contido em eventos como a mudança de um comboBox ou a digitação de dados em um campo de texto.
testeBindingSource.Filter = String.Format ("suaColuna='valor'"); //Filtro simples sem argumento
testeBindingSource.Filter = String.Format ("suaColuna='{0}'", argumento); //Filtro composto com 1 argumento
Para eliminar o filtro:
testeBindingSource.Filter = String.Empty;
Lembro que o seguinte comando é executado em runtime, podendo estar contido em eventos como a mudança de um comboBox ou a digitação de dados em um campo de texto.
Criando appointment via código (C#)
Seguem abaixo os itens básicos para criação de appointment via código, lembro ainda que se faz necessário que sejam configurados devidamente os objetos para eventual sincronização de dados com MS Outlook (2003, XP, 2007 e 2010)
using DevExpress.XtraScheduler;
Appointment apt = new Appointment();
apt.Subject ="Título";
apt.Description = "Conteúdo";
apt.Start = dateEdit1.DateTime;
apt.End = dateEdit2.DateTime;
apt.Location ="Local";
schedulerStorage1.Appointments.Add(apt);
this.agendaBindingSource.EndEdit();
this.agendaTableAdapter.Update(this.dsApp.agenda);
this.agendaTableAdapter.Fill(this.dsApp.agenda);
using DevExpress.XtraScheduler;
Appointment apt = new Appointment();
apt.Subject ="Título";
apt.Description = "Conteúdo";
apt.Start = dateEdit1.DateTime;
apt.End = dateEdit2.DateTime;
apt.Location ="Local";
schedulerStorage1.Appointments.Add(apt);
this.agendaBindingSource.EndEdit();
this.agendaTableAdapter.Update(this.dsApp.agenda);
this.agendaTableAdapter.Fill(this.dsApp.agenda);
quarta-feira, 22 de junho de 2011
Função para validar CPF (C#)
public static bool ValidaCPF(string vrCPF)
{
string valor = vrCPF.Replace(".", "");
valor = valor.Replace("-", "");
if (valor.Length != 11)
return false;
bool igual = true;
for (int i = 1; i < 11 && igual; i++)
if (valor[i] != valor[0])
igual = false;
if (igual || valor == "12345678909")
return false;
int[] numeros = new int[11];
for (int i = 0; i < 11; i++)
numeros[i] = int.Parse(
valor[i].ToString());
int soma = 0;
for (int i = 0; i < 9; i++)
soma += (10 - i) * numeros[i];
int resultado = soma % 11;
if (resultado == 1 || resultado == 0)
{
if (numeros[9] != 0)
return false;
}
else if (numeros[9] != 11 - resultado)
return false;
soma = 0;
for (int i = 0; i < 10; i++)
soma += (11 - i) * numeros[i];
resultado = soma % 11;
if (resultado == 1 || resultado == 0)
{
if (numeros[10] != 0)
return false;
}
else
if (numeros[10] != 11 - resultado)
return false;
return true;
}
{
string valor = vrCPF.Replace(".", "");
valor = valor.Replace("-", "");
if (valor.Length != 11)
return false;
bool igual = true;
for (int i = 1; i < 11 && igual; i++)
if (valor[i] != valor[0])
igual = false;
if (igual || valor == "12345678909")
return false;
int[] numeros = new int[11];
for (int i = 0; i < 11; i++)
numeros[i] = int.Parse(
valor[i].ToString());
int soma = 0;
for (int i = 0; i < 9; i++)
soma += (10 - i) * numeros[i];
int resultado = soma % 11;
if (resultado == 1 || resultado == 0)
{
if (numeros[9] != 0)
return false;
}
else if (numeros[9] != 11 - resultado)
return false;
soma = 0;
for (int i = 0; i < 10; i++)
soma += (11 - i) * numeros[i];
resultado = soma % 11;
if (resultado == 1 || resultado == 0)
{
if (numeros[10] != 0)
return false;
}
else
if (numeros[10] != 11 - resultado)
return false;
return true;
}
Função para validar CNPJ (C#)
public static bool ValidaCNPJ(string vrCNPJ)
{
string CNPJ = vrCNPJ.Replace(".", "");
CNPJ = CNPJ.Replace("/", "");
CNPJ = CNPJ.Replace("-", "");
int[] digitos, soma, resultado;
int nrDig;
string ftmt;
bool[] CNPJOk;
ftmt = "6543298765432";
digitos = new int[14];
soma = new int[2];
soma[0] = 0;
soma[1] = 0;
resultado = new int[2];
resultado[0] = 0;
resultado[1] = 0;
CNPJOk = new bool[2];
CNPJOk[0] = false;
CNPJOk[1] = false;
try
{
for (nrDig = 0; nrDig < 14; nrDig++)
{
digitos[nrDig] = int.Parse(CNPJ.Substring(nrDig, 1));
if (nrDig <= 11)
soma[0] += (digitos[nrDig] *
int.Parse(ftmt.Substring(nrDig + 1, 1)));
if (nrDig <= 12)
soma[1] += (digitos[nrDig] *
int.Parse(ftmt.Substring(nrDig, 1)));
}
for (nrDig = 0; nrDig < 2; nrDig++)
{
resultado[nrDig] = (soma[nrDig] % 11);
if ((resultado[nrDig] == 0) || (
resultado[nrDig] == 1))
CNPJOk[nrDig] = (
digitos[12 + nrDig] == 0);
else
CNPJOk[nrDig] = (
digitos[12 + nrDig] == (
11 - resultado[nrDig]));
}
return (CNPJOk[0] && CNPJOk[1]);
}
catch
{
return false;
}
}
{
string CNPJ = vrCNPJ.Replace(".", "");
CNPJ = CNPJ.Replace("/", "");
CNPJ = CNPJ.Replace("-", "");
int[] digitos, soma, resultado;
int nrDig;
string ftmt;
bool[] CNPJOk;
ftmt = "6543298765432";
digitos = new int[14];
soma = new int[2];
soma[0] = 0;
soma[1] = 0;
resultado = new int[2];
resultado[0] = 0;
resultado[1] = 0;
CNPJOk = new bool[2];
CNPJOk[0] = false;
CNPJOk[1] = false;
try
{
for (nrDig = 0; nrDig < 14; nrDig++)
{
digitos[nrDig] = int.Parse(CNPJ.Substring(nrDig, 1));
if (nrDig <= 11)
soma[0] += (digitos[nrDig] *
int.Parse(ftmt.Substring(nrDig + 1, 1)));
if (nrDig <= 12)
soma[1] += (digitos[nrDig] *
int.Parse(ftmt.Substring(nrDig, 1)));
}
for (nrDig = 0; nrDig < 2; nrDig++)
{
resultado[nrDig] = (soma[nrDig] % 11);
if ((resultado[nrDig] == 0) || (
resultado[nrDig] == 1))
CNPJOk[nrDig] = (
digitos[12 + nrDig] == 0);
else
CNPJOk[nrDig] = (
digitos[12 + nrDig] == (
11 - resultado[nrDig]));
}
return (CNPJOk[0] && CNPJOk[1]);
}
catch
{
return false;
}
}
quinta-feira, 16 de junho de 2011
Capturando ScreenShot da tela (C#)
No tutorial a seguir é demonstrado como capturar imagem da tela e salvar para arquivo:
using System.Drawing.Imaging;
private void btnScreen_Click(object sender, EventArgs e)
using System.Drawing.Imaging;
private static Bitmap bmpImagem;
private static Graphics gfxImagem;private void btnScreen_Click(object sender, EventArgs e)
{
if (saveScreenshot.ShowDialog() == DialogResult.OK)
{
this.Hide();
bmpImagem = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
gfxImagemt = Graphics.FromImage(bmpImagem);
gfxImagem.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
bmpImagem.Save(saveScreenshot.FileName, ImageFormat.Png);
this.Close();
}
}
quarta-feira, 15 de junho de 2011
Barra de progresso com backgroundWorker (C#)
O tutorial a seguir demonstra como incrementar o valor de um objeto progressBar trabalhando com background worker.
primeiramente crie um objeto backgroundWorker e um evento DoWork:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for(int i = 0; i<100; i++)
{
//o seu código da tarefa vai aqui, uma conexão com banco de dados por exemplo
backgroundWorker1.ReportProgress(i);
}
}
crie um evento ProgressChanged do backgroundWorker:
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Valuet = e.ProgressPercentage;
}
ainda é possível executar tarefas após a conclusão da tarefa criando um evendo RunWorkerCompleted:
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Aqui vai seu código após a tarefa ser concluída, por exemplo um fechamento de conexão
}
Lembro que a progressBar deve ser devidamente configurada de acordo com sua necessidade (step, max/min, etc).
primeiramente crie um objeto backgroundWorker e um evento DoWork:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
for(int i = 0; i<100; i++)
{
//o seu código da tarefa vai aqui, uma conexão com banco de dados por exemplo
backgroundWorker1.ReportProgress(i);
}
}
crie um evento ProgressChanged do backgroundWorker:
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Valuet = e.ProgressPercentage;
}
ainda é possível executar tarefas após a conclusão da tarefa criando um evendo RunWorkerCompleted:
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Aqui vai seu código após a tarefa ser concluída, por exemplo um fechamento de conexão
}
Lembro que a progressBar deve ser devidamente configurada de acordo com sua necessidade (step, max/min, etc).
Lendo registros do windows (C#)
using Microsoft.Win32;
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\NOMEdaPASTA\NOMEdaCHAVE");//abre a chave
string registro = registryKey.GetValue("VALORdaCHAVE").ToString();//Pega valor do registro para variável
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\NOMEdaPASTA\NOMEdaCHAVE");//abre a chave
string registro = registryKey.GetValue("VALORdaCHAVE").ToString();//Pega valor do registro para variável
terça-feira, 14 de junho de 2011
Desativando fechamento da janela (C#)
private void FormExemplo_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
}
{
e.Cancel = true;
}
Envio de e-mail via código (C#)
using System.Net;
using System.Net.Mail;
MailMessage mail = new MailMessage();
mail.To.Add("ENDEREÇO DO EMAIL DO DESTINATÁRIO");
mail.From = new MailAddress("ENDEREÇO DE EMAIL DO REMETENTE");
mail.Subject = "Dados de novo usuário Vendor CRM 2.2";
mail.Body = "CONTEUDO/CORPO DO EMAIL";
SmtpClient smtp = new SmtpClient("SERVIDOR SMTP DE ENVIO");
NetworkCredential PassSecurity = new NetworkCredential("EMAIL DO REMETENTE", "SENHA DO REMETENTE");
smtp.Credentials = PassSecurity;
smtp.Send(mail);
using System.Net.Mail;
MailMessage mail = new MailMessage();
mail.To.Add("ENDEREÇO DO EMAIL DO DESTINATÁRIO");
mail.From = new MailAddress("ENDEREÇO DE EMAIL DO REMETENTE");
mail.Subject = "Dados de novo usuário Vendor CRM 2.2";
mail.Body = "CONTEUDO/CORPO DO EMAIL";
SmtpClient smtp = new SmtpClient("SERVIDOR SMTP DE ENVIO");
NetworkCredential PassSecurity = new NetworkCredential("EMAIL DO REMETENTE", "SENHA DO REMETENTE");
smtp.Credentials = PassSecurity;
smtp.Send(mail);
Assinar:
Postagens (Atom)