上面一篇已經講到如何發信了,今天索性來個結尾談一談如何發信!
和前面的流程差不多,我們也手工模擬一次發信流程!
其實和前面的發信流程差不太多!一樣的,我們以網易的郵箱為例!
我們先要連線到網易的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...