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

July 2008 - Posts

  • 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
  • Programmierung: Potentielle Memory-Leaks bei SPSite und SPWeb

    Beim Programmieren im SharePoint-Umfeld sollte man großen Wert auf saubere und sichere Programmierung legen. Kaum etwas ist ärgerlicher, als wenn das selbstentwickelte WebPart im Portal des Kunden bei jedem Aufruf Speicher anfordert und diesen nicht wieder zurück gibt.

    Gerade beim SharePoint Objektmodell sollte man sehr genau wissen, was man macht bzw. wie man es macht - dies gilt besonders bei der Verwendung von SPSite und SPWeb.

    Eine gute Zusammenfassung über das Thema habe ich im Blog von Roger Lamb gefunden. Sein Artikel zum Thema SharePoint 2007 and WSS 3.0 Dispose Patterns by Example ist für alle SharePoint-Programmierer sehr interessant.

     

    Add to Technorati Favorites
  • Desktop-Icons / Layout speichern und Wiederherstellen

    Wenn ich für einen Vortrag oder eine Präsentation zu einem Kunden fahre, nehme ich gern mein Präsentations-Notebook mit und schließe es vor Ort an einen Beamer an. Mein Notebook paßt dann aber die Auflösung an die maximale Auflösung des angeschlossenen Beamers an und zerwürfelt mir dabei jedesmal die Sortierung der Icons auf meinem Desktop. Da ich meist einige Icons auf meinem Desktop habe, ist ein Punkt der üblichen Nachbereitung das manuelle (und lästige) Wiederherstellen meines gewohnten Desktop-Icon Layouts.

    Ich denke, jeder der schon einmal eine Präsentation mit seinem Notebook und einem Beamer gehalten hat, kennt dieses Problem.

    Bei meiner letzten Kundenpräsentation hatte ein Mitarbeiter im Anschluß an meinen Vortrag einen guten Tipp für mich: es gibt ein kleines Tool, mit dem man das aktuelle Icon-Layout auf dem Desktop speichern und später bei Bedarf wieder herstellen kann. Dieses praktische Tool kann man sich hier herunterladen.

    Leider klappt die Installation nur für Systeme, auf denen Windows XP läuft. Wer Vista oder -wie ich- Vista 64-Bit einsetzt, findet eine erweiterte Version hier.

    So eine Funktion sollte es direkt in Windows Vista geben ...

    Nachtrag: von Midi-Ox gibt es nun auch eine Lösung, um die Icon-Position auf dem Desktop zu speichern und wiederherzustellen.

     

    Add to Technorati Favorites

Need SharePoint Training? Attend a SharePoint Bootcamp!

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