当前位置: 首页 > 编程语言 > C#

我可以在调用client.Send()之前测试SmtpClient吗?Share

时间:2023-04-10 15:01:30 C#

我可以在调用client.Send()之前测试SmtpClient吗?这与我前几天提出的有关如何发送电子邮件的问题有关。我的新相关问题是......如果我的应用程序的用户在防火墙后面或者为什么client.Send(mail)行不起作用......在行之后:SmtpClientclient=newSmtpClient("mysmtpserver.com",我的端口号);client.Credentials=newSystem.Net.NetworkCredential("myusername.com","mypassword");在尝试发送之前我可以做些什么来测试客户端?我想把它放在一个try/catch循环中,但我宁愿做一个测试,然后弹出一个对话框说:无法访问smtp或类似的东西。(我假设我,而不是我的应用程序用户,有能力调整他们的防火墙设置。例如......他们在工作时安装应用程序并且在工作时无法控制他们的互联网)-Adeena我认为这个在某些情况下,异常处理是首选解决方案。在您尝试之前,您真的不知道它会起作用,失败是一个例外。编辑:您需要处理SmtpException。它有一个StatusCode属性,它是一个枚举,会告诉您Send()失败的原因。我认为,如果您正在测试SMTP,那么您正在寻找一种无需实际发送电子邮件即可验证您的配置和网络可用性的方法。任何方式都是我需要的,因为没有虚拟电子邮件是有意义的。在开发人员的建议下,我想出了这个解决方案。一个小帮手类,用法如下。我在发送电子邮件的服务的OnStart事件中使用它。注意:TCP套接字归功于PeterA.Bromberg,网址为http://www.eggheadcafe.com/articles/20030316.asp,配置读取的人:从app.config访问system.net设置在C#中以编程方式帮助程序:publicstaticclassSmtpHelper{//////通过发送HELO命令测试smtp连接/////////publicstaticboolTestConnection(Configurationconfig){MailSettingsSectionGroupmailSettings=config.GetSectionGroup("system.net/mailSettings")作为MailSettingsSectionGroup;if(mailSettings==null){thrownewConfigurationErrorsException("无法读取system.net/mailSettings配置节组。");}returnTestConnection(mailSettings.Smtp.Network.Host,mailSettings.Smtp.Network.Port);}//////通过发送HELO命令测试smtp连接/////////publicstaticboolTestConnection(stringsmtpServerAddress,intport){IPHostEntryhostEntry=Dns.GetHostEntry(smtpServerAddress);IPEndPointendPoint=newIPEndPoint(hostEntry.AddressList[0],port);使用(套接字tcpSocket=newSocket(endPoint.AddressFamily,SocketType.Stream,ProtocolType.Tcp)){//尝试连接并测试代码的响应220=successtcpSocket.Connect(endPoint);如果(!CheckResponse(tcpSocket,220)){返回false;}//发送HELO并测试代码250的响应=正确的响应SendData(tcpSocket,string.Format("HELO{0}rn",Dns.GetHostName()));如果(!CheckResponse(tcpSocket,250)){返回false;}//如果我们到达这里就是我们可以连接到smtp服务器returntrue;}}privatestaticvoidSendData(Socketsocket,stringdata){byte[]dataArray=Encoding.ASCII.GetBytes(数据);socket.Send(dataArray,0,dataArray.Length,SocketFlags.None);}privatestaticboolCheckResponse(Socketsocket,intexpectedCode){while(socket.Available==0){System.Threading.Thread.Sleep(100);}byte[]responseArray=newbyte[1024];socket.Receive(responseArray,0,socket.Available,SocketFlags.None);字符串responseData=Encoding.ASCII.GetSt响铃(响应数组);intresponseCode=Convert.ToInt32(responseData.Substring(0,3));如果(responseCode==expectedCode){返回真;}返回假;}}用法:if(!SmtpHelper.TestConnection(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None))){thrownewApplicationException("Thesmtpconnectiontestfailed");捕捉SmtpException并且它会告诉你它是否因为无法连接到服务器而失败如果你想检查你是否可以打开服务器连接,请使用TcpClient并捕捉SocketExceptions。虽然我看不出这样做有什么好处,只是从Smtp.Send中发现了问题。在发送电子邮件之前,您可以尝试发送HELO命令来测试服务器是否存在并正在运行。如果你想检查用户是否存在,你可以尝试使用VRFY命令,但出于安全原因,这通常在SMTP服务器上被禁用。进一步阅读:http://the-welters.com/professional/smtp.html希望这有帮助。我也有这个需求。下面是我做的库(发送HELO检查HELO还是250):以上是C#学习教程:CanItesttheSmtpClientbeforecallingclient.Send()?如果分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注——usingSMTPConnectionTest;if(SMTPConnection.Ok("myhost",25)){//准备就绪}if(SMTPConnectionTester.Ok())//从.config中读取设置{//准备就绪}privateboolisValidSMTP(stringhostName){boolhostAvailable=false;尝试{TcpClientsmtpTestClient=newTcpClient();smtpTestClient.Connect(主机名,25);if(smtpTestClient.Connected)//连接建立{NetworkStreamnetStream=smtpTestClient.GetStream();StreamReadersReader=newStreamReader(netStream);if(sReader.ReadLine().Contains("220"))//主机可通信{hostAvailable=true;}smtpTestClient.Close();}}catch{//一些动作,比如写入错误日志}returnhostAvailable;}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: