【问题标题】:How to test sending emails from asp.net on development machine?如何在开发机器上测试从 asp.net 发送电子邮件?
【发布时间】:2011-04-29 05:53:51
【问题描述】:

我该如何做到这一点? SMTP 类在开发机器上抛出关于找不到 SMTP 服务器的错误。有没有办法在开发机器上测试发送电子邮件?

【问题讨论】:

  • 发布您用于发送电子邮件的代码,以及您看到的异常/错误消息。那么有人可能会提供帮助......

标签: asp.net-mvc email


【解决方案1】:

我通常通过为 SmtpClient 创建一个包装器类来做到这一点,然后在我的测试中模拟出包装器。这从我的单元测试中删除了实际的邮件客户端/服务器依赖项。包装器本身比较薄,所以我觉得没有必要为它创建测试。通常我会在我的登台环境中对此类事情进行集成级别测试作为探索性测试。暂存环境通常使用生产邮件服务器,但使用“虚假”数据——例如,客户电子邮件地址替换为我自己的。

话虽如此,我希望客户端即使在您的开发系统上也能正常工作,除非您的邮件服务器受防火墙保护或阻止您的开发系统与其通信。您能否详细说明您遇到的错误是什么?

【讨论】:

  • 我认为其他答案提供了一个更简单的解决方案,更适合该问题,即“发送测试电子邮件”而不是“测试发送电子邮件”。
  • @awrigley - 对于自动化测试,同时处理成功和错误条件,模拟肯定比使用真实类更容易。我觉得使用模拟来确保我的代码正确使用该类并进行探索性测试以确保集成正确完成,我感到很自在。如果您有测试需要确保邮件格式正确、邮件中的链接正常工作等,那么可能需要使用某种允许您手动检查邮件的存储和转发机制。注意:模拟并不排除其他类型的测试。
  • tvanfosson,我不怀疑你所说的有效性或质量。但是……这不是问题的答案。同样,问题是关于发送测试电子邮件,而不是测试电子邮件的发送。因此,需要回答这个问题的人会感到困惑。
  • @awrigley - 我明白你的观点这可能是 OP 的意思,但这不是 OP 实际要求的。因此,到达这里的其他任何人都可能会对接受的答案感到困惑,而不是我的。我引用“如何测试从 asp.net 发送电子邮件......”绝对不是“我如何测试为什么我不能从我的机器发送电子邮件。”
  • 我不同意,但就这样吧。他不能从他的机器发送电子邮件的原因是他没有使用 IIS。如果他不知道这一点,那么集成测试的复杂性现在超出了他的技能范围。当我找到 设置时,我记得我的启蒙(和解脱)感,并且毫无疑问,这就是他需要的答案。他应该知道集成测试,但他不知道,至少现在不知道。在跑步之前,我们都必须学会走路。但是,嘿,我们同意不同。
【解决方案2】:

您可以将文件转储到磁盘上,通过configuring System.Net.Mail.SmtpClient 使用SpecifiedPickupDirectory 类型的传递方法,我发现an example on SO

【讨论】:

  • 在为使用 SmtpClient 的类编写单元测试时,我使用我的单元测试运行一个进程内 smtp 服务器。为此,我使用了netDumpster
  • 我必须安装一个 smtp 客户端还是什么?
  • netDumpster 有一些关于如何执行此操作的文档。
  • 严格来说,这不是单元测试,因为您没有将被测代码与其依赖项隔离开来。我认为它更像是一个“孤立的”集成测试,其中您要存根的部分不是框架代码,而是框架使用的外部依赖项。您以一些额外的耦合为代价获得了一点简化——这不一定是坏事,但您应该意识到这种方式测试的架构含义。如果您以后想支持 IM电子邮件通知,您会怎么做?
  • 我同意,严格来说这是一个简单的集成测试,使用单元测试框架运行。
【解决方案3】:

如果没有看到异常,我们无能为力。只要您的开发机器上的详细信息指向正确的 smtp 服务器并具有正确的凭据,那么您的代码就不会成为问题,您应该进一步查看链条。尽管其他一切都正确,但目标机器拒绝了请求,但我有一个例外。在花费了两倍和三倍的时间检查凭据、从我们的服务器发送等之后,我将错误追踪到 McAfee 阻止电子邮件端口 25...

【讨论】:

    【解决方案4】:

    这有几个可能的原因。
    1) 您的代码是否配置为在开发期间使用本地 SMTP 服务器并且您已升级到 Windows 7?您的本地主机上不再有可用的 SMTP 服务器。查找并下载 smtp4dev 以允许您的本地主机捕获发送的电子邮件。
    2) 如果您使用远程 SMTP 服务器,请检查您的 windows 防火墙以确认您被允许发送外发邮件。如果是,请确认您的机器/用户名有权通过该服务器发送邮件。到服务器的快速 telnet:25 应该会让您知道您的连接是否被拒绝。

    【讨论】:

      【解决方案5】:

      肖恩,

      直接来自我的 web.config:

        <smtp deliveryMethod="SpecifiedPickupDirectory">
          <network host="ignored" />
          <specifiedPickupDirectory pickupDirectoryLocation="c:\email_c#" />
        </smtp>
      

      只要能够查看保存到 pickupDirectoryLocation 目录中的“电子邮件”,此功能就可以正常工作。

      试一试……

      【讨论】:

      • 澄清一下,在 web.config 中,这应该进入 -> -> ->
      • jason,很抱歉回复的延迟,周末不在。是的,这是正确的。祝你好运!
      • 我也在尝试将其添加到我的 Asp.Net MVC 5 应用程序的 web.config 中,但没有任何反应,我还需要做些什么吗?
      • jordan - 如果您参考 Jason 的上述评论,那么它会提供您添加该部分的完整路径。即&lt;configuration&gt; -&gt; &lt;system.net&gt; -&gt; &lt;mailSettings&gt; -&gt; &lt;smtp&gt; ....&lt;/smtp&gt;。理论上它应该可以工作。但是请记住,您可能没有该文件夹的用户权限,因此请确保 pickupDirectoryLocation 可以读取/写入以供您登录
      • 如果您使用的是 MVC 模板应用程序,您还希望看到:stackoverflow.com/questions/31523276/…
      【解决方案6】:

      假设“测试发送电子邮件”是指发送测试电子邮件而不是正式/单元测试,我喜欢使用 smtp4dev: http://smtp4dev.codeplex.com/

      正如页面所解释的,它是一个虚拟的 SMTP 服务器,基本上拦截来自应用程序的传出消息,允许您检查这些消息并确保一切按预期工作。这是一个 Windows 应用程序,如果您正在为 ASP.NET 开发,希望这不是问题。

      【讨论】:

        【解决方案7】:

        我知道这是一个旧线程,但我只是偶然发现了这项服务: http://mailtrap.io/

        这真是太棒了。它充当您应用的虚拟 SMTP 服务器,实际上并不发送电子邮件,但允许您在浏览器中(或通过 API)轻松查看它们。

        这是杀手。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多