问题现象就是一个应用系统无法发送邮件了,其实就是把那个系统所在的虚机导出并换了一个IP地址。
另外,我手头拿到一段代码,如下:

    Dim ConfigureMessage As New System.Net.Mail.MailMessage

    Dim ConfigureMail As New System.Net.Mail.SmtpClient

    ConfigureMessage.To.Add(EmailTo)

    ConfigureMessage.Subject = "Testing Alert"

    ConfigureMessage.Body = AlertBody

    ConfigureMail.Host = "一台邮件服务器的FQDN"

    ConfigureMail.UseDefaultCredentials = False

    ConfigureMail.Send(ConfigureMessage)

我把一些代码给去掉了,没多大用,然后就说以前是可以发邮件的,现在发不了了。

我解决问题的第一反应是:
利用PowerShell自带的命令Test-NetConnection

Test-NetConnection smtp.啥啥服务器的FQDN 25

返回的是对方的SMTP端口是打开的,没有问题。

然后我来研究他这段代码,感觉写得太粗糙了。后来我从微软官网找到一些样例,如下:
https://docs.microsoft.com/en-us/dotnet/api/system.net.mail.smtpclient.send?view=net-5.0
public static void CreateTestMessage2(string server)
{
string to = "jane@contoso.com";
string from = "ben@contoso.com";
MailMessage message = new MailMessage(from, to);
message.Subject = "Using the new SMTP client.";
message.Body = @"Using this new feature, you can send an email message from an application very easily.";
SmtpClient client = new SmtpClient(server);
// Credentials are necessary if the server requires the client
// to authenticate before it will send email on the client's behalf.
client.UseDefaultCredentials = true;

try
{
    client.Send(message);
}
catch (Exception ex)
{
    Console.WriteLine("Exception caught in CreateTestMessage2(): {0}",
        ex.ToString());
}

}

代码里一定要对怀疑有问题的地方用上 Try catch,这样可以捕获异常,然后通过分析异常就知道是代码调用有问题还是对端的SMTP服务器有问题。

其实,这个问题出在SMTP中继配置上,需要在EXCHANGE中的SMTP内部中继,把运行这个代码的服务器IP地址加上去。

关于 如何配置Exchange Server 2016 SMTP中继,请参考以下文章,链接地址如下:
https://www.sysgeek.cn/exchange-server-2016-smtp-relay/

这次遇到这种问题不能解决的原因应该如下:
第一,我痛恨那段不健壮的代码,写成那样也不改
第二,那个工厂的网络方面核心设备由老外控制,我都是在猜测网络怎么配置的,所以容易想偏了。
第三,基本把EXCHANGE那些管理给忘了,其实当时应该把这个学得挺明白的,总也不用就忘了。
第四,一定要从全局了解这个架构,否则只是看片断内容,不能从整体来考虑问题

最近一直在做python的东西还有sharepoint框架,我脑袋都不够用了。能把一个框架理解了再灵活运用,非常难的。