65.9K
CodeProject 正在变化。 阅读更多。
Home

让 SharePoint 通过需要身份验证的 SMTP 服务器发送邮件

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2009年6月11日

CPOL

1分钟阅读

viewsIcon

49014

downloadIcon

263

在本文中,我讨论了我的解决方案,通过创建一个简单的 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 日 - 初始发布。
使 SharePoint 通过需要身份验证的 SMTP 服务器发送邮件 - CodeProject - 代码之家
© . All rights reserved.