【转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、自动将列表项的附件作为邮件附件发送。
特别注意的是,虽然我此处是写的一个列表事件处理程序,但是,邮件的发送方法以及传出电子邮件设置的获取是通过型的。
运行通过的代码:
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4
using System.IO;
5
using Microsoft.SharePoint;
6
using Microsoft.SharePoint.Utilities;
7
using System.Net.Mail;
8
namespace 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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
97
//获取发件人邮件地址 webApp.OutboundMailSenderAddress
98
string senderName = webApp.OutboundMailSenderAddress;
99![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
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