沈阳格力专卖店 发表于 2015-9-26 09:54:13

SharePoint 中调用传出电子邮件中的邮件服务器及地址发送邮件

  也许我们习惯用通过使用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    ///www.cnblogs.com/mcjeremy
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;
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  
  
  以上代码,纯属原创。
欢迎转载,但请注明出处:http://www.cnblogs.com/mcjeremy
页: [1]
查看完整版本: SharePoint 中调用传出电子邮件中的邮件服务器及地址发送邮件