使用本地SMTP发送邮件

26

我正在尝试在IIS上设置SMTP服务器以便发送邮件。这个SMTP服务器应该被C#中的ASP.NET代码使用。

之前我使用gmail smtp,提供了smtp.gmail.com作为主机名和安全端口以及我的gmail uid/pwd。那个方法很好用。以下是我用来实现它的代码:

SmtpClient smtpClient = new SmtpClient();
smtpClient.UseDefaultCredentials = false;
smtpClient.Host = "smtp.gmail.com";
smtpClient.Port = 587;
smtpClient.Credentials = new NetworkCredential(uname,pwd);
smtpClient.EnableSsl = true;
smtpClient.Send(mailMessage);

现在我计划在IIS上使用本地 SMTP 服务器,在 UseDefaultCredentials 和 Credentials 参数中应该给什么值。 因为它在端口25上,所以我将为 EnableSsl 赋值false。

此外,最简单的SMTP虚拟服务器配置是什么?

6个回答

30

当您使用本地IIS SMTP服务时,请将DeliveryMethod设置为PickupDirectoryFromIis。例如:

  smtpClient.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;

这种方法完全绕过了网络层,直接将消息写入磁盘。它比经过啰嗦的SMTP协议要快得多。

当你使用上述代码时,这意味着你可以摆脱代码中的这部分:

smtpClient.UseDefaultCredentials = false;
smtpClient.Host = "smtp.gmail.com";
smtpClient.Port = 587;
smtpClient.Credentials = new NetworkCredential(uname,pwd);
smtpClient.EnableSsl = true;

4
这是正确的使用本地IIS接收目录的答案。由于它只是写入一个文件,因此不会使用任何凭据,而IIS将直接发送它给您。 - Jeff Tucker

21

我认为在本地主机上,你可以使用:

SmtpClient smtpClient = new SmtpClient();
smtpClient.UseDefaultCredentials = true;
smtpClient.Send(mailMessage);

3
你是否已经启动了IIS SMTP服务? - Natim
是的,但它仍然不起作用(我有win8,但据我所知,我已正确激活了一切)。我应该像这样写 "<smtp deliveryMethod="Network" from="..."><network defaultCredentials="true" host="localhost" port="25" /></smtp>" 到Web配置文件中吗?如果我只写这三行,它仍然是“未知的SMTP主机”。 - lenden
1
IIS不再具有SMTP功能,已被移除。 - Sameer Alibhai

3

这取决于您如何配置smtp服务器。您可能根本不需要使用任何凭据,只需将服务器配置为仅接受本地连接即可。


@Joel: 我的SMTP服务器设置如下: 身份验证:匿名访问 IP地址:所有未分配的 出站安全性:匿名访问好奇地问,这是否是发送邮件而无需凭据的正确配置。 - pencilslate
那是一个适合在 Serverfault 上提问的问题。 - Joel Coehoorn

2
如果你想在本地测试电子邮件,只需下载并安装Papercut工具,链接为https://papercut.codeplex.com/,然后将主机名更改为localhost。Papercut可以捕获使用localhost发送的所有电子邮件。
  smtpClient.UseDefaultCredentials = false;
    smtpClient.Host = "localhost";
    smtpClient.Port = 587;
    smtpClient.Credentials = new NetworkCredential(uname,pwd);
    smtpClient.EnableSsl = true;

smtp4dev是一款专为开发人员设计的本地SMTP服务器。 - Birey
同时也是TestMailServerTool: 原始下载链接似乎已经损坏: https://toolheap.com/test-mail-server-tool/备用链接: https://github.com/Serjster/TestMailServerTool - Serj Sagan
我已经有了主机和凭据,但对于我来说(使用Sendgrid),解决方法是添加EnableSsl和587端口。 - Christopher

2

您尝试启用中继了吗?

找到IIS6管理器(我发现搜索IIS可能会返回2个结果),进入SMTP服务器属性,然后进入“访问”选项卡,再点击中继按钮。

然后,您可以选择全部或仅允许某些IP,例如127.0.0.1。

SMTP Relay


我正在使用CDOSYS,从设置了虚拟服务器的服务器发送电子邮件非常顺利,但是当我尝试从工作站使用我的实用程序时,会收到“传输无法连接到服务器”的消息。有什么想法吗?我需要在我的代码中更改什么,以便工作站也能够使用此虚拟SMTP服务器并发送电子邮件。 - Almas Mahfooz

1
Tx Natim,你所说的对我很有帮助。我们现在已经将内部网络应用程序与我们的Exchange 2007服务器进行了集成认证:
Dim msg As New MailMessage()
Dim smtp As SmtpClient

msg.From = New MailAddress(strFrom)
msg.To.Add(strTo)
msg.Subject = strSubject
msg.Body = strBody

smtp = New SmtpClient("ServerName")
smtp.UseDefaultCredentials = True
smtp.Send(msg) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接