I am trying to send email using a TCP connection in C# to an smtp server (google in this example). The response I am getting is that Authentication is required.
5.5.1 Authentication Required. Learn more at\n5.5.1 https://support.google.com/mail/?p=WantAuthError h66sm663716vke.21 - gsmtp
There is no authentication. I don't know the username and password of the account I am sending email TO.
All the other examples I have been able to find use a pre-build SMTP server and build a mail message.
I just want to be able to send email to ANY email account when someone needs to reset their password or I need to send a system message or whatever.
Here is my code:
TcpClient tcpclient = new TcpClient();
tcpclient.Connect("smtp.gmail.com", 465);
//not sure if I need port 465 or 587.
// implicit SSL is always used on SMTP port 465
System.Net.Security.SslStream sslstream = new System.Net.Security.SslStream(tcpclient.GetStream());
sslstream.AuthenticateAsClient("smtp.gmail.com");
writer = new StreamWriter(sslstream);
reader = new StreamReader(sslstream);
string replyText = string.Empty;
string[] capabilities = null;
// read the server's initial greeting
readResponse(220);
// identify myself and get the server's capabilities
if (sendCommand("EHLO myserver.com", ref replyText) == 250)
{
    // parse capabilities
        capabilities = replyText.Split(new Char[] { '\n' });
}
else
{
    // EHLO not supported, have to use HELO instead, but then
        // the server's capabilities are unknown...
    capabilities = new string[] { };
    sendCommand("HELO myserver.com", 250);
}
    // check for pipelining support... (OPTIONAL!!!)
        if (Array.IndexOf(capabilities, "PIPELINING") != -1)
        {
                // can pipeline...
                // send all commands first without reading responses in between
                writer.WriteLine("MAIL FROM:<" + "myserver@myserver.com" + ">");
                writer.WriteLine("RCPT TO:<" + "anyemail@gmail.com" + ">");
                writer.WriteLine("DATA");
                writer.Flush();
                // now read the responses...
                Exception e = null;
                // MAIL FROM
                int replyCode = readResponse(ref replyText);
                if (replyCode != 250)
                    e = new SmtpCmdFailedException(replyCode, replyText);
                // RCPT TO
                replyCode = readResponse(ref replyText);
                if ((replyCode != 250) && (replyCode != 251) && (e == null))
                    e = new SmtpCmdFailedException(replyCode, replyText);
                // DATA
                replyCode = readResponse(ref replyText);
                if (replyCode == 354)
                {
                    // DATA accepted, must send email followed by "."
                    writer.WriteLine("Subject: Email test");
                    writer.WriteLine("Test 1 2 3");
                    writer.WriteLine(".");
                    writer.Flush();
                    // read the response
                    replyCode = readResponse(ref replyText);
                    if ((replyCode != 250) && (e == null))
                        e = new SmtpCmdFailedException(replyCode, replyText);
                }
                else
                {
                    // DATA rejected, do not send email
                    if (e == null)
                        e = new SmtpCmdFailedException(replyCode, replyText);
                }
                if (e != null)
                {
                    // if any command failed, reset the session
                    sendCommand("RSET");
                    throw e;
                }
            }
            else
            {
                // not pipelining, MUST read each response before sending the next command...
                sendCommand("MAIL FROM:<" + "myserver@myserver.com" + ">", 250);
                try
                {
                    sendCommand("RCPT TO:<" + "anyemail@gmail.com" + ">", 250, 251);
                    sendCommand("DATA", 354);
                    writer.WriteLine("Subject: Email test");
                    writer.WriteLine("");
                    writer.WriteLine("Test 1 2 3");
                    writer.Flush();
                    sendCommand(".", 250);
                }
                catch (SmtpCmdFailedException e)
                {
                    // if any command failed, reset the session
                    sendCommand("RSET");
                    throw;
                }
            }
            // all done
            sendCommand("QUIT", 221);
 
     
    