newjeep19
asked on
Sending C# emails using a SQL Query to get names for email address
I have an console application that gets the names along as other information from a stored proc then generates an email. My issue is that with some of the names come back as NULL in my stored proc when an email still needs to be send out becuse other names are returned. However, when the the C# code trys to insert a the name of the person in the stored proc where it is NULL the application closes becsue a blank value can not be placed in the TO: section of the email. Is there away to still send an email out when a Null value is returned for one name however there is a name for the other?
My code is below:
using System;
using System.Collections.Generic ;
using System.Linq;
using System.Text;
using System.Net.Mail;
using System.Net;
using System.Data;
using System.Data.SqlClient;
using System.Data.Sql;
using System.Data.SqlTypes;
namespace EmailAEConsoleApp
{
class Program
{
static void Main(string[] args)
{
SqlConnection conn = new SqlConnection("Data Source=ServerName;Initial Catalog=DataBaseName;User ID=ID;Password=Password");
SqlCommand command = new SqlCommand("StoredProcName ", conn);
try
{
command.CommandType = CommandType.StoredProcedur e;
//Add data to DataTable
DataTable dtbItems = new DataTable();
conn.Open();
using (SqlDataAdapter sda = new SqlDataAdapter(command))
sda.Fill(dtbItems);
{
//GATHER OPP DATA
{
//Loop thru all the properties
foreach (DataRow row in dtbItems.Select())
{
string oppSalesPersonTeamAName = Convert.ToString(row["sale spersonATe amName"]);
string oppSalesPersonATeamManager Name = Convert.ToString(row["sale spersonAMa nagerName" ]);
string oppIAMName = Convert.ToString(row["Sale sPersonTea mBName"]);
["estimatedclosedate"]); <-----sometimes returns a null value
{
//****** NEED TO ADD "FOR EACH HERE ******
MailMessage mailAE = new MailMessage();
mailAE.From = new MailAddress("autogenerated system@com panyA.com" );
mailAE.To.Add(oppSalesPers onTeamANam e + "@companyA.com");
mailAE.To.Add(oppSalesPers onTeamBNam e + "@companyA.com");
mailAE.CC.Add(oppSalesPers onTeamAMan agerName + "@companyA.com");
mailAE.Subject = " ****Warning**** Date Close (PO In) is estimated to close in the next 5 days: " + oppEstCloseDate.ToShortDat eString() + "****Warning****";
mailAE.IsBodyHtml = true;
mailAE.BodyEncoding = System.Text.Encoding.UTF32 ;
mailAE.Body += "<br>Account Executive: " + oppSalesPersonTeamAName ;
mailAE.Body += "<br>IAM: " + oppSalesPersonTeamBName ;
mailAE.Body += "<br>Estimated Close Date: " + oppEstCloseDate.ToShortDat eString();
mailAE.Body += "<br>";
SmtpClient s = new SmtpClient();
MailMessage m = new MailMessage();
System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient ();
smtp.Host = "smtphostname";
smtp.Port = 25;
smtp.Send(mailAE);
}
conn.Close();
}
}
}
}
catch (Exception ex)
{
Console.WriteLine("ERROR MESSAGE: " + ex.Message);
conn.Close();
}
}
}
}
My code is below:
using System;
using System.Collections.Generic
using System.Linq;
using System.Text;
using System.Net.Mail;
using System.Net;
using System.Data;
using System.Data.SqlClient;
using System.Data.Sql;
using System.Data.SqlTypes;
namespace EmailAEConsoleApp
{
class Program
{
static void Main(string[] args)
{
SqlConnection conn = new SqlConnection("Data Source=ServerName;Initial Catalog=DataBaseName;User ID=ID;Password=Password");
SqlCommand command = new SqlCommand("StoredProcName
try
{
command.CommandType = CommandType.StoredProcedur
//Add data to DataTable
DataTable dtbItems = new DataTable();
conn.Open();
using (SqlDataAdapter sda = new SqlDataAdapter(command))
sda.Fill(dtbItems);
{
//GATHER OPP DATA
{
//Loop thru all the properties
foreach (DataRow row in dtbItems.Select())
{
string oppSalesPersonTeamAName = Convert.ToString(row["sale
string oppSalesPersonATeamManager
string oppIAMName = Convert.ToString(row["Sale
["estimatedclosedate"]); <-----sometimes returns a null value
{
//****** NEED TO ADD "FOR EACH HERE ******
MailMessage mailAE = new MailMessage();
mailAE.From = new MailAddress("autogenerated
mailAE.To.Add(oppSalesPers
mailAE.To.Add(oppSalesPers
mailAE.CC.Add(oppSalesPers
mailAE.Subject = " ****Warning**** Date Close (PO In) is estimated to close in the next 5 days: " + oppEstCloseDate.ToShortDat
mailAE.IsBodyHtml = true;
mailAE.BodyEncoding = System.Text.Encoding.UTF32
mailAE.Body += "<br>Account Executive: " + oppSalesPersonTeamAName ;
mailAE.Body += "<br>IAM: " + oppSalesPersonTeamBName ;
mailAE.Body += "<br>Estimated Close Date: " + oppEstCloseDate.ToShortDat
mailAE.Body += "<br>";
SmtpClient s = new SmtpClient();
MailMessage m = new MailMessage();
System.Net.Mail.SmtpClient
smtp.Host = "smtphostname";
smtp.Port = 25;
smtp.Send(mailAE);
}
conn.Close();
}
}
}
}
catch (Exception ex)
{
Console.WriteLine("ERROR MESSAGE: " + ex.Message);
conn.Close();
}
}
}
}
btw, next time put your code in a code brackets, it makes it easier to review the code.
ASKER
Still not what I am looking for. When the value is null I still need to send out the email becsue the other names where found.
Results from stored proc"
First loop thru table
SalesPerson A = John Smith
Sales Person b = John Doe
Second loop thru table
SalesPerson A = Bill Jones
Sales Person b = " "
Email.....
First email from first loop:
TO: John Smith , John Doe
Second email sent from second loop
TO: Bill Jones
so even thought the second loop there was a null or blank value the email is still sent to Bill Jones
Results from stored proc"
First loop thru table
SalesPerson A = John Smith
Sales Person b = John Doe
Second loop thru table
SalesPerson A = Bill Jones
Sales Person b = " "
Email.....
First email from first loop:
TO: John Smith , John Doe
Second email sent from second loop
TO: Bill Jones
so even thought the second loop there was a null or blank value the email is still sent to Bill Jones
static void Main(string[] args)
{
SqlConnection conn = new SqlConnection("Data Source=ServerName;Initial Catalog=DataBaseName;User ID=ID;Password=Password");
SqlCommand command = new SqlCommand("StoredProcName", conn);
try
{
command.CommandType = CommandType.StoredProcedure;
//Add data to DataTable
DataTable dtbItems = new DataTable();
conn.Open();
using (SqlDataAdapter sda = new SqlDataAdapter(command))
{
sda.Fill(dtbItems);
{
//Loop thru all the properties
foreach (DataRow row in dtbItems.Select())
{
string salespersonATeamName = Convert.ToString(row["salespersonATeamName"]);
string SalesPersonTeamBName = Convert.ToString(row["SalesPersonTeamBName"]);
string salespersonAManagerName = Convert.ToString(row["salespersonAManagerName"]);
DateTime dtClosedDate = DateTime.MaxValue;
if (!DateTime.TryParse(row["estimatedclosedate"].ToString(), out dtClosedDate))
{
//failed get estimated closed date
}
MailMessage mailAE = new MailMessage();
mailAE.From = new MailAddress("autogeneratedsystem@companyA.com");
if (!string.IsNullOrEmpty(salespersonATeamName))
{
mailAE.To.Add(salespersonATeamName + "@companyA.com");
}
if (!string.IsNullOrEmpty(SalesPersonTeamBName))
{
mailAE.To.Add(SalesPersonTeamBName + "@companyA.com");
}
if (!string.IsNullOrEmpty(salespersonAManagerName))
{
mailAE.CC.Add(salespersonAManagerName + "@companyA.com");
}
mailAE.Subject = " ****Warning**** Date Close (PO In) is estimated to close in the next 5 days: " + oppEstCloseDate.ToShortDateString() + "****Warning****";
mailAE.IsBodyHtml = true;
mailAE.BodyEncoding = System.Text.Encoding.UTF32;
mailAE.Body += "<br>Account Executive: " + salespersonATeamName;
mailAE.Body += "<br>IAM: " + SalesPersonTeamBName;
if (dtClosedDate != DateTime.MaxValue)
{
mailAE.Body += "<br>Estimated Close Date: " + dtClosedDate.ToShortDateString();
}
mailAE.Body += "<br>";
SmtpClient s = new SmtpClient();
MailMessage m = new MailMessage();
System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient();
smtp.Host = "smtphostname";
smtp.Port = 25;
smtp.Send(mailAE);
}
}
}
conn.Close();
}
catch (Exception ex)
{
Console.WriteLine("ERROR MESSAGE: " + ex.Message);
conn.Close();
}
}
ASKER
Thanks for sending this example however I still get an error message when trying to add a " " value to the TO fieled in the email when SalesPersonB is Null or blank. My updated code is below:
I added the short name to meet the context of the email thru our email system. I need the email to still send an email out even if salesPersonB is returned as null or blank in the stored proc. Before I added the short name code the app would still fail because I can't have a blank ( " " @companyA.com) in the To field in the email. Which in most cases the second sales person (salesPersonB) is blank .
Thanks
static void Main(string[] args)
{
SqlConnection conn = new SqlConnection("Data Source=ServerName;Initial Catalog=DataBaseName;User ID=ID;Password=Password");
SqlCommand command = new SqlCommand("StoredProcName", conn);
try
{
command.CommandType = CommandType.StoredProcedure;
//Add data to DataTable
DataTable dtbItems = new DataTable();
conn.Open();
using (SqlDataAdapter sda = new SqlDataAdapter(command))
{
sda.Fill(dtbItems);
{
//Loop thru all the properties
foreach (DataRow row in dtbItems.Select())
{
string salespersonATeamName = Convert.ToString(row["salespersonATeamName"]);
string SalesPersonTeamBName = Convert.ToString(row["SalesPersonTeamBName"]);
string salespersonAManagerName = Convert.ToString(row["salespersonAManagerName"]);
DateTime dtClosedDate = DateTime.MaxValue;
if (!DateTime.TryParse(row["estimatedclosedate"].ToString(), out dtClosedDate))
{
//failed get estimated closed date
}
if (string.IsNullOrEmpty(salespersonATeamName )) continue;
if (string.IsNullOrEmpty(salespersonBTeamName )) continue;
if (string.IsNullOrEmpty(salespersonAManagerName )) continue;
// No spaces allowed
string ASalesPersonshort_name = salespersonATeamName .Substring(0, 1).ToLower() + salespersonATeamName .Substring(salespersonATeamName .IndexOf(" ") + 1).ToLower();
string BSalesPersonshort_name = salespersonBTeamName .Substring(0, 1).ToLower() + salespersonBTeamName .Substring(salespersonBTeamName .IndexOf(" ") + 1).ToLower(); <---error Message = "Index and length must refer to a location within the string.\r\nParameter name: length"
string salespersonAManagerName _name = salespersonAManagerName .Substring(0, 1).ToLower() + salespersonAManagerName .Substring(oppIAMName.IndexOf(" ") + 1).ToLower();
MailMessage mailAE = new MailMessage();
mailAE.From = new MailAddress("autogeneratedsystem@companyA.com");
if (!string.IsNullOrEmpty(ASalesPersonshort))
{
mailAE.To.Add(ASalesPersonshort+ "@companyA.com");
}
if (!string.IsNullOrEmpty(BSalesPersonshort))
{
mailAE.To.Add(BSalesPersonshort+ "@companyA.com");
}
if (!string.IsNullOrEmpty(salespersonAManagerName ))
{
mailAE.CC.Add(salespersonAManagerName + "@companyA.com");
}
mailAE.Subject = " ****Warning**** Date Close (PO In) is estimated to close in the next 5 days: " + oppEstCloseDate.ToShortDateString() + "****Warning****";
mailAE.IsBodyHtml = true;
mailAE.BodyEncoding = System.Text.Encoding.UTF32;
mailAE.Body += "<br>Account Executive: " + salespersonATeamName;
mailAE.Body += "<br>IAM: " + SalesPersonTeamBName;
if (dtClosedDate != DateTime.MaxValue)
{
mailAE.Body += "<br>Estimated Close Date: " + dtClosedDate.ToShortDateString();
}
mailAE.Body += "<br>";
SmtpClient s = new SmtpClient();
MailMessage m = new MailMessage();
System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient();
smtp.Host = "smtphostname";
smtp.Port = 25;
smtp.Send(mailAE);
}
}
}
conn.Close();
}
catch (Exception ex)
{
Console.WriteLine("ERROR MESSAGE: " + ex.Message);
conn.Close();
}
}
I added the short name to meet the context of the email thru our email system. I need the email to still send an email out even if salesPersonB is returned as null or blank in the stored proc. Before I added the short name code the app would still fail because I can't have a blank ( " " @companyA.com) in the To field in the email. Which in most cases the second sales person (salesPersonB) is blank .
Thanks
my bad, here:
static void Main(string[] args)
{
SqlConnection conn = new SqlConnection("Data Source=ServerName;Initial Catalog=DataBaseName;User ID=ID;Password=Password");
SqlCommand command = new SqlCommand("StoredProcName", conn);
try
{
command.CommandType = CommandType.StoredProcedure;
//Add data to DataTable
DataTable dtbItems = new DataTable();
conn.Open();
using (SqlDataAdapter sda = new SqlDataAdapter(command))
{
sda.Fill(dtbItems);
{
//Loop thru all the properties
foreach (DataRow row in dtbItems.Select())
{
string salespersonATeamName = Convert.ToString(row["salespersonATeamName"]);
string SalesPersonTeamBName = Convert.ToString(row["SalesPersonTeamBName"]);
string salespersonAManagerName = Convert.ToString(row["salespersonAManagerName"]);
DateTime dtClosedDate = DateTime.MaxValue;
if (!DateTime.TryParse(row["estimatedclosedate"].ToString(), out dtClosedDate))
{
//failed get estimated closed date
}
if (!string.IsNullOrEmpty(salespersonATeamName))
{
salespersonATeamName = salespersonATeamName .Substring(0, 1).ToLower() + salespersonATeamName .Substring(salespersonATeamName .IndexOf(" ") + 1).ToLower();
}
if (!string.IsNullOrEmpty(SalesPersonTeamBName ))
{
SalesPersonTeamBName = salespersonBTeamName .Substring(0, 1).ToLower() + salespersonBTeamName .Substring(salespersonBTeamName .IndexOf(" ") + 1).ToLower();
}
if (!string.IsNullOrEmpty(salespersonAManagerName))
{
salespersonAManagerName = salespersonAManagerName .Substring(0, 1).ToLower() + salespersonAManagerName .Substring(oppIAMName.IndexOf(" ") + 1).ToLower();
}
MailMessage mailAE = new MailMessage();
mailAE.From = new MailAddress("autogeneratedsystem@companyA.com");
if (!string.IsNullOrEmpty(SalesPersonTeamAName ))
{
mailAE.To.Add(SalesPersonTeamAName + "@companyA.com");
}
if (!string.IsNullOrEmpty(SalesPersonTeamBName ))
{
mailAE.To.Add(SalesPersonTeamBName + "@companyA.com");
}
if (!string.IsNullOrEmpty(salespersonAManagerName ))
{
mailAE.CC.Add(salespersonAManagerName + "@companyA.com");
}
mailAE.Subject = " ****Warning**** Date Close (PO In) is estimated to close in the next 5 days: " + oppEstCloseDate.ToShortDateString() + "****Warning****";
mailAE.IsBodyHtml = true;
mailAE.BodyEncoding = System.Text.Encoding.UTF32;
mailAE.Body += "<br>Account Executive: " + salespersonATeamName;
mailAE.Body += "<br>IAM: " + SalesPersonTeamBName;
if (dtClosedDate != DateTime.MaxValue)
{
mailAE.Body += "<br>Estimated Close Date: " + dtClosedDate.ToShortDateString();
}
mailAE.Body += "<br>";
SmtpClient s = new SmtpClient();
MailMessage m = new MailMessage();
System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient();
smtp.Host = "smtphostname";
smtp.Port = 25;
smtp.Send(mailAE);
}
}
}
conn.Close();
}
catch (Exception ex)
{
Console.WriteLine("ERROR MESSAGE: " + ex.Message);
conn.Close();
}
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
OK thanks that works great
Open in new window