While I still stick the comment above I will take ssome stabs at why this fails for the sake of learning...
A few things that I notice while looking at
RFC 821
This line:
print $sock "RCPT FROM: $mail_to <$mail_to>\n";
Should be:
print $sock "RCPT TO: $mail_to <$mail_to>\n";
Also the RFC states that the quit should be followed by cr+LF which would change
print "QUIT\n";
to:
print "QUIT\r\n";
Anyway those are a few things I noticed off the top of my head, also you should issue a QUIT before you close even if there is an error in an earlier step.
My advice in general is to not reivnvent the wheel use the SMTP module that already implements this correctly. Failing that take the time to read the RFC(s) and implement it they way it is stated.