maddox Posted April 9, 2012 at 06:23 PM Report #448263 Posted April 9, 2012 at 06:23 PM Boa tarde, Ando à dias para resolver um problema que aparentemente é simples de resolver mas que eu não estou a conseguir fazê-lo. Então é o seguinte: criei um sistema de newsletter em ASP .NET e está a funcionar lindamente para apenas um destinatário e que é o utilizador que coloca só que eu queria que enviasse automaticamente para todos os utilizadores registados numa base de dados criada para o efeito (newsletter.mdf). Será que me podem ajudar? O código que tenho é o seguinte: newsletter.aspx <%@ Page Title="" Language="C#" MasterPageFile="~/admin/menu1.master" AutoEventWireup="true" CodeFile="newsletter.aspx.cs" Inherits="admin_newsletter" %> <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder2" Runat="Server"> <!-- Primary navigation --> <nav id="primary"> <ul> <li> <a href="Default.aspx"> <span class="glyph listicon"></span> Tabelas </a> </li> <li> <a href="empresa.aspx"> <span class="glyph shuffle"></span> Empresa </a> </li> <li class="active"> <a href="listaemails.aspx"> <span class="glyph pencil"></span> Newsletter </a> </li> <li class="bottom"> <a href="logout.aspx"> <span class="glyph quit"></span> Sair </a> </li> </ul> </nav> <!-- Secondary navigation --> <nav id="secondary"> <ul> <li><a href="listaemails.aspx">Listagem Emails</a></li> <li class="active"><a href="newsletter.aspx">Newsletter</a></li> </ul> <div id="notifications"> <ul> </ul> </div> </nav> </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> <section id="maincontainer"> <div id="main"> <div class="box"> <div class="box-header"> <h1>Envio de Newsletter</h1> <ul> <li class="active"><a href="#one">Formulário</a></li> </ul> </div> <div class="box-content"> <div class="tab-content" id="one"> <form id="form1" runat="server"> <div> <br /> <br /> <div> <asp:Label ID="Label3" runat="server" Text="Para:" Width="60px"></asp:Label> <asp:TextBox ID="txtPara" runat="server" Width="450px"></asp:TextBox> </div> <br /> <br /> <div> <asp:Label ID="Label9" runat="server" Text="Assunto:" Width="60px"></asp:Label> <asp:TextBox ID="txtAssunto" runat="server" Width="450px"></asp:TextBox> </div> <br /><br /> <div> <asp:Label ID="Label10" runat="server" Text="Anexo:" Width="60px"></asp:Label> <asp:FileUpload ID="FileUpload1" runat="server" Width="450px"></asp:FileUpload> <p style="margin-left:60px; font-size:10px;">O Ficheiro a carregar deverá ter o nome: newsletter.jpg</p> </div> <br /> <div style="margin-left:60px"> <asp:Button ID="btnEnviarEmail" runat="server" Text="Enviar" OnClick="btnEnviarEmail_Click"/><br /><br /> <asp:Label ID="lblResultado" runat="server"/> </div> <br /> </div> </form> </div> </div> </div> </div> </section> </asp:Content> newsletter.aspx.cs using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; //Namespaces usados para o envio de email using System.Net.Mail; using System.Net.Mime; public partial class admin_newsletter : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { //ajuste dos tabindex's dos controles Int16 vTabIndex = 1; this.txtPara.TabIndex = vTabIndex++; this.txtAssunto.TabIndex = vTabIndex++; this.btnEnviarEmail.TabIndex = vTabIndex++; } } #region Validadores private bool IsEmpty(string str) { bool isValid = true; try { if ((str == null) || (str.ToString().Trim().Length == 0)) { isValid = false; } } catch { isValid = false; } return !isValid; } private bool IsNumber(string str) { bool isValid = true; try { long number = Int64.Parse(str); } catch { isValid = false; } return isValid; } private bool IsEmail(string str) { string[] mails = str.Split(';'); foreach (string ma in mails) { if (ma.Trim() != "" && !this.IsEmailUnico(ma.Trim())) return false; } return true; } private bool IsEmailUnico(string str) { string[] mails = str.Split(';'); foreach (string ma in mails) { if (ma.Trim() != "") { string patternStrictEmail = @"^(([^<>()[\]\\.,;:\s@\""]+" + @"(\.[^<>()[\]\\.,;:\s@\""]+)*)|(\"".+\""))@" + @"((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" + @"\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+" + @"[a-zA-Z]{2,}))$"; System.Text.RegularExpressions.Regex re = new System.Text.RegularExpressions.Regex(patternStrictEmail); if (!re.IsMatch(ma.Trim())) return false; } } return true; } private bool ValidarCampos() { bool resultado = true; this.lblResultado.ForeColor = System.Drawing.Color.BlueViolet; this.lblResultado.Text = ""; if (this.IsEmpty(this.txtPara.Text)) { this.txtPara.Focus(); this.lblResultado.Text += "Campo PARA não pode ficar em branco<br>"; resultado = false; } if (this.IsEmpty(this.txtAssunto.Text)) { this.txtAssunto.Focus(); this.lblResultado.Text += "Campo ASSUNTO não pode ficar em branco<br>"; resultado = false; } if (!this.IsEmail(this.txtPara.Text)) { this.txtPara.Focus(); this.lblResultado.Text += "Campo PARA deve ser um e-mail válido, caso for necessário separar por;<br>"; resultado = false; } return resultado; } #endregion protected void btnEnviarEmail_Click(object sender, EventArgs e) { //Upload de Ficheiro var mensagem = string.Empty; if (this.FileUpload1.HasFile) { this.FileUpload1.SaveAs(Server.MapPath("~/enews/" + FileUpload1.FileName)); mensagem = "Imagem gravada com sucesso!"; } else mensagem = "Selecione uma imagem!"; ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "Mensagem", "alert(' " + mensagem + "')", true); //Cria uma nova instância da Classe MailMessage MailMessage message = new MailMessage(); SmtpClient client = new SmtpClient(); try { if (this.ValidarCampos()) { //montando e-mail message.From = new MailAddress("newsletters@XXXX.pt", "Newsletter :: XXXX.pt", System.Text.Encoding.GetEncoding(1252)); message.SubjectEncoding = System.Text.Encoding.GetEncoding(1252); message.BodyEncoding = System.Text.Encoding.GetEncoding(1252); string[] destinatarios = this.txtPara.Text.Trim().Split(';'); foreach (string dest in destinatarios) { if (dest.Trim() != "") message.CC.Add(dest); } message.Subject = this.txtAssunto.Text.Trim(); string bodyHTML = string.Empty; message.IsBodyHtml = true; bodyHTML = @"PÁGINA HTML"; //Cria Instância de AlternateView para os Tipos de Corpo de Email AlternateView htmlView = AlternateView.CreateAlternateViewFromString(bodyHTML, null, "text/html"); message.AlternateViews.Add(htmlView); //verificando autenticação client.Credentials = new System.Net.NetworkCredential("newsletters@XXXX.pt", "news"); client.Port = 25; client.Host = "mail.XXXX.pt"; //enviando e-mail client.Send(message); //limpa controles this.txtAssunto.Text = ""; this.txtPara.Focus(); this.lblResultado.ForeColor = System.Drawing.Color.Blue; this.lblResultado.Text = "E-mail enviado com sucesso!"; } } catch (Exception ex) { this.lblResultado.ForeColor = System.Drawing.Color.Red; this.lblResultado.Text = "Erro no envio de email:<br>" + ex.Message.ToString(); } finally { message.Dispose(); message = null; client = null; } } } Agradeço desde já a atenção prestada.
Gonka Posted April 9, 2012 at 06:38 PM Report #448266 Posted April 9, 2012 at 06:38 PM Podes fazer um foreach para percorrer todos os destinatários e colocas o método de enviar o email dentro desse foreach. Assim, é enviado um email para cada contacto que tiveres na base de dados.
bruno1234 Posted April 9, 2012 at 07:00 PM Report #448269 Posted April 9, 2012 at 07:00 PM Quando corres em debug o destinatário aparece com os endereços todos? Matraquilhos para Android. Gratuito na Play Store. https://play.google.com/store/apps/details?id=pt.bca.matraquilhos
maddox Posted April 9, 2012 at 10:13 PM Author Report #448298 Posted April 9, 2012 at 10:13 PM A minha dificuldade é saber o que, e como, colocar em vez de: this.txtPara.Text.Trim().Split(';'); Ou seja, assim "string[] destinatarios = this.txtPara.Text.Trim().Split(';');" eu estou a ir buscar à textbox todos os emails que lá inserir manualmente mas eu queria algo do género: "string[] destinatarios = nome_do_campo_na_bd;" e que fosse buscar todos os emails registados na tabela newsletter, campo email.
ahco Posted April 18, 2012 at 07:27 PM Report #449820 Posted April 18, 2012 at 07:27 PM datatable for each row in dt depois, vais ter um problema se tiveres 1000 emails para enviar, o foreach vai enviar mas depois o servidor de email vai te começar a fazer denied. por isso aconselho te a criar o envio das newsletters pelo global.asx e crias um espaço de tempo entre elas. Abraço Qualquer coisa PM
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now