Recently
one of my client requested that they want an alert email every time an
item is created or modified. Moreover if there is any attachment in that
list, they want that attachment to be the part of email alert. The
first part of the request is pretty simple. A simple alert can do the
job but sending email is where it gets tricky.
To tackle this, I knew I had to create a workflow but the simple “SPUtility.SendEmail” doesn’t allow you to send emails with attachment so this is how I tackled it.
List<SPFile> _fileList = null;
SPWeb myweb = SPContext.Current.Web;
SPSite mysite = SPContext.Current.Site;
SPList mylist = SPContext.Current.List;
SPListItem myitem = SPContext.Current.ListItem;
SPAttachmentCollection myattach = myitem.Attachments;
if (myattach.Count != 0)
{
myweb.AllowUnsafeUpdates = false;
List<SPFile> lstSPFile = null;
SPSecurity.RunWithElevatedPrivileges(delegate
{
using (SPSite oSite = new SPSite(myitem.ParentList.ParentWeb.Site.ID))
{
using (SPWeb oWeb = oSite.OpenWeb(myitem.ParentList.ParentWeb.ID))
{
SPFolder folder = myitem.ParentList.RootFolder.SubFolders["Attachments"].SubFolders[myitem.ID.ToString()];
lstSPFile = new List<SPFile>();
foreach (SPFile file in folder.Files)
{
lstSPFile.Add(file);
}
_fileList = lstSPFile;
}
}
});
string smtpServer = SPAdministrationWebApplication.Local.OutboundMailServiceInstance.Server.Address;
string smtpFrom = SPAdministrationWebApplication.Local.OutboundMailSenderAddress;
MailMessage mailMessage = new MailMessage(smtpFrom, "email@email.com");
mailMessage.Body = "body body body body body body body body body ";
mailMessage.Subject = "subject subject subject";
foreach(var file in _fileList){
WebClient webClient = new WebClient();
//Supply the WebClient with the network credentials of our user
webClient.Credentials = CredentialCache.DefaultNetworkCredentials;
string mypath = "http://server/" + file;
//Download the byte array of the file
byte[] data = webClient.DownloadData(mypath);
MemoryStream memoryStreamOfFile = new MemoryStream(data);
mailMessage.Attachments.Add(new System.Net.Mail.Attachment(memoryStreamOfFile, file.Name.ToString()));
}
//Create the SMTP client object and send the message
SmtpClient smtpClient = new SmtpClient(smtpServer);
smtpClient.Send(mailMessage);
}