We send out simple email notices from information in Deltek’s database.
If you have the Enterprise Edition of SQL Server you can do this straight-up using Data Driven Subscriptions which is a really nice feature of SQL Reporting that allows you to use a query to determine who gets the report via email and what is in the report for each one sent. Here is a link to get you started: http://msdn.microsoft.com/en-us/library/ms169673.aspx
But since we do not have that license and option I am using code to to the two queries – (1) the target email address & (2) the report details – namely their expense report.
This is the extraction Stored Procedure:
Procedure [dbo].[BWSP_getExpenseReceipts] as Select EM.email , EM.Employee , EX.EmployeeName , EX.Amount , EX.CheckNo , EX.CheckDate , EX.ReportName , EX.ReportDate from EM Join exChecks EX on ( EM.Employee = EX.Employee )
On our intranet we have a grid that displays the pending check receipt data & a simple process button to approve. This page is secure to accounting personnel.
The process uses SMTP and data from the Stored Procedure above to form an individual email for each involved employee.
private void sendNotifications()
{
string sTitle = "Expense Check Notification";
string sMsg = "";
string sSourceEmail = @"***@***";
DataSet ds = DeltekUtilities.getPendingExpenseNotifications(); // ADO call to get data using the SP above
DataTableReader dr = ds.CreateDataReader();
int ii = 0;
while (dr.Read())
{
ii++;
sMsg = "===================================================================================" + "\n";
sMsg += " Expense Check Notification " + "\n";
sMsg += "===================================================================================" + "\n\n";
//sMsg += " Email: " + dr["email"].ToString() + "\n";
sMsg += " Employee: " + dr["EmployeeName"].ToString() + "\n";
sMsg += " Deposit Amount: " + String.Format("{0:c}", Double.Parse(dr["Amount"].ToString())) + "\n";
sMsg += " Deposit Date: " + String.Format("{0:d}", dr["CheckDate"]) + "\n";
sMsg += " Description: " + dr["ReportName"].ToString() + "\n";
sMsg += "---------------------------------------------------------------------------------";
try
{
Utilities.sendEmail(sSourceEmail, dr["email"].ToString().Trim(), string.Empty, sTitle, sMsg, false);
}
catch (Exception ex)
{
lblMessage.Text += "<br> error sending: " + dr["email"].ToString();
}
}
if (dr != null)
{
dr.Close();
dr.Dispose();
}
lblMessage.Text += "<br>" + ii.ToString() + " Emails Sent";
}
// Send Email Utility Call
public static bool sendEmail(string sSourceEmail, string sTargetEmailList, string sCCEmailList, string sMsgTitle, string sMsg, bool isHTMLemail)
{
bool bReturn = false;
SmtpClient client = new SmtpClient();
client.Host = "****";
MailMessage mm = new MailMessage();
try
{
mm.Sender = new MailAddress(sSourceEmail);
mm.From = new MailAddress(sSourceEmail);
mm.To.Add (new MailAddress(sTargetEmailList));
if (sCCEmailList.Length > 0)
mm.CC.Add (new MailAddress(sCCEmailList));
mm.Subject = sMsgTitle;
mm.Body = sMsg;
mm.IsBodyHtml = isHTMLemail;
client.Send(mm);
bReturn = true;
}
catch (Exception ex)
{
string sEmails = " Email List [" + sSourceEmail + " " + sTargetEmailList + " " + sCCEmailList + "] ";
throw new IntranetException(ex.Message + sEmails,
ex,
SystemConstants.Intranet_ErrorMessage);
}
return bReturn;
}