簡易電子郵件收信的原理以及實現

2021-06-22 07:02:53 字數 4386 閱讀 5229

上面一篇已經講到如何發信了,今天索性來個結尾談一談如何發信!

和前面的流程差不多,我們也手工模擬一次發信流程!

其實和前面的發信流程差不太多!一樣的,我們以網易的郵箱為例!

我們先要連線到網易的pop郵箱!

命令為: telnet pop.163.com 110

意思很明顯,要求連線到網易的pop伺服器的110號埠.

然後就可以登陸了!

輸入命令:user ***xx (你的使用者名稱,不用加密)

如果沒有出錯的話,系統一般會返回+ok之類的東西.

然後輸入:pass ******(你郵箱的密碼,不加密)

一樣的,如果沒有出錯的話,系統一般會返回+ok之類的東西.

現在我們就可以操作了!

雖然可以使用的命令很多,不過最常用的命令只有兩個!

第乙個是list命令,用來列出郵件的條目!我們看一下!

表示有19封郵件,右邊是郵件大小。

還有乙個命令自然是retr命令了!它用來獲取郵件!看我演示:

retr使用規則是 retr + 你要獲取的郵件的編號!

好吧!既然已經說到這份上了,我順便提一句!伺服器傳送的大部分內容是用base64加密了的,所以我們看到滿螢幕的字母!那麼怎麼讀取出內容呢?這不是這篇文章的重點,所以我們**採取的方式是直接將伺服器傳送過來的郵件內容寫到檔案裡,存成.eml檔案,然後郵件客戶端可以開啟這種檔案,推薦採用foxmail來開啟這種檔案!

最後,不要忘了quit命令,關閉與伺服器的連線,這裡就不再演示!

看**吧!

pop3.cpp

#include #include #include #include "pop3.h"

cpop3::cpop3()

cpop3::~cpop3()

int cpop3::pop3recv(char* buf, int len, int flags)

while (strstr(buf, "\r\n.\r\n") == (char*)null);

return offset;

}bool cpop3::create(

const char* username, //使用者名稱

const char* userpwd, //使用者密碼

const char* svraddr, //伺服器位址

unsigned short port //服務埠

)bool cpop3::connect()

sprintf(

ipaddr,

"%u.%u.%u.%u",

(unsigned char)p->h_addr_list[0][0],

(unsigned char)p->h_addr_list[0][1],

(unsigned char)p->h_addr_list[0][2],

(unsigned char)p->h_addr_list[0][3]

);//連線pop伺服器

struct sockaddr_in svraddr;

svraddr.sin_family = af_inet;

svraddr.sin_addr.s_addr = inet_addr(ipaddr);

svraddr.sin_port = htons(m_port);

int ret = connect(m_sock, (struct sockaddr*)&svraddr, sizeof(svraddr));

if (ret == socket_error)

//接收pop3伺服器發來的歡迎資訊

char buf[128];

int rs = recv(m_sock, buf, sizeof(buf), 0);

buf[rs] = '\0';

printf("%s", buf);

if (rs <= 0 || strncmp(buf, "+ok", 3) != 0) /*伺服器沒有返回ok就出錯了*/

return true;

}bool cpop3::login()

printf("%s", recvbuf);

/*傳送密碼資訊*/

memset(sendbuf, 0, sizeof(sendbuf));

sprintf(sendbuf, "pass %s\r\n", m_userpwd);

send(m_sock, sendbuf, strlen(sendbuf), 0);

printf("%s", sendbuf);

rs = recv(m_sock,recvbuf, sizeof(recvbuf), 0);

recvbuf[rs] = '\0';

if (rs <= 0 || strncmp(recvbuf, "+ok", 3) != 0)

printf("%s", recvbuf);

return true;

}bool cpop3::list(int& sum)

recvbuf[rs] = '\0';

printf("%s", recvbuf);

sum = getmailsum(recvbuf); //得到郵件的數目

return true;

}bool cpop3::fetchex(int num)

recvbuf[rs] = '\0';

printf("recv retr resp: %s", recvbuf); //輸出接收的資料

if (flag == 0)

len = strlen(recvbuf);

fwrite(recvbuf, 1, len, fp);

fflush(fp); //重新整理

}while (strstr(recvbuf, "\r\n.\r\n") == (char*)null);

fclose(fp);

return true;

}bool cpop3::quit()

closesocket(m_sock);

return true;

}int cpop3::getmailsum(const char* buf)

return sum;

}

pop3.h

#include #pragma  comment(lib, "ws2_32.lib")	/*鏈結ws2_32.lib動態鏈結庫*/

class cpop3 ;

然後用乙個主程式測試一下:main.cpp

#include #include "pop3.h"

int main()

pop3.quit();

return 0;

}

在vc6下面測試完美通過!然後看看你的工程的資料夾下面,是不是出現了很多.eml檔案?這些檔案可以用foxmail開啟,這就是接收到的郵件!趕快嘗試一下吧!文章寫到這裡,建議的收信,寫信基本上都已經說明白了,其實你稍微包裝一下,就可以寫出一段mfc的郵件客戶端的**,加個殼而已!

電子郵件傳送的原理以及簡易實現

在 開始之前,我們先手工模擬一遍傳送電子郵件的過程。那麼接下來的 你就easy懂多了!以下以163郵箱為例!先鍵入telnet命令。然後連線到網易的smtpserver,使用25號port.接著看下圖 從如今開始。我們能夠模擬傳送信件的過程了 傳送命令 ehlo hello hello能夠隨意替換 ...

乙個簡易的傳送垃圾電子郵件

需要兩個jar包 mail.jar和 commons email 1.2.jar public class sendemail catch filenotfoundexception e catch ioexception e return list public static void main ...

python實現電子郵件(E mail)傳送

前幾天需要服務端傳送郵件的指令碼,發現直接用sendmail相對來說複雜,大才小用了,因為我只需要乙個傳送的功能即可。於是查查改改,很容易弄了乙個。python弄這些簡單的email client,http client,tcp client之類的真的很方便,而且windows上也可以直接執行。im...