. net TcpClient和SmtpClient不能连接到我的Smtp服务器
本文关键字:我的 Smtp 服务器 连接 不能 TcpClient SmtpClient net | 更新日期: 2023-09-27 18:10:37
我有一个方法,应该连接到Smtp服务器,看看它是否在线。此方法适用于测试许多邮件服务器,但不是所有邮件服务器。代码如下,但是失败发生在…
客户端。连接(strMailServer intPort);
…在与服务器对话的逻辑开始之前。它根本无法连接。我确信我连接了正确的IP和端口(25),并且我使用第三方网站(如mxtoolbox)测试了相同的服务器IP,并取得了成功。这台服务器正在接收来自万维网的常规流量。只有。net似乎无法连接。我已经查看了防火墙规则,并使用WireShark查看服务器上发生了什么,但我从未看到任何来自测试运行的传入数据包。防火墙设置为允许任何人在所有接口上连接到端口25。
我还使用SmtpClient运行如下所示的类似测试,它也失败了。
var client = new System.Net.Mail.SmtpClient(strMailServer, intPort);
client.Send("test@mydomain.com", "test@mydomain.com", "test message", "This is meant to test an SMTP server to see if it is online, it expects the message to be rejected.");
这里的错误堆栈导致与我的TcpClient尝试相同的底层错误。SocketException:{"无法建立连接,因为目标机器主动拒绝了xxx.xxx.xxx.xxx:25"}
为什么世界上的每个人都能连接到这个服务器…除了我的笔记本电脑…我认为这不是防火墙的问题。
帮助!
public static bool TestMailServer(string strMailServer, int intPort, out string strResponse)
{
try
{
try
{
//First I'll try a basic SMTP HELO
using (var client = new TcpClient())
{
client.Connect(strMailServer, intPort);
// As GMail requires SSL we should use SslStream
// If your SMTP server doesn't support SSL you can
// work directly with the underlying stream
using (var stream = client.GetStream())
{
using (var writer = new StreamWriter(stream))
using (var reader = new StreamReader(stream))
{
writer.WriteLine("EHLO " + strMailServer);
writer.Flush();
strResponse = reader.ReadLine();
if (strResponse == null)
throw new Exception("No Valid Connection");
stream.Close();
client.Close();
if (F.StartsWith(strResponse, "220"))
return true;
else
return false;
}
}
}
}
catch (Exception ex)
{
//If the above failed, I'll try with SSL
using (var client = new TcpClient())
{
//var server = "smtp.gmail.com";
//var port = 465;
//client.SendTimeout = 10000;
//client.ReceiveTimeout = 10000;
client.Connect(strMailServer, intPort);
// As GMail requires SSL we should use SslStream
// If your SMTP server doesn't support SSL you can
// work directly with the underlying stream
using (var stream = client.GetStream())
using (var sslStream = new SslStream(stream))
{
sslStream.AuthenticateAsClient(strMailServer);
using (var writer = new StreamWriter(sslStream))
using (var reader = new StreamReader(sslStream))
{
writer.WriteLine("EHLO " + strMailServer);
writer.Flush();
strResponse = reader.ReadLine();
if (strResponse == null)
throw new Exception("No Valid Connection");
stream.Close();
client.Close();
if (F.StartsWith(strResponse, "220"))
return true;
else
return false;
// GMail responds with: 220 mx.google.com ESMTP
}
}
}
}
}
catch (Exception ex)
{
strResponse = ex.Message;
return false;
}
}
"目标机器主动拒绝它"意味着端口25没有监听-你发送了一个SYN包,收到的是RST而不是SYN/ACK。
如果您在wireshark捕获中甚至没有看到SYN,可能您的笔记本电脑错误地解析了名称。您是否通过名称或IP连接到服务器?你有没有试过一个简单的
telnet mailhost 25
看看是否有关联?
通常为了防止SMTP服务器发送匿名电子邮件,它们只有在对入站ip地址进行反向DNS查找成功后才会接受连接。我相信反向DNS查找您的家庭地址失败了,所以它已经断开了连接。
答案很简单,我打了自己一巴掌,我意识到…我的ISP正在阻止端口25上的所有连接,入站和出站。我一搬到另一个地方,一切都好起来了。咄! !
http://www.cox.com/residential/support/internet/article.cox?articleid=cacf82f0 - 6407 - 11 - df - ccef - 000000000000
对于任何可能需要它的人,这里是我的SMTPTest类,它将探测服务器的SMTP功能。我用它来监视我的服务器,报告中断,并验证用户输入的服务器信息。
public struct SMTPTestResult
{
public string Server;
public bool Found;
public bool OriginalPortSuccess;
public int FinalPort;
public bool UsedSSL;
public string Response;
}
public class SMTPTest
{
public static SMTPTestResult TestMailServer(string MailServer)
{
return TestMailServer(MailServer, 25, true);
}
public static SMTPTestResult TestMailServer(string MailServer, int Port, bool TryOtherPorts)
{
SMTPTestResult result = new SMTPTestResult();
result.Server = MailServer;
if (AttemptMailServer(MailServer, Port, false, out result.Response))
{
//First try the requested port, without SSL.
result.Found = true;
result.UsedSSL = false;
result.OriginalPortSuccess = true;
result.FinalPort = Port;
return result;
}
else if (AttemptMailServer(MailServer, Port, true, out result.Response))
{
//Try the requested port, with SSL.
result.Found = true;
result.UsedSSL = true;
result.OriginalPortSuccess = true;
result.FinalPort = Port;
return result;
}
else if (TryOtherPorts && Port != 465 && AttemptMailServer(MailServer, 465, true, out result.Response))
{
//Try port 465 with SSL
result.Found = true;
result.UsedSSL = true;
result.OriginalPortSuccess = false;
result.FinalPort = 465;
return result;
}
else if (TryOtherPorts && Port != 25 && AttemptMailServer(MailServer, 25, false, out result.Response))
{
//Try port 25, without SSL.
result.Found = true;
result.UsedSSL = false;
result.OriginalPortSuccess = false;
result.FinalPort = 25;
return result;
}
else if (TryOtherPorts && Port != 25 && AttemptMailServer(MailServer, 25, true, out result.Response))
{
//Try port 25, with SSL.
result.Found = true;
result.UsedSSL = true;
result.OriginalPortSuccess = false;
result.FinalPort = 25;
return result;
}
else if (TryOtherPorts && Port != 587 && AttemptMailServer(MailServer, 587, false, out result.Response))
{
//Try port 587, without SSL.
result.Found = true;
result.UsedSSL = false;
result.OriginalPortSuccess = false;
result.FinalPort = 587;
return result;
}
else if (TryOtherPorts && Port != 587 && AttemptMailServer(MailServer, 587, true, out result.Response))
{
//Try port 587, with SSL.
result.Found = true;
result.UsedSSL = true;
result.OriginalPortSuccess = false;
result.FinalPort = 587;
return result;
}
else
{
result.Found = false;
result.OriginalPortSuccess = false;
result.FinalPort = Port;
return result;
}
}
private static bool AttemptMailServer(string strMailServer, int intPort, bool blnSSL, out string strResponse)
{
try
{
if(!blnSSL)
{
//I'll try a basic SMTP HELO
using (var client = new TcpClient())
{
client.Connect(strMailServer, intPort);
using (var stream = client.GetStream())
{
using (var writer = new StreamWriter(stream))
using (var reader = new StreamReader(stream))
{
writer.WriteLine("EHLO " + strMailServer);
writer.Flush();
strResponse = reader.ReadLine();
if (strResponse == null)
throw new Exception("No Valid Connection");
stream.Close();
client.Close();
if (strResponse.StartsWith("220"))
return true;
else
return false;
}
}
}
}
else
{
//I'll try with SSL
using (var client = new TcpClient())
{
client.Connect(strMailServer, intPort);
// As GMail requires SSL we should use SslStream
// If your SMTP server doesn't support SSL you can
// work directly with the underlying stream
using (var stream = client.GetStream())
using (var sslStream = new SslStream(stream))
{
sslStream.AuthenticateAsClient(strMailServer);
using (var writer = new StreamWriter(sslStream))
using (var reader = new StreamReader(sslStream))
{
writer.WriteLine("EHLO " + strMailServer);
writer.Flush();
strResponse = reader.ReadLine();
if (strResponse == null)
throw new Exception("No Valid Connection");
stream.Close();
client.Close();
if (strResponse.StartsWith("220"))
return true;
else
return false;
// GMail responds with: 220 mx.google.com ESMTP
}
}
}
}
}
catch (Exception ex)
{
strResponse = ex.Message;
return false;
}
}
}