Thứ Ba, 3 tháng 6, 2014

Send mail sử dụng socket C# (Giao thức SMTP)

Do công ty mình có nhu cầu cần can thiệp vào quá trình gửi mail của SMTP Server nên mình không dùng thư viện gửi mail có sẵn của .NET.

Dưới đây là quá trình giao tiếp cơ bản của giao thức SMTP.

Đoạn code do mình chuyển qua C# dựa vào bài viết gửi mail sử dụng dòng lệnh (CMD)  http://www.wikihow.com/Send-Email-Using-Telnet


TcpClient client = new TcpClient();

string log = "";

client.Connect("mail.emailserver.vn", 25);
            
StreamReader sr = new StreamReader(client.GetStream());
StreamWriter sw = new StreamWriter(client.GetStream());

log += "Server: " + sr.ReadLine() + "\n";

string data = "HELO";//một vài server yêu cầu phải HELO sender hostname

log += "Client: " + data + "\n";
sw.WriteLine(data);
sw.Flush();

log += "Server: " + sr.ReadLine() + "\n";

//Khai báo địa chỉ người gửi
data = "MAIL FROM: <" + "nguyxxdoxxphoxx.it@gmail.com" + ">";
log += "Client: " + data + "\n";
sw.WriteLine(data);
sw.Flush();
log += "Server: " + sr.ReadLine() + "\n";

//Khai báo địa chỉ người nhận
data = "RCPT TO: <" + "phong.nd@emailserver.vn" + ">";
log += "Client: " + data + "\n";
sw.WriteLine(data);
sw.Flush();
log += "Server: " + sr.ReadLine() + "\n";

//Gửi yêu cầu báo hiệu sẽ gửi nội dung bức thư
data = "DATA";
log += "Client: " + data + "\n";
sw.WriteLine(data);
sw.Flush();
log += "Server: " + sr.ReadLine() + "\n";

//Khai báo nội dung bức thư
data = emailContent + "\r\n" + ".";
log += "Client: " + data + "\n";
sw.WriteLine(data);
sw.Flush();
log += "Server: " + sr.ReadLine() + "\n";

//Ngắt kết nối với SMTP Server hoặc Email Server
data = "QUIT";
log += "Client: " + data + "\n";
sw.WriteLine(data);
sw.Flush();
log += "Server: " + sr.ReadLine() + "\n";

sr.Close();
sw.Close();
client.Close();