in

SharePoint Blogs

The Best Place for SharePoint-related Blogs

This Blog

Syndication

News

Ein guter Blog lebt auch vom Feedback der Leser. Aus diesem Grund möchte ich alle Leser bitten und auffordern, Feedback und Bewertung für einzelne Posts abzugeben. Ich freue mich natürlich auch, wenn mein Blog oder auch einzelne Posts verlinkt werden. Dies hilft anderen Leser und ist zugleich auch Ansporn für mich!

Meine SharePoint-Notizen

SharePoint-Notizen aus meiner täglichen Projektarbeit mit dem Microsoft Office SharePoint Server 2007

How to: Mails mit Anhang aus Workflows heraus verschicken

Das neue VisualStudio 2008 unterstützt einen Entwickler sehr gut bei der Erstellung von Workflows für SharePoint. Besonders der grafische Editor erleichtert das Erstellen der Workflow-Grundstruktur enorm. Momentan arbeite ich an einem benutzerdefinierten Workflow für einen inhouse Kunden. Dieser Workflow wird von einer SharePoint-Liste beim Einfügen eines neuen Elements getriggert. Eine der Aufgaben dieses Workflows soll das Verschicken einer E-Mail sein. Keine große Sache - schließlich bietet der grafische Workflow-Editor in VisualStudio 2008 das SendMail-Objekt genau für solche Zwecke an. Aber sobald man versucht, mit diesem SendMail-Objekt eine E-Mail mit einem Anhang (Attachment) zu verschicken, stößt man auf Schwierigkeiten. Das SendMail-Objekt unterstützt leider keine Attachments!

Es blieb mir also nichts anderes übrig, als statt des SendMail-Objekts eine normale Code-Activity zu verwenden. Erschwerend kommt noch hinzu, dass die Datei, die als E-Mail Attachment verschickt werden soll, nicht im Dateisystem abgelegt wurde, sondern als Anhang an einem Listen-Eintrag einer SharePoint-Liste vorlag. Es ergaben sich also 2 Probleme, für die ich eine Lösung brauchte:

  1. wie verschickt man E-Mails mit Anhang?
  2. wie bekommt man den Dateianhang aus der Liste heraus und in die E-Mail herein?

Das erste Problem läßt sich mit der Klasse System.Net.Mail.MailMessage lösen. Dieses Objekt läßt sich ähnlich verwenden, wie das SendMail-Objekt, unterstützt aber Anhänge. Im Gegensatz zum SendMail-Objekt muss man aber hier den zu verwendenden SMTP-Server und die Absenderadresse angeben. Beides ist normalerweise in SharePoint (über die Zentraladministration) bereits definiert und man kann sich diese Einstellungen über das Objektmodell besorgen.

Das zweite Problem ist etwas kniffliger. Über den Dateinamen und die URL des SharePoint-Listen-Anhangs kann man sich ein SPFile-Objekt erzeugen. Dieses SPFile-Objekt kann man dann durch ein Attachment-Objekt auslesen lassen. Danach kann man dieses Attachment-Objekt der Attachments-Collection von MailMessage hinzufügen.

Auch wenn es ursprünglich nach einer einfachen Sache aussah, stellte sich das Problem "wie versende ich eine E-Mail mit Dateianhang aus einem Workflow" als interessante Herausforderung dar. Für interessierte Leser füge ich diesem Posting ein kleines Code-Snippet bei. Es zeigt eine Möglichkeit, wie man einen (bzw. den ersten) Dateianhang eines Eintrags in einer SharePoint-Liste als Anhang einer E-Mail verschicken kann.

private void SendCustomerMail_ExecuteCode(object sender, EventArgs e)
{
   string strPathAttachment = string.Empty;
   SPListItem oItem = workflowProperties.Item;
   SPWebApplication oWebApp = workflowProperties.Site.WebApplication;

   MailMessage oMail = new MailMessage();

   oMail.From = new MailAddress(oWebApp.OutboundMailSenderAddress);
   oMail.To.Add(m_strMailAddressCustomer);
   oMail.Subject = m_strMailSubjectCustomer;
   oMail.Body = m_strMailTextCustomer;
   oMail.IsBodyHtml = false;

   SPAttachmentCollection oAttachments = oItem.Attachments;

   if (0 < oAttachments.Count)
   {
     strPathAttachment = oAttachments.UrlPrefix + oAttachments[0];

     SPFile oFile = oItem.ParentList.ParentWeb.GetFile(strPathAttachment);
     Attachment oAttachment = new Attachment(oFile.OpenBinaryStream(), oFile.Name);

     oMail.Attachments.Add(oAttachment);
   }

   string strSmtpServer = oWebApp.OutboundMailServiceInstance.Server.Address;
   SmtpClient oSmtpClient = new SmtpClient(strSmtpServer);
   oSmtpClient.UseDefaultCredentials = true;

   oSmtpClient.SendAsync(oMail, "UserState");
}

An dieser Stelle möchte ich noch auf ein älteres Posting von mir hinweisen: dem MailMessage-Objekt kann man per Eigenschaft (IsBodyHTML) mitteilen, dass es die E-Mail als 'Plain-Text' verschicken soll. Beim SendMail-Objekt geht das leider nicht so einfach. Es ist aber dennoch möglich - hier der Link zu meinem Beitrag.

 

Add to Technorati Favorites

Comments

No Comments

Leave a Comment

(required )  
(optional )
(required )  
Add

Need SharePoint Training? Attend a SharePoint Bootcamp!

Posts (c) their respective authors. Everything else (c) 2007 SharePoint Experts