让 SharePoint 通过需要身份验证的 SMTP 服务器发送邮件
在本文中,我讨论了我的解决方案,通过创建一个简单的 SMTP 中继服务器,使 SharePoint 邮件能够与经过身份验证的 SMTP 服务器协同工作。
引言
这是一个小型 Windows 服务,它处理来自 SharePoint 的 SMTP 流量,构造一封电子邮件,并将其发送到需要身份验证的远程 SMTP 服务器。
背景
我一直难以使 WSS 3.0 发送电子邮件到经过身份验证的 SMTP 服务器。我尝试了 IIS 中包含的 SMTP 服务器,但效果不佳。因此,在找到 处理 SMTP 命令的代码 后,我提出了这个快速解决方案。我认为这可能是一个常见问题。
使用代码
只需在您的 SharePoint 服务器上安装 SMTPRelaySetup.msi 并编辑配置文件即可。
<configuration>
<appsettings>
<add value="192.168.1.1" key="AllowedIPAddress" />
<add value="Sharepoint Mail" key="MailFromName" />
<add value="mail@sharepoint.com" key="MailFromAddress" />
<add value="mail.sharepoint.com" key="RelayServer" />
<add value="mail@sharepoint.com" key="RelayServerUser" />
<add value="p@ssw0rd" key="RelayServerPassword" />
</appsettings>
</configuration>
该解决方案包含四个项目。有一个 WSSMailRelay 库项目,其中包含大部分功能,有两个项目引用此库。WSSMailRelayConsole 项目是一个控制台应用程序,用于测试目的。WSSMailRelayService 项目是实际的 Windows 服务。最后,WSSMailRelaySetup 是构建 MSI 安装程序的设置项目。
我讨厌调试 Windows 服务,所以每当我开发一个时,我总是将大部分代码放入一个单独的库中。然后我从控制台应用程序引用它,并使用它来专门进行调试。相同的库也引用在 Windows 服务中。
关注点
我使用了 Ivar Lumi 的 SMTP 服务器来处理 SMTP 命令。您可以在这里查看它。无论如何,我所做的一切就是为他的 SMTP 服务器生成的所有各种事件创建处理程序,并启动服务器。
最有趣的部分是处理 StoreMessage
事件时。我所做的一切就是从传递到事件参数 e
中的所有数据中创建一个标准的 MailMessage
。
void smtpServer_StoreMessage(object sender, LumiSoft.Net.SMTP.Server.NewMail_EventArgs e)
{
Console.WriteLine("Mail From: " + e.MailFrom);
foreach (string email in e.MailTo)
{
Console.WriteLine("Mail To: " + email);
}
StreamReader sr = new StreamReader(e.MessageStream);
string rawBody = sr.ReadToEnd();
Console.WriteLine("Message: " + rawBody);
Console.WriteLine("");
MailMessage message = new MailMessage();
message.From = new MailAddress(e.MailFrom);
foreach (string email in e.MailTo)
{
message.To.Add(email);
}
message.Headers.Clear();
foreach (string line in rawBody.Split(
new string[] { "\r\n" }, StringSplitOptions.None))
{
if (line == string.Empty)
break;
if (line.Contains(":"))
{
string[] headerPair = line.Split(':');
switch (headerPair[0].Trim())
{
case "Subject":
message.Subject = headerPair[1];
break;
case "Reply-To":
message.ReplyTo = new MailAddress(headerPair[1]);
break;
case "From":
message.From = new MailAddress(
ConfigurationManager.AppSettings["MailFromAddress"],
ConfigurationManager.AppSettings["MailFromName"]);
break;
case "Content-Type":
if (headerPair[1].Contains("text/html"))
message.IsBodyHtml = true;
else
message.IsBodyHtml = false;
break;
default:
message.Headers.Add(headerPair[0].Trim(), headerPair[1].Trim());
break;
}
}
}
message.Body = rawBody.Split(new string[] { "\r\n\r\n" },
StringSplitOptions.None)[1];
SmtpClient emailClient = new
SmtpClient(ConfigurationManager.AppSettings["RelayServer"]);
System.Net.NetworkCredential SMTPUserInfo = new
System.Net.NetworkCredential(ConfigurationManager.AppSettings["RelayServerUser"],
ConfigurationManager.AppSettings["RelayServerPassword"]);
emailClient.UseDefaultCredentials = false;
emailClient.Credentials = SMTPUserInfo;
emailClient.Send(message);
}
历史
- 2009 年 6 月 11 日 - 初始发布。