Sarcinile din Sharepoint sunt afișate într-o "clasă" separată a elementelor. Ei nu au doar domenii preconfigurate și "servesc" procesele de lucru. Ei au, de asemenea, șabloane de mesaje de e-mail pre-configurate care, în afară de notificarea actuală, pot să editeze sarcina direct de la clientul de poștă electronică (desigur, dacă aceasta din urmă acceptă această caracteristică).
Această particularitate este foarte convenabilă, pentru că utilizatorul nu are nevoie să deschidă browserul pentru a efectua orice operațiuni de rutină. În acest caz, sunt încărcate atât formele standard de editare a sarcinilor, cât și cele create în InfoPath (inclusiv codul încorporat).
Acest lucru este bine până când dorim să personalizăm textul scrisorii. Nu este ușor să faceți acest lucru încet, mai ales dacă aveți nevoie de dependență de text de pe site-ul curent etc. În plus, în mod implicit, sunt trimise alerte pentru a crea, a modifica și a închide o sarcină. Adesea, sunt necesare doar anumite evenimente specifice. Prin urmare, multe persoane dezactivează alertele automate și își creează propriul sistem de alerte. Există câteva implementări (bazate pe fluxul de lucru sau procesarea evenimentelor din elementul listei), dar toate au un dezavantaj - funcția de editare a sarcinilor clientului de mail este pierdută.
pentru că utilizatorii noștri sunt obișnuiți să editeze sarcini din Outlook, trebuia să înțelegem cum funcționează toate.
Sa dovedit că totul este destul de simplu - editarea sarcinilor este construită pe protocolul [MS-OSALER]: Alerts Interop Protocol Specification.
2 /// Funcția trimite mesajele de sarcină în conformitate cu protocolul MS-OSALER
4 /// curent nod
5 /// textul scrisorii
6 /// pe cine
7 /// Element liste de sarcini
8 ///
9 obiect public [] SendMail (web SPWeb, șir HtmlBody, string To, SPListItem TaskItem)
13 // Această secțiune este generată în funcție de ajutorul din System.Net.MailAddress
15 // Obțineți setările site-ului. Dintre acestea, trebuie să configurați poșta de ieșire
16 SPWebApplication webApp = web.Site.WebApplication;
17 // Creați un mesaj de e-mail
Mail messenger = MailMessage nou ();
20 mess.From = new MailAddress (webApp.OutboundMailSenderAddress, web.Title);
22 mess.ReplyTo = adresa de e-mail nouă (webApp.OutboundMailReplyToAddress);
23 // corpul este în format UTF8
24 mess.BodyEncoding = Codare .UTF8;
25 // și în format HTML
26 mess.IsBodyHtml = adevărat;
27 / / Scrie litera corpului, poate fi absolut orice. Deși gol
28 mess.Body = HtmlBody;
29 // căruia îi trimitem scrisoarea
31 // Codificarea subiectului scrisorii
32 mess.SubjectEncoding = Codare .UTF8;
33 / Și tema însăși poate fi orice.
34 mess.Subject = "Sarcini -" + TaskItem.Title;
36 // În continuare, sunt necesari parametrii care servesc la formarea anteturilor în conformitate cu MS-OSALER
37 // Attachment este o implementare MIME, deci folosim un atașament gol pentru a forma anteturile MIME
38 Atașament at = Atașament nou (noul System.IO, MemoryStream (0), "");
39 at.ContentType = nou Sistem.Net.Mime.ContentType ("text / html; charset = utf-8");
40 at.TransferEncoding = System.Net.Mime.TransferEncoding.QuotedPrintable;
41 // Obțineți domeniul pentru a forma MessageId. Puteți modifica această valoare.
42 domeniu string = webApp.OutboundMailSenderAddress.Remove (0, webApp.OutboundMailSenderAddress.LastIndexOf ( '@'));
// Creați un MessageID. Se compune din partea obligatorie și ID-ul aleatoriu al mesajului
44 // (ultima face serverul de mail, dacă MessageID-ul nu este specificat explicit în anteturi)
45 mess.Headers.Add ("Mesaj-Id." "<3BD50098E401463AA228377848493927" + Guid .NewGuid().ToString( "D" )+domain+ ">„);
47 // Acest parametru poate fi, de asemenea, schimbat, în protocol este specificat ca recomandat (SHOULD), dar unde este utilizat nu am gasit
48 // a făcut, de asemenea, ca și în Sharepoint implicit - descrierea sarcinii
49 mess.Headers.Add ("X-Sharing-Title") Acest .ToBase64 (TaskItem ["Body"] .ToString ()));
50 // Dar aici sunt parametrii care nu pot fi schimbati.
51 mess.Headers.Add ("X-AlertTitle" .Acest .ToBase64 ("System"));
52 mess.Headers.Add ( "X-AlertId" "# 123;. 93A2F525-F664-4B02-9AD6-07851B1381C4 # 125; # 123; 791979F1-2AB1-427D-9722-41B08012172B # 125;");
53 Mess.Headers.Add ("Content-Class". "MSWorkflowTask");
55 Mess.Headers.Add ("X-AlertWebUrl" .Acest .ToBase64 (web.Url));
56 Mess.Headers.Add ("X-AlertServerType". "STS");
58 mess.Headers.Add ( "X-AlertWebSoap" acest .ToBase64 (web.Url + "/_vti_bin/alerts.asmx").);
. 59 mess.Headers.Add ( "X-Sharing-config-Url" "stssync: // sts / ver = 1.1type = taskscmd = add-folderbase-url =" + Uri.EscapeDataString (web.Url) + "? lista-url = "+ Uri.EscapeDataString (" liste / Sarcini ") +" guid = "+ Uri.EscapeDataString (TaskItem.ParentList.ID.ToString (" D „)));
60 mess.Headers.Add ("X-Sharing-Remote-Uid"; TaskItem.ParentList.ID.ToString ("D"));
61 mess.Headers.Add ("X-Sharing-WssBaseUrl". Acest .ToBase64 (web.Url));
62 mess.Headers.Add ("X-Sharing-ItemId") Acest lucru ToBase64 (TaskItem.ID.ToString ()));
64 // Antetul este format, puteți trimite.
66 client SmtpClient = nou SmtpClient (webApp.OutboundMailServiceInstance.Server.Address);
67 client.Credentials = CredentialCache.DefaultNetworkCredentials;
69 // Aceasta este o funcție de testare, deci prelucrarea este extrem de primitivă
70 returnează obiect nou [] # 123; adevărat # 125;
72 captură (Excepție er)
73 # 123; returnați un obiect nou [] # 123; false, er.Message # 125; # 125;
77 șir ToBase64 (string InputString)
// Aproape. Poate că există o implementare mai frumoasă. Dar aceasta funcționează exact.
80 // de asemenea, nu ar fi rău să facem tratarea excepțiilor
81 retur "=? Utf-8? B?" + Sistem. Convertiți .ToBase64String (UTF8Encoding .UTF8.GetBytes (InputString)) + "? =";