有没有办法查看 System.Net.Mail 是否起作用?

4
我正在使用 System.Net.Mail 发送邮件,代码如下:
MailMessage message = new MailMessage();

message.From = new MailAddress("foo@foo.com");
message.To.Add(new MailAddress("foobar@foobar.com"));


message.Subject = "Hello";
message.Body = "This is a nice body..";

SmtpClient client = new SmtpClient();
client.Send(message);

我怎样才能知道电子邮件是否已发送?我可以使用if语句来检查吗?如果是,它看起来会是什么样子呢?

4个回答

6

您可能希望将SMTP调用包装在try...catch块中,这样您就可以轻松捕获可能发生的任何明显的SMTP相关错误:

try
{
   SmtpClient client = new SmtpClient();
   client.Send(message);
}
catch(Exception exc)
{
   // log the error, update your entry - whatever you need to do 
}

这将处理最明显的错误,例如:

  • SMTP服务器未找到
  • SMTP服务器无响应
  • SMTP拒绝发送(例如,因为您未提供任何或有效凭据)

一旦SMTP服务器收到您的消息,它就不在.NET控制范围内...您无法做太多事情(除了检查SMTP服务器的日志以查找错误)。

如果您想检查并查看您的SMTP邮件是否实际“发送出去”,还可以将以下代码添加到应用程序的app.config(或web.config)中,并让.NET将您的邮件放入一个目录中(作为EML文件):

  <system.net>
    <mailSettings>
      <smtp deliveryMethod="SpecifiedPickupDirectory">
        <specifiedPickupDirectory pickupDirectoryLocation="C:\temp\mails"/>
      </smtp>
    </mailSettings>
  </system.net>

现在你的邮件将会以EML文件的形式存储在C:\temp\mails目录中,你可以查看它们并检查它们是否符合要求。


好的,我通常使用try和catch,但有时我看到人们使用IF,如果某些东西不起作用,那么就这样。 - eski
我认为在异常情况下,TryCatch和IfElse是同义词。 - Amsakanna

2
马克的说法关于使用 try/catch 是正确的。但需要明确的是,SMTP 不能保证消息送达,因此尝试确定实际送达数量是一件非常不准确的事情。有一些软件尝试使用一些技术,如图像漏洞和跟踪链接,但这些方法并不完全可靠。为了避免向垃圾邮件提供商提供过多信息,许多服务器会在出现未知地址或传输错误时悄无声息地失败一条消息。因此,一旦发送后没有异常,您只能希望它成功了。一种有价值的技术是在用户输入电子邮件地址时使用正则表达式进行验证,以帮助避免一些常见的地址问题在影响邮件传递之前被检测到。

0

您可以安装并使用DevNullSmtp服务器 - 它不会发送任何电子邮件,但会记录和显示所有消息和流量。


0

我会考虑使用第三方服务(比如smtp.com)来处理消息传递。这些服务通常提供跟踪API,可以查询成功发送的消息。


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