Sending Email over VPN SmtpException net_io_connectionclosed - c#

I am sending an email from a WPF application. When sending as a domain user on the network, the emails sends as expected. However, when I attempt to send email over a VPN connection, I get the following exception:
Exception:
System.Net.Mail.SmtpException: Failure sending mail. ---> System.IO.IOException: Unable to read data from the transport connection: net_io_connectionclosed.
at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine)
at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine)
at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller)
at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)
at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)
at System.Net.Mail.SmtpClient.GetConnection()
at System.Net.Mail.SmtpClient.Send(MailMessage message)
I have tried using impersonation as well as setting the Credentials on the SmtpClient. Neither seem to work:
using (new ImpersonateUser("myUser", "MYDOMAIN", "myPass"))
{
var client = new SmtpClient("myhost.com");
client.UseDefaultCredentials = true;
client.Credentials = new NetworkCredential("myUser", "myPass", "MYDOMAIN");
client.Send(mailMessage);
}
I've also tried using Wireshark to view the message over the wire, but I don't know enough about SMTP to know what I'm looking for.
One other variable is that the machine I'm using on the VPN is Vista Business and the machine on the network is Win7. I don't think it's related, but then I wouldn't be asking if I knew the issue! :)
Any ideas?

I solved this by connecting outlook on a VPN machine to the Exchange server. The IP address automatically resolved to a different server name than the one I was trying. Evidently the exchange server was only available over VPN through the other URL.

Related

Azure Functions - Ping Restrictions?

I am writing an Azure Function to ping a particular host to check response times using the System.Net.NetworkInformation.Ping class. I get a generic exception when calling Ping.Send, however this works fine locally.
Are there restrictions on network calls made outbound from Azure Functions?
The exception I get is simply:
Could not ping: An exception occurred during a Ping request.
at System.Net.NetworkInformation.Ping.Send(IPAddress address, Int32 timeout, Byte[] buffer, PingOptions options)
at System.Net.NetworkInformation.Ping.Send(String hostNameOrAddress, Int32 timeout, Byte[] buffer, PingOptions options
As ICMP protocol is not permitted through the Azure, you will not be able to ping an Azure VM from the internet, and from within the Azure VM, you are unable to ping internet locations.
To test connectivity, it is recommended to do a port ping. While Ping.exe uses ICMP, other tools such as PsPing, Nmap, or Telnet which allows you to test connectivity to a specific TCP port.
It is nicely explained in this post - https://blogs.msdn.microsoft.com/mast/2014/06/22/use-port-pings-instead-of-icmp-to-test-azure-vm-connectivity/

SendGrid Unable to read data from the transport connection: net_io_connectionclosed

I am getting an exception thrown sending an email via SendGrid since recently upgrading a project to .net 4.5.2
Failure sending mail. System.IO.IOException: Unable to read data from
the transport connection: net_io_connectionclosed. at
System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer,
Int32 offset, Int32 read, Boolean readLine) at
System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader
caller, Boolean oneLine) at
System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader
caller) at System.Net.Mail.CheckCommand.Send(SmtpConnection conn,
String& response) at
System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command,
MailAddress from, Boolean allowUnicode) at
System.Net.Mail.SmtpTransport.SendMail(MailAddress sender,
MailAddressCollection recipients, String deliveryNotify, Boolean
allowUnicode, SmtpFailedRecipientException& exception) at
System.Net.Mail.SmtpClient.Send(MailMessage message) at
System.Net.Mail.SmtpClient.Send(MailMessage message) at
SendGridMail.Transport.SMTP.SmtpWrapper.Send(MailMessage mime) at
SendGridMail.Transport.SMTP.Deliver(ISendGrid message) at
ReACT.Classes.Business.Helpers.Email.Send(String[] to, String[]
toNames, Boolean ccToSender, String[] ccTo, String[] ccToNames, String
subject, String body, Boolean isHtml, String SMTPServer, String
EmailUserName, String EmailPassword, String EmailPort, String
SystemEmailAddress, String SystemEmailName, String& FriendlyException,
String& TechnicalException)
The code used to send the email via SMTP using the SendGrid service is as follows -
SendGridMail.SendGrid vEmailMessage = SendGridMail.SendGrid.GetInstance(vMailMessage.From, vMailMessage.To.ToArray(), vMailMessage.CC.ToArray(), new MailAddress[0], vMailMessage.Subject, vMailMessage.Body, vMailMessage.Body);
NetworkCredential vCredentials = new NetworkCredential(this.ApplicationSettings.EmailUserName, this.ApplicationSettings.EmailPassword);
var vTransport = SMTP.GetInstance(vCredentials);
//Send email message
vTransport.Deliver(vEmailMessage);
The credentials are correct and confirmed as working correctly. This problem has only started since the .net framework upgrade and unfortunately, we cannot downgrade back to target .net 4
I had the same problem. I had the wrong username. I thought this was the ApiKey that I created for this, I even tried the email with and without domain. The solution was that the SMTP username is "apikey", as in that exact string, not your apikey, not the internal identifier nor the 'friendly' name you gave it. Just the exact 6 letters of "apikey".
For those experiencing the same exception when sending emails via SendGrid, it turned out that a new piece of functionality was passing an incorrect password to the SendGrid API resulting in a AuthenticationFailedException: 535 Authentication failed: Bad username / password.
I discovered this after downloading Wireshark, finding & inspecting the SendGrid packets to find the data sent to the API was incorrect under a certain condition. The SendGrid API then returned a rather helpful AuthenticationFailedException exception however when this exception was caught in a try catch block in code, the actual exception was masked and came out as the aforementioned net_io_connectionclosed IOException
I fixed the bug in our new application and the issue went away. If only the actual exception being thrown by the SendGrid API was the one caught in the try catch block!
const string username="apikey";
string pass = "xxxxxxxxxxxxxxxxxxxxx" // login sendgrid.com => create ApiKey
NetworkCredential vCredentials = new NetworkCredential("apikey", pass);
I have followed this guide
Link: https://sendgrid.com/docs/API_Reference/SMTP_API/integrating_with_the_smtp_api.html
I had the same issue, but it had to do with enabling 2FA in my sendgrid account before upgrading my SMTP and API V3 code to Key-based authentication.
If you enable 2FA before doing the other stuff, it breaks authentication.
For us - this non-descript error was due to reaching the sending limits for our sendgrid email api subscription. I would recommend checking your sendgrid account first before messing about with website settings.
I did notice that a service was sending a lot of messages and using all the 25.000/month messages available in the azure free account plain.
To solve the problem, I created a new account and fixed the service to send a lower number of messages.
I had the same error but it was because I had included a domain parameter in the NetworkCredential
In our case this was a network issue. We had to enable the company's firewall to allow web socket connections from our service to SendGrid/Twilio as the new C# client we had to switch to (SendGridClient) uses sockets. Previously we used the C# generic MailClient which used SMTP/HTTP.

Office 365 SMTP starts firing net_io_connectionclosed

A while ago I've configured my ASP.NET C# project to send e-mail via Office 365, but last week it's starting to throw a lot of exceptions.
System.IO.IOException: Unable to read data from the transport connection: net_io_connectionclosed.
at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine)
at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine)
at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller)
at System.Net.Mail.CheckCommand.Send(SmtpConnection conn, String& response)
at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, Boolean allowUnicode, SmtpFailedRecipientException& exception)
at System.Net.Mail.SmtpClient.Send(MailMessage message)
How can I prevent this from happening?
MailMessage message = new MailMessage(System.Configuration.ConfigurationManager.AppSettings["smtpfrom"], email, strOnderwerp, strBody);
message.Priority = MailPriority.Normal;
message.IsBodyHtml = true;
SmtpClient client = new SmtpClient(System.Configuration.ConfigurationManager.AppSettings["smtpserver"], Convert.ToInt32((System.Configuration.ConfigurationManager.AppSettings["smtpport"])));
client.EnableSsl = Boolean.Parse(System.Configuration.ConfigurationManager.AppSettings["smtpssl"]); ;
client.Credentials = new System.Net.NetworkCredential(System.Configuration.ConfigurationManager.AppSettings["smtpuser"], System.Configuration.ConfigurationManager.AppSettings["smtppass"]);
client.Send(message);
client.Dispose();
The exceptions seems to be thrown on the Dispose.
In our case, we were already using smtp.office365.com endpoint, yet all of a sudden we started receiving net_io_connectionclosed on one of our machines, while same code was working perfectly on others. Investigation shown that those machines resolved smtp.office365.com to different IP addresses, and it looked like one of the servers was misbehaving.
On attemt to write support inquiry, it appeared that Microsoft is playing bad trick on us:
Recently, we started rejecting a percentage of connections to
smtp.office365.com that uses TLS1.0/1.1 for SMTP AUTH (complete
disablement will start early 2022).
And that was just it. Switching to TLS 1.2 fixed whole thing.
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
this worked for me
This same issue started at my company on February 8th. The problem would come and go with no pattern.
What I believe solved the problem was a change to the SMTP server address.
Our original SMTP server address was podxxxxx.outlook.com and still works most of the time. I checked for the current O365 SMTP server address in our portal and it should be smtp.office365.com.
I changed my config to point to this new address and the problem seems to have gone away. My logs show no errors for the last 24+ hours after the change.
If the error starts happening again I will update this.
If you all face this issue in 2022, that might be the case of Microsoft decided to stop supporting TLS1.0, TLS1.1 for service endpoint "smtp.office365.com".
To resolve it,
Either use "smtp-legacy.office365.com"
or
Configure client to use TLS1.2 by
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Read this article from Microsoft Tech Community for more details
The holy grail of all this bothering with the net_io_connectionclosed Errors while connecting to Office365 in VB.NET or c# is the TSL Version.
When you are working with a VB.NET oder c# Application wanting to connect, send an receive Msg. to/from O365 you have to force TLS12 in you code.
Just put the last line below your EnableSSL = True an you will be fine:
Last Line to force TLS12

SMTP error: "Client does not have permission to submit mail to this server"

I'm getting the following error while sending email. What could be the cause?
Client does not have permission to
submit mail to this server. The server
response was: 5.5.1 STARTTLS may not
be repeated.
Here's the stack trace...
Stack Trace
at System.Net.Mail.StartTlsCommand.CheckResponse(SmtpStatusCode statusCode, String response)
at System.Net.Mail.StartTlsCommand.Send(SmtpConnection conn)
at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)
at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)
at System.Net.Mail.SmtpClient.GetConnection()
at System.Net.Mail.SmtpClient.Send(MailMessage message)
I'm connecting to smtp.gmail.com with SSL on port 587 / 465
It appears you are using an SSL/TLS connection to send the mail message, however it appears for some reason that the code is sending the request to open the connection twice which is not valid. Hard to tell just from the exception and stack what the problem is. Post the sending code if possible.
Perhaps the SMTP server requires authentication (username / password) and you don't supply them?
(Just a guess)

"Unable to read data from the transport connection: net_io_connectionclosed." - Windows Vista Business and SMTP

Unable to test sending email from .NET code in Windows Vista Business.
I am writing code which I will migrate to an SSIS Package once it its proven. The code is to send an error message via email to a list of recipients.
The code is below, however I am getting an exception when I execute the code.
I created a simple class to do the mailing... the design could be better, I am testing functionality before implementing more robust functionality, methods, etc.
namespace LabDemos
{
class Program
{
static void Main(string[] args)
{
Mailer m = new Mailer();
m.test();
}
}
}
namespace LabDemos
{
class MyMailer
{
List<string> _to = new List<string>();
List<string> _cc = new List<string>();
List<string> _bcc = new List<string>();
String _msgFrom = "";
String _msgSubject = "";
String _msgBody = "";
public void test(){
//create the mail message
MailMessage mail = new MailMessage();
//set the addresses
mail.From = new MailAddress("me#domain.com");
//set the content
mail.Subject = "This is an email";
mail.Body = "this is a sample body";
mail.IsBodyHtml = false;
//send the message
SmtpClient smtp = new SmtpClient();
smtp.Host = "emailservername";
smtp.Port = 25;
smtp.UseDefaultCredentials = true;
smtp.Send(mail);
}
}
Exception Message
Inner Exception
{"Unable to read data from the transport connection: net_io_connectionclosed."}
Stack Trace
" at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine)\r\n at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine)\r\n at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller)\r\n at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)\r\n at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)\r\n at System.Net.Mail.SmtpClient.GetConnection()\r\n at System.Net.Mail.SmtpClient.Send(MailMessage message)"
Outer Exception
System.Net.Mail.SmtpException was unhandled
Message="Failure sending mail."
Source="System"
StackTrace:
at System.Net.Mail.SmtpClient.Send(MailMessage message)
at LabDemos.Mailer.test() in C:\Users\username\Documents\Visual Studio 2008\Projects\LabDemos\LabDemos\Mailer.cs:line 40
at LabDemos.Program.Main(String[] args) in C:\Users\username\Documents\Visual Studio 2008\Projects\LabDemos\LabDemos\Program.cs:line 48
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
at System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel)
at System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()
at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext)
at System.Activator.CreateInstance(ActivationContext activationContext)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException: System.IO.IOException
Message="Unable to read data from the transport connection: net_io_connectionclosed."
Source="System"
StackTrace:
at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine)
at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine)
at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller)
at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)
at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)
at System.Net.Mail.SmtpClient.GetConnection()
at System.Net.Mail.SmtpClient.Send(MailMessage message)
InnerException:
There are several things that can cause this problem, and here are some of the things that I've found.
Questions: You mention "Exchange" -- Is this an exchange server? Does the host require authentication (maybe you need to add authentication to the client)? What I would try doing first is assigning the host to the static IP address instead of the host name to see if that works first. If it does then it's most likely a problem with the DNS mapping.
If you are running your exchange server with Virtualization, you need to configure the SmtpClient to the host IP of the Virtual Server, not the physical hosting server name or IP. Right click on Default SMTP virtual server, select Properties, then go to Access tab, click Relay then add the IP address of the computer that send SMTP request to the SMTP server. (ASP.net site)
If this doesn't work, it's because the server is blocking you from sending SMTP packets. You need to make sure to add the box you are sending the SMTP messages from to the SMTP server. This is done through IIS's authentication tab.
I would also like to point out that you should dispose the mail client, or use the client in a "using" statement. This will make sure that the "QUIT" is sent to the server and gracefully close the connection.
using(SmtpClient smtp = new SmtpClient())
{
smtp.Host = "emailservername";
smtp.Port = 25;
smtp.UseDefaultCredentials = true;
smtp.Send(mail)
}
Restart IIS. I know this sounds silly, to do a restart for everything. (and sorry to bump up an old thread). But sometimes restarting IIS works magic. I faced the exact same issue and restarting solved it.
Might have happened cause temporarily the name 'localhost' couldn't be resolved. I;m just posting here so that someone who faces it now will probably try this quick fix before attempting to investigate further. Hope it helps
If you've specified an IP address in the SMTP Service settings then make sure you're specifying that IP address of the machine within IIS7 and not putting localhost.
IIS7 makes it easy to select 'localhost' but that will lead to this error if the IP for instance is 10.0.0.1
If you are using localhost (Use Localhost) in IIS 7, then change it to IP address of the machine instead of localhost or 127.0.0.1
Also follow below link to update your mail server relay accordingly:
Mailbox unavailable. The server response was: 5.7.1 Unable to relay for abc#xyz.com
Vista and Windows 7 does not have any SMTP server, this facility has been removed since Windows XP, so you need to setup your SMTP server explicitly, several tools are available in market for that, you can check that out.
Also once you configure the SMTP, remember to check the server name which you would be using to send the e-mail.
I had the same issue since I had multiple IP on my server (Virtual Servers) and my host was pointing to localhost while my SMTP Virtual Server was assigned to one particular IP:
<smtp deliveryMethod="Network">
<network host="localhost" port="25" defaultCredentials="false"/>
</smtp>
There are 2 solutions for this:
Change your code and set host to the particular IP that is being used by SMTP Virtual Server instead of localhost.
Change SMTP Virtual Server IP to All Unassigned
To see/change SMTP Virtual Server IP:
Right click on Default SMTP virtual server, select Properties, on General tab change/see IP address.
Hope this saves someone's day with the same issue.
I have found that the Vista Business OS does not come with IIS SMTP. I suspect this is the missing piece of the puzzle. Has anyone had any luck with this issue?
Is your code incompleted.Dash is correct in identifying it.Other then that check smtp component is installed or not
check link text
I am facing this issue last 6hr and I am new on that so I am trying to solve this issue in following way
1) I opened command prompt (e.g. Ctrl + R type cmd and enter).
2) And check to SMTP server ping and check response.
3) If it’s gets response then it’s ok and to move next step 4 other wise smtp name is wrong.
4) Then I check by telnet smtp port (e.g. 25 ) is open or not.
5) Using this cmd we check the SMTP response.
6) telnet "yoursmtpname" "portno” (e.g. telnet smtp.gmail.com 25)
7) If telnet is not working, please install or add from control panel in add new features.
8) If it’s working then it’s pass result like.
9) 220 mx.google.com ESMTP .
Using above steps we can find out smtp connection is ready or not to sending mail.
I developed a Windows Service application in VB using .NET Framework v4.5 and recently ran into this issue.
First, a little background - I ran into the OP's error after trying to deal with the error "Service not available, closing transmission channel. The server response was: Error: too many messages in one session" which was resolved by calling the Dispose method on the SmtpClient object after each email sent. Just to be ultra safe, I also called Dispose on the MailMessage object.
Okay, so now the 'too many messages in one session' issue is resolved but now I occasionally got the 'Unable to read data from the transport connection: net_io_connectionclosed' error. Awesome. Turns out I had not implemented my email class consistently - in one instance, it was being disposed of while in the other it was not.
Here's an example of what resolved both issues for me (it's in VB but you get the idea):
With New clsEmail(True)
With .Message
.To.Add("user#domain.com")
.Subject = msgSubject
.Body = msgContents
End With
.Server.Send(.Message)
.Server.Dispose()
.Message.Dispose()
End With
My email class has, among other things, has 2 properties - Message (System.Net.Mail.MailMessage) and Server (System.Net.Mail.SmtpClient) which is what's being disposed in this example.
I haven't had a single problem after hundreds of emails once every single instance that sends email in my service was implemented in this way.
upgrade to .NET 4.0 and apply all security updates
I was facing the same issue for one month. I tried all the possible solutions provided on Microsoft's official site. Finally, I found the root cause of it.
I have updated targetFramework from 4.5.2 to 4.6.1 in web.config file.
compilation debug="true" targetFramework="4.6.1"
httpRuntime maxRequestLength="183500800" executionTimeout="3600" targetFramework="4.6.1" enableVersionHeader="false"
the above solution worked for me, and now my emails are triggering successfully from the application.

Categories