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、自动将列表项的附件作为邮件附件发送。
特别注意的是,虽然我此处是写的一个列表事件处理程序,但是,邮件的发送方法以及传出电子邮件设置的获取是通过型的。
运行通过的代码:
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 ListMailEvent9
{10
/// <summary>11
/// SharePoint 邮件发送示例程序12
/// www.cnblogs.com/mcjeremy13
/// </summary>14
public class ListMailEvent: SPItemEventReceiver15
{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
try31
{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
try65
{66
if (userValue.User != null)67
{68
userEmails.Add(userValue.User.Email);69
}70
else71
{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
catch81
{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.WebApplication89
Microsoft.SharePoint.Administration.SPWebApplication webApp = site.WebApplication;90
System.Net.Mail.SmtpClient client = new SmtpClient();91
//获取邮件服务器主机名 webApp.OutboundMailServiceInstance.Server.Name92
client.Host = webApp.OutboundMailServiceInstance.Server.Name;93
//设置Credentials94
client.UseDefaultCredentials = true;95
client.DeliveryMethod = SmtpDeliveryMethod.Network;96

97
//获取发件人邮件地址 webApp.OutboundMailSenderAddress98
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
try115
{ 116
//获取传出电子邮件地址中的邮件编码 webApp.OutboundMailCodePage117
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
try135
{136
client.Send(message);137
}138
catch (Exception ex) { }139
}140
}141
}142

以上代码,纯属原创。
欢迎转载,但请注明出处:http://www.cnblogs.com/mcjeremy
心静似高山流水不动,心清若巫峰雾气不沾。
</h3>



浙公网安备 33010602011771号