Jump to content
maddox

Enviar email vários destinatários da BD

Recommended Posts

maddox

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.

Share this post


Link to post
Share on other sites
Gonka

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.

Share this post


Link to post
Share on other sites
maddox

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.

Share this post


Link to post
Share on other sites
ahco

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

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.