无法使用SmtpClient发送邮件

4
无法发送邮件。这是我的 C# 源码:
  var to = "me@mycompany.com";
  var subject = "test";
  var body = "test mail";
  var message = new MailMessage(from, to, subject, body);
  var client = new SmtpClient { Credentials = new NetworkCredential("me@mycompany.com", "mypassword") };
  client.Send(message);

这里是App.config文件:

  <system.net>
    <mailSettings>
      <smtp from="me@mycompany.com">
        <network
          host="mail.mycompany.com"
          port="25"
          userName="me@mycompany.com"
          password="mypassword"
        />
      </smtp>
    </mailSettings>
  </system.net>

到目前为止,如果App.config中的主机/端口错误,将抛出异常,但如果用户名/密码错误,则不会抛出异常(显然是出于安全考虑)。然而,我已成功使用与源中相同的用户名/密码从Microsoft Outlook登录。
电子邮件未被接收,既不在Inbox中,也不在Junk文件夹中。如何验证服务器端(考虑到它是microsoftonline.com的一部分)?我错过了什么?请问我做错了什么?

你遇到了哪些异常?请将其作为此查询的一部分包含进来。 - Julius A
1
如果使用“telnet mail.mycompany.com 25”连接会发生什么? 如果您的组织正在运行 Microsoft Exchange,则登录 SMTP 可能不像连接端口 25 并提供用户名和密码那样直接。例如,服务器可能要求您使用 SSL 进行连接。 - Tim Robinson
@Jangwenyi:异常提示主机/端口错误,这是一件好事。然而,当没有抛出异常时,电子邮件仍然无法接收。 - BreakPhreak
@Tim:我之前试过,成功连接了(当然没有认证)。我们有一个持续集成服务器,使用相同的参数连接到mail.mycompany.com,并定期发送邮件。 - BreakPhreak
2
好的,但你确定Outlook直接通过SMTP连接吗?根据我的经验,在连接Exchange时,它使用专有的Exchange RPC协议。 - Tim Robinson
显示剩余3条评论
4个回答

2

我非常确定,如果服务器因任何原因拒绝电子邮件,您的代码将抛出异常。 如果没有,则意味着服务器接受了使用提供的用户名和密码的电子邮件,并且从技术上讲,邮件已成功“发送”。 但是这并不能保证任何人都会收到任何电子邮件。 您需要找出电子邮件服务器正在处理这些电子邮件以及原因。


我已经要求我们的IT团队向microsoftonline支持开放一个工单。然而,作为一名开发人员,与此同时,我仍然想尽可能完成任何需要的任务。 - BreakPhreak
1
我理解你的问题,但不幸的是,如果服务器接受电子邮件但无法投递,则从技术上讲,你的代码是有效的。如果你犯了错误,除非得到支持团队的回复,否则你将无法获得任何有用的信息。如果你正在使用托管服务并尝试通过编程方式发送电子邮件,请做好准备,因为他们可能会告诉你不支持此功能。 - Ben Robinson
CI(持续集成服务器)成功流畅地发送邮件。无论如何,我正在寻找任何一种可以(应该尝试)执行的服务器端验证。无论如何,谢谢。 - BreakPhreak
不确定你所说的“服务器端验证”是指哪个服务器? - Ben Robinson
我的意思是我正在尝试通过交换服务器发送邮件。但正如我之前所写的那样,在与你们交谈时,我得出结论,最好的情况可能是在本地安装一些SMTP服务器,进行检查并忘记它。 - BreakPhreak
是的,那将是最好的解决方案。您将无法使用SMTP服务器验证任何内容,在SMTP协议中没有“我的电子邮件发生了什么”选项。 - Ben Robinson

2
下面的链接提供了一个非常简单的发送电子邮件功能示例,可以从控制台应用程序中调用以进行测试。我知道这个代码有效,因此它可以隔离您代码中的任何问题,并可能更好地揭示问题所在的位置。 SendEmail() - 使用C#创建和发送电子邮件消息

是的,就像我的代码一样,实际上 :) 同时收到了官方的 IT 回复 - 这是一个网络/安全配置问题。 - BreakPhreak

1

我在使用smtp时遇到了防火墙问题。如果你不想与IT合作并且已经安装了Outlook,这是一个解决方法。这种方法将使用您的默认电子邮件发送。您还需要添加一个参考(我正在使用COM下的“Microsoft Outlook 14.0 Object Library”)。

     using Outlook = Microsoft.Office.Interop.Outlook;

     private void sendEmail(string DistributionList, string AttachmentDestination)
      {
        //new outlook instance
        Outlook.Application app = new Outlook.Application();

        //new mail object
        Outlook.MailItem mail = app.CreateItem(Outlook.OlItemType.olMailItem);

        mail.Subject = "This is coming from a C# script";
        mail.To = DistributionList; //your distribution list "email@something.com"
        mail.Body = "This is the body of an email from a C# script";
        mail.Attachments.Add(AttachmentDestination); //location of attachment (can be ommitted)
        mail.Send();
        app.Quit();
    }

这已被证明是极不可靠的。 - Matt Farguson

-2
收到IT团队的回复 - 这是一个配置/安全问题。已经由IT解决。非常感谢大家。

1
好的,但是怎么做呢?能够解释一下就更好了。这个答案除了你以外没有被任何人接受。 - cr0ss

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