Tôi hiện đang làm việc để tạo máy chủ SMTP của riêng mình cho một dự án tôi đang làm việc.Nhận câu trả lời bất ngờ từ một nơi nào đó bên ngoài chương trình của tôi với máy chủ SMTP
Tất cả đều hoạt động khá nhiều trừ khi tôi nhập dữ liệu, tôi nhận được phản hồi từ một thứ khác không phải là chương trình của tôi.
Để thực hiện thử nghiệm, tôi đang chạy chương trình liên kết với IPAddress.Any và trên cổng 25 cho smtp. Tôi sau đó sử dụng telnet từ máy tính địa phương của tôi để kiểm tra tôi đang gửi câu trả lời đúng. Trong khi làm điều này tôi bật gỡ lỗi và bước qua mã để xem những gì chương trình của tôi đã làm.
- Khi tôi kết nối tôi gửi một
220 with my domain name
- Khi telnet gửi
EHLO
tôi gửi lại một250 with my domain name
- Từ telnet tôi gửi
MAIL FROM: [email protected]
và tôi gửi lại250 2.1.0 OK
- Từ telnet tôi gửi
RCPT TO: [email protected]
và tôi gửi trở lại250 2.1.5 OK
Đây là nơi những điều kỳ lạ bắt đầu xảy ra, Từ telnet tôi gửi DATA
sẵn sàng cho các tin nhắn email chính và trong các mã Tôi nghĩa vụ phải được gửi một 354 End data with <CR><LF>.<CR><LF>
nhưng thay vào đó tôi nhận được một phản ứng của 354 please start mail input.
Từ tất cả các bước trước khi dữ liệu visual studio đi vào chế độ gỡ lỗi quá Tôi có thể bước qua nhưng khi bước vào DATA visual studio đã không đáp ứng như thể chương trình của tôi không bao giờ nhận được bất cứ điều gì và nó thay vào đó đi đâu đó khác.
Tôi không biết điều này đến từ đâu, tôi không có máy chủ SMTP nào khác chạy trên PC của mình.
Dưới đây là đoạn code tôi đang sử dụng
private void processSmtpReceived(TcpClient client)
{
stream = client.GetStream();
reader = new StreamReader(stream);
writer = new StreamWriter(stream);
writer.NewLine = "\r\n";
writer.AutoFlush = true;
//writer.WriteLine("220 localhost -- Fake proxy server");
string line = "";
string message = "";
string subject = "";
bool readingData = false;
if (client.Connected)
{
writer.WriteLine("220 localhost -- Fake proxy server");
while ((line = reader.ReadLine()) != null && reader != null)
{
line = line.Replace("\b", "");
if (readingData)
{
message += line;
if (line.Contains("Subject:"))
{
subject = line;
}
else if (line == ".")
{
writer.WriteLine("250 2.0.0 OK");
readingData = false;
}
}
else if (line.Contains("EHLO"))
{
writer.WriteLine("250 OK localhost-workgroup");
}
else if (line.Contains("MAIL FROM"))
{
writer.WriteLine("250 2.1.0 OK");
}
else if (line.Contains("RCPT TO"))
{
writer.WriteLine("250 2.1.5 OK");
}
else if (line.Contains("DATA"))
{
writer.WriteLine("354 End data with <CR><LF>.<CR><LF>");
readingData = true;
}
else if (line == ".")
{
writer.WriteLine("250 2.0.0 OK");
}
else if (line == "QUIT")
{
writer.WriteLine("221 2.0.0 Bye");
Console.WriteLine("Message: " + message);
}
else
{
writer.WriteLine("250 OK");
}
Console.WriteLine("Received: {0}", line);
}
}
Như bạn có thể nhìn thấy từ mã phản ứng của start mail input
không có trong mã của tôi nên không biết nơi này là đến từ.
Nhờ sự giúp đỡ bạn có thể cung cấp
CẬP NHẬT đã vừa phát hiện ra một cái gì đó là một chút kỳ lạ. Nếu tôi chạy máy chủ SMTP và telnet trên cùng một máy tức là telnet localhost 25
hoạt động chính xác và tôi nhận được kết thúc 354 với <CR><LF>.<CR><LF>
, tuy nhiên nếu tôi telnet từ một máy chủ riêng biệt tức là telnet 192.168.1.74 25
thì tôi nhận được 354 please start mail input
. Điều này là giống nhau cho dù đó là trên Windows hay Linux, tôi không biết tại sao nó tạo ra phản ứng này vì không có nơi nào trong mã phản hồi được nhập vào, và không có máy chủ SMTP chạy như khi tôi ngừng chương trình của tôi và thử và kết nối với telnet trên cổng 25 Tôi nhận được thông báo kết nối không thành công.
UPDATE 2 Là một thử nghiệm tôi đã thay đổi mã nên thay vì từ telnet vào DATA
cho thông điệp mà tôi nhập MYTEST
, khi tôi sử dụng mytest chương trình của tôi nhận được thông báo rằng tôi đang gửi đi và chương trình của tôi hoạt động như mong đợi, của nó chỉ khi trong chương trình tôi sử dụng DATA, đó là những gì được mong đợi cho SMTP rằng chương trình của tôi không nhận được nó, và tôi nhận được phản hồi từ cái gì khác. Tôi đã thực hiện quét mạng để xem có bất kỳ thứ gì khác đang chạy dưới dạng máy chủ SMTP ở đâu đó trên mạng của tôi hay không nhưng không tìm thấy gì.
CẬP NHẬT 3 Tôi cũng phát hiện ra rằng sự cố tôi gặp phải khi gửi DATA không được chương trình của tôi nhận qua telnet chỉ có trên Windows đến Windows từ xa. Nếu tôi telnet từ một máy chủ Linux đến máy chủ smtp chạy trên Windows nó hoạt động tốt, nó chỉ nếu tôi telneting từ cửa sổ mà tôi gặp vấn đề với lệnh DATA.
CẬP NHẬT 4 Đã thực hiện kiểm tra và thấy rằng nó không dành riêng cho Windows nhưng máy tính để bàn và máy tính xách tay của tôi. Tôi đã cài đặt một máy ảo trống với Windows 7 và nếu tôi telnet cho chính nó, tức là localhost nó hoạt động tốt, nếu tôi telnet từ máy tính dev của tôi đến máy ảo sau đó tôi nhận được phản ứng bất ngờ và nó không đi qua chương trình của tôi. Tôi đoán phải có một cái gì đó trên cả hai máy tính xách tay và máy tính để bàn của tôi mà lắng nghe lưu lượng truy cập smtp một cách nào đó, không chắc chắn như thế nào khi chương trình của tôi không chạy Tôi không thể kết nối với cổng 25. Điều duy nhất tôi có thể nghĩ đến là tôi có Symantec Norton 360 được cài đặt nhưng tôi đã vô hiệu hóa tường lửa, chống vi-rút và chống thư rác và không có sự khác biệt.
nếu bạn * không * chạy chương trình của bạn và bạn telnet đến cổng 25 bạn có nhận được trả lời không? –
@MichaelEdenfield no I don ', t nếu tôi thử và telnet đến cổng 25 trong khi chương trình của tôi không chạy, tôi nhận được '' Kết nối với localhost ... Không thể mở kết nối đến máy chủ, trên cổng 25: Kết nối thất bại'' như mong đợi – Boardy
@MichaelEdenfield, tôi cũng phát hiện ra rằng nếu tôi thực hiện một lệnh trên máy khách và máy chủ của mình, tôi có thể xem các gói cho mọi thứ bao gồm EHLO, MAIL FROM, RCPT TO nhưng khi tôi nhập DATA, cả hai đều không được hiển thị trên một trong hai dấu vết lan – Boardy