sharepoint 发送邮件 带附件

【转http://www.cnblogs.com/McJeremy/archive/2009/07/02/1515441.html

也许我们习惯用通过使用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[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[i];
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
复制代码
posted @ 2012-05-28 22:52  小师傅  阅读(718)  评论(0编辑  收藏  举报