2010-07-30 180 views
0

我嘗試做一個發送郵件的程序。 在開始時它工作正常 - 我得到220(意思是「你好」),然後當我說「MAIL FROM:」時,它返回250(表示OK),但是當我寫入「RCPT TO:」時,它寫入 「中繼不允許」。 爲什麼不穀歌的smtp喜歡它?用smtp發送郵件

我的代碼:http://pastebin.com/wNA1Zp26

*順便說一下:當我發送從其他帳戶的電子郵件 - 它不工作的。

+0

至少用您正在使用的語言標記您的問題。 – Oded 2010-07-30 14:02:03

回答

2

包括你使用的語言將是一個很大的優點。

一般來說雖然沒有半路出家電子郵件服務器/服務將讓您發送任何電子郵件,直到你與服務器/服務認證。這就是爲什麼你得到'不允許中繼'。

+0

那麼如何識別服務器呢? – Ohad 2010-07-30 14:17:49

+0

我不是一個大插座的傢伙,特別是在C++中,但這裏是一個鏈接,看起來給予命令和響應進行身份驗證 - http://computer-programming-tutorials.suite101.com/article.cfm/sending_email_with_smtp_auth – 2010-07-30 14:23:11

+0

謝謝。 這正是我所做的,它嚇壞了! 「•告知服務器郵件來自哪裏; •告訴服務器郵件的來源; •給服務器發送消息; •以'\ r \ n。\ r \ n'結尾。 它不告訴我我不發送正確的消息 - 它只是不傳遞消息,我不知道爲什麼(!)。 – Ohad 2010-07-30 14:45:49

3

我認爲真正的錯誤是你試圖實現郵件客戶端。我不是 C#或.NET,的專家,但對於Java而言,有一個「標準」庫,可以執行SMTP和所有其他郵件協議,如果沒有這樣的庫,我會非常驚訝。淨。

您不應該浪費時間重新發明與SMTP服務器之間的套接字通信,而應該教育自己使用適當的庫來實現此目的。

或者這是一個學術活動?

編輯:糟糕,它是C++,而不是C#。責怪我的視力。

Here's a whole page full of links to SMTP libraries。選擇一個,下載它,使用它。

說真的,如果您曾經管理過關於如何進行ESMTP身份驗證的鏈接,那麼您可以管理所需的基本「祕密」握手的更簡單形式。但是將一些代碼捆綁在一起來處理「快樂的路徑」,也許只是談談某個特定的SMTP服務器實現與創建可安全可靠地運行的代碼以及體面的錯誤處理和報告並不相同。

+0

但我不使用.NET,我使用C++。 – Ohad 2010-07-30 14:47:00

+0

哎呀!我的錯誤是,我簡單看了一下代碼,並認爲我看到了「C#」。我已經更新了我的答案。 – 2010-07-30 15:21:51

0

中繼錯誤通常意味着您的客戶正嘗試向您所連接系統外的收件人發送電子郵件,但您的客戶無權這樣做。看着你的代碼,你並不是試圖向服務器驗證自己。

首先,您使用的是HELO命令,並且您在此處使用不正確。 HELO的輸入參數是您的機器名稱,但您要發送SMTP服務器主機名。你需要解決這個問題。

之後,您應該使用EHLO命令而不是HELO命令。 EHLO將允許您的客戶端確定服務器實際支持哪些認證方案(如其他功能)(例如LOGIN,NTLM,SHA1,MD5等)。然後,您可以選擇一個您支持的並使用它登錄到具有中繼權限的實際用戶帳戶。

您的代碼的另一個問題是它根本沒有執行任何SMTP級別的錯誤處理。您正在查看套接字錯誤代碼,但您根本沒有在尋找SMTP錯誤代碼。例如,如果服務器拒絕MAIL FROM或RCPT TO命令(在這種情況下),那麼您的代碼仍然會浪費帶寬和處理時間,發送DATA命令將失敗(帶有另一個您未查找的SMTP錯誤對於)。