我过去创建了一个与此非常相似的项目,并选择使用 MailItem.HTMLBody 属性而不是与对象放置作斗争。
在我的例子中,我正在构建一个数据网格,但可以构建类似的东西来接收您的 URL 数据。注意:这是我开发的早期,代码可能需要一些重构,但是对于过去的复制和粘贴,我希望这还不错。我还从这篇文章中排除了一些不必要的信息,但最重要的部分都包含在此处。
为了组装邮件正文,该方法创建了一个StringBuilder,并逐段构建HTML文档。
public string ConstructBody(DataTable dataTable)
{
StringBuilder bodyStringBuilder = new StringBuilder();
// Creates the HTML code, constructs body, Constructs table, defines table border.
bodyStringBuilder.AppendLine("<html>");
bodyStringBuilder.AppendLine(Tab + "<body>");
bodyStringBuilder.AppendLine(Tab + Tab + "<table>");
bodyStringBuilder.AppendLine(Tab + Tab + "<table border='2' bgcolor:#DDDDDD bordercolor:black>");
// Column headers - Style defined.
bodyStringBuilder.Append(Tab + Tab + Tab + "<tbody align='center' style='font-family:verdana; color:#000000; font-size:14;background-color:#9DB9C8'>");
bodyStringBuilder.Append(Tab + Tab + Tab + "<tr>");
// Column Headers - Named
foreach (DataColumn dc in dataTable.Columns)
{
bodyStringBuilder.AppendFormat("<th>{0}</th>", dc.ColumnName);
}
// End of Column Header Creation
bodyStringBuilder.AppendLine("</tr>");
// Empty data rows created and filled by another foreach loop
int drColorSwitch = 1;
foreach (DataRow dr in dataTable.Rows)
{
if (IsOdd(drColorSwitch))
{
bodyStringBuilder.Append(Tab + Tab + Tab + Tab + "<tbody align='center' style='font-family:verdana;background-color=#DDDDDD; color:#000000; font-size:14 '>");
}
else
{
bodyStringBuilder.Append(Tab + Tab + Tab + Tab + "<tbody align='center' style='font-family:verdana;background-color=#BDD0D9; color:#000000; font-size=14 '>");
}
bodyStringBuilder.Append(Tab + Tab + Tab + "<tr>");
drColorSwitch ++;
// Fills the data.
foreach (DataColumn dc in dataTable.Columns)
{
string cellValue = dr[dc] != null ? dr[dc].ToString() : "";
bodyStringBuilder.AppendFormat("<td>{0}</td>", cellValue);
}
// Closes out each datarow
bodyStringBuilder.AppendLine("</tr>");
} // End of the datarow creation functions
// Closes the table, closes the body, and finally ends the HTML code for the body of the email.
bodyStringBuilder.AppendLine(Tab + Tab + "</table>");
bodyStringBuilder.AppendLine(Tab + "</body>");
bodyStringBuilder.AppendLine("</html>");
return bodyStringBuilder.ToString(); // Finally - returns value of SB
}
最后,在 MailReport 方法中,我创建了电子邮件消息并调用 Send();
public void MailReport(DataTable datatable,string[] recipients,string subject, string headertext, string reporttitle, bool includedate, bool includefiles, string[] filelist, bool isEncrypted)
{
// Creates instance of Header and Body Construction Classes
HeaderConstruction headerConstruction = new HeaderConstruction();
BodyConstruction bodyConstruction = new BodyConstruction();
Outlook.Application oApp = new Outlook.Application();
Outlook.MailItem oMsg = oApp.CreateItem(Outlook.OlItemType.olMailItem);
foreach (string recipient in recipients)
{
oMsg.Recipients.Add(recipient);
}
if(isEncrypted)
{
// If caller indicates that message should be encrypted, system will add secured flag to subject
oMsg.Subject = "<secure> " + subject;
}
else
{
// Else, message will transmit without security flag
oMsg.Subject = subject;
}
// introduces the body table
oMsg.HTMLBody = headerConstruction.ConstructHeader(headertext,reporttitle, includedate) + bodyConstruction.ConstructBody(datatable);
// Includes files in output message if requested
if (includefiles)
{
foreach (string path in filelist)
{
oMsg.Attachments.Add(path);
}
}
// Send
oMsg.Send();
}