也许我们习惯用通过使用System.Net.Mail中的相关类进行邮件的发送。
这其中,需要我们手动指定邮件服务器、发件人地址进行邮件的发送。
而在SharePoint中,这些东西都可以通过应用程序》传出电子邮件来进行设置。那么,如果我们要将.Net.Mail与SharePoint结合起来,该怎么做呢?
关键就在于,如何通过SP的对象模型获取到设置的服务器、地址等数据,下面是我一些小的总结,希望能对大家有所帮助:
//第一步:获取应用程序,因为 传出电子邮件设置是在应用程序中进行的 site.WebApplication
Microsoft.SharePoint.Administration.SPWebApplication webApp = site.WebApplication;
//第二步:获取邮件服务器主机名 webApp.OutboundMailServiceInstance.Server.Name
client.Host = webApp.OutboundMailServiceInstance.Server.Name;
//第三步:获取发送人地址:webApp.OutboundMailSenderAddress;
//第四步:获取邮件编码 :
message.BodyEncoding = System.Text.Encoding.GetEncoding(webApp.OutboundMailCodePage);
----在我目前的工作中,碰到这样一个场景:在某个列表中添加一项列表项后,自动获取列表中的“收件人”和“发件人”字段进行邮件发送。
因此,我写了如下的测试代码,
该测试代码实现:
1、选择列表项字段“收件人”作为邮件收件人,选择列表项字段“抄送发”作为邮件抄送人,值得一提的是,在SP中,这2个被设置成“用户或用户组”后,还可以选择组进行发送目标,这一个非常爽。
2、自动将列表项的附件作为邮件附件发送。
特别注意的是,虽然我此处是写的一个列表事件处理程序,但是,邮件的发送方法以及传出电子邮件设置的获取是通过型的。
运行通过的代码:
- 1using System;
- 2using System.Collections.Generic;
- 3using System.Text;
- 4using System.IO;
- 5using Microsoft.SharePoint;
- 6using Microsoft.SharePoint.Utilities;
- 7using System.Net.Mail;
- 8namespace ListMailEvent
- 9{
- 10 /**//// <summary>
- 11 /// SharePoint 邮件发送示例程序
- 12 /// [url]www.cnblogs.com/mcjeremy[/url]
- 13 /// </summary>
- 14 public class ListMailEvent: SPItemEventReceiver
- 15 {
- 16
- 17 public override void ItemAdded(SPItemEventProperties properties)
- 18 {
- 19 //邮件主题
- 20 string mailSubject = string.Empty;
- 21 //邮件正文
- 22 string mailBody = string.Empty;
- 23
- 24 using (SPSite site = new SPSite(properties.SiteId))
- 25 {
- 26 using (SPWeb web = site.OpenWeb(site.OpenWeb().ID))
- 27 {
- 28 List<string> userEmails = new List<string>(); //收件人
- 29 List<string> choiceUserEmails = new List<string>(); //抄送人
- 30 try
- 31 {
- 32 SPList meetingList = web.Lists[properties.ListId];
- 33 SPListItem meetingItem = meetingList.GetItemById(properties.ListItemId);
- 34 if (null != meetingItem["收件人"])
- 35 {
- 36 SPFieldUserValueCollection values = meetingItem["收件人"] as SPFieldUserValueCollection;
- 37 GetUsersFromUserField(web, userEmails, values);
- 38 }
- 39 if (null != meetingItem["抄送人"])
- 40 {
- 41 SPFieldUserValueCollection values_options = meetingItem["抄送人"] as SPFieldUserValueCollection;
- 42 GetUsersFromUserField(web, choiceUserEmails, values_options);
- 43 }
- 44 if (userEmails.Count <= 0)
- 45 return;
- 46 mailBody="<h1>这是测试的正文</h1>";
- 47 mailSubject="测试邮件"
- 48 SendMail(mailSubject, mailBody, userEmails, choiceUserEmails,site, web, meetingItem);
- 49
- 50 }
- 51 catch(Exception eee)
- 52 {
- 53 return;
- 54 }
- 55 }
- 56 }
- 57 }
- 58 public void GetUsersFromUserField(SPWeb web, List<string> userEmails, SPFieldUserValueCollection values)
- 59 {
- 60 if (values.Count <= 0 || null==values)
- 61 return;
- 62 foreach (SPFieldUserValue userValue in values)
- 63 {
- 64 try
- 65 {
- 66 if (userValue.User != null)
- 67 {
- 68 userEmails.Add(userValue.User.Email);
- 69 }
- 70 else
- 71 {
- 72 //可以选择用户组进行发送
- 73 SPGroup group = web.SiteGroups.GetByID(userValue.LookupId);
- 74 foreach (SPUser user in group.Users)
- 75 {
- 76 userEmails.Add(user.Email);
- 77 }
- 78 }
- 79 }
- 80 catch
- 81 {
- 82 continue;
- 83 }
- 84 }
- 85 }
- 86 public void SendMail(string Title, string Body, List<string> userEmails, List<string> choiceUserEmails,SPSite site, SPWeb web, SPListItem item)
- 87 {
- 88 //获取应用程序,因为 传出电子邮件设置是在应用程序中进行的 site.WebApplication
- 89 Microsoft.SharePoint.Administration.SPWebApplication webApp = site.WebApplication;
- 90 System.Net.Mail.SmtpClient client = new SmtpClient();
- 91 //获取邮件服务器主机名 webApp.OutboundMailServiceInstance.Server.Name
- 92 client.Host = webApp.OutboundMailServiceInstance.Server.Name;
- 93 //设置Credentials
- 94 client.UseDefaultCredentials = true;
- 95 client.DeliveryMethod = SmtpDeliveryMethod.Network;
- 96
- 97 //获取发件人邮件地址 webApp.OutboundMailSenderAddress
- 98 string senderName = webApp.OutboundMailSenderAddress;
- 99
- 100 System.Net.Mail.MailMessage message = new MailMessage();
- 101 message.From=new MailAddress(senderName);
- 102 /**//*添加收件人*/
- 103 foreach(string userEmail in userEmails)
- 104 {
- 105 message.To.Add(userEmail);
- 106 }
- 107 /**//*添加抄送,达到可选效果*/
- 108 foreach(string userEmail in choiceUserEmails)
- 109 {
- 110 message.CC.Add(userEmail);
- 111 }
- 112 message.Subject = Title;
- 113 message.Body = Body;
- 114 try
- 115 {
- 116 //获取传出电子邮件地址中的邮件编码 webApp.OutboundMailCodePage
- 117 message.BodyEncoding = System.Text.Encoding.GetEncoding(webApp.OutboundMailCodePage);
- 118 }
- 119 catch (System.Exception ex) { } message.IsBodyHtml = true;
- 120//获取列表项的附件作为邮件附件一起发送
- 121 if(item.Attachments.Count>0)
- 122 {
- 123 SPAttachmentCollection attaches = item.Attachments;
- 124 for (int i = 0; i < attaches.Count; i++)
- 125 {
- 126 string url = attaches.UrlPrefix + attaches;
- 127 SPFile file = web.GetFile(url);
- 128 Attachment mailAttach = new Attachment(file.OpenBinaryStream(),System.Net.Mime.MediaTypeNames.Application.Octet);
- 129 System.Net.Mime.ContentDisposition cd = mailAttach.ContentDisposition;
- 130 cd.FileName = file.Name; //记得此处
- 131 message.Attachments.Add(mailAttach);
- 132 }
- 133 }
- 134 try
- 135 {
- 136 client.Send(message);
- 137 }
- 138 catch (Exception ex) { }
- 139 }
- 140 }
- 141}
- 142
复制代码文/
McJeremy&Fan