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

2021-09-07 10:53:02 字數 4372 閱讀 4600

在**開始之前,我們先手工模擬一遍傳送電子郵件的過程。那麼接下來的**你就easy懂多了!

以下以163郵箱為例!

先鍵入telnet命令。然後連線到網易的smtpserver,使用25號port.

接著看下圖:

從如今開始。我們能夠模擬傳送信件的過程了!

傳送命令:ehlo hello  (hello能夠隨意替換)

然後我們請求登陸!

傳送命令: auth login

然後傳送自己賬戶的username的base64編碼(不要@***.com)過去!我用的乙個測試郵箱[email protected],it_is_just_a_test的base64編碼是ax***xnfanvzdf9hx3rlc3q=

然後將自己的password的base64編碼發過去!我的password的base64編碼是mtk5mza3mtrsewg=

server告訴你認證成功了!我們如今就能夠傳送郵件了!

先傳送郵件說明:mail from:

然後傳送目的郵箱說明:rcpt to: 

然後請求傳送郵件:data

然後傳送郵件頭和郵件體,

傳送資料:

from: [email protected]

to: [email protected]

subject: 測試一下

mime-version: 1.0

這是一封測試郵件!!! .

(在正文輸入結束時回車輸入乙個 . (英文輸入法下的句號)然後再回車。表示正文部分的結束。這時將顯示郵件成功傳送的資訊。

)表示的是回車

當信件傳送完畢了之後。我們能夠利用quit命令關閉與server的連線!

基本原理就是這樣了:然後我們來看**吧!(利用程式傳送的時候無非就是把回車換成"\r\n"!)

#include #include #include #include using namespace std;

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

const int maxsize = 1024;

int srvport = 25;

char srvdomain[256] = "smtp.163.com";

char username[256] = "[email protected]"; //自己的郵箱名稱

char password[256] = "19930714lyh"; //自己郵箱的密碼

char targetemail[256] = "[email protected]"; //要傳送的郵件位址

char emailtitle[256] = "你好!我是李樹花開!

"; //郵件主題 char content[256] = "這是一封測試郵件!

非常高興我的第乙個郵件client製作成功了!

";//郵件正文 socket createconn(char* pwebsite,int port) return sockclient; } //int dowhat是否接受資料 void sendandrecvmsg( socket sockclient, //client的套接字 char* pmessage, //要傳送的訊息 int messagelen, //訊息的長度 int dowhat, //造作的型別 char* recvbuf, //接收的緩衝區 int recvbuflen //緩衝區長度 ) ; memcpy(lpmessage, pmessage, messagelen); printf("\n\n%s \n", lpmessage); if (dowhat == 0) } printf("\n"); } else if (dowhat == 1) else if (dowhat == 2) //不過接收資料 } printf("\n"); } } int getstrlen(char* pstring) //得到字串的長度 void stringtobase64(const char *src,char *dst) if((strlen(src) - i) == 1) if((strlen(src) - i) == 2) *p = '\0'; } bool formatemail(char* pfrom, char* pto, char* psubject, char* pmessage, char* email) void main() ; sprintf(usernametosendemail, "ehlo %s", "[email protected]"); lstrcat(usernametosendemail, "\r\n\0"); sendandrecvmsg(sockclient, usernametosendemail, getstrlen(usernametosendemail), 0, buff, maxsize); //既接收也傳送 sendandrecvmsg(sockclient, "auth login\r\n", strlen("auth login\r\n"), 0, buff, maxsize); //請求登陸 char puername[256] = ; //strstr函式搜尋乙個字串在還有乙個字串中的第一次出現,並返回第一次出現位置的指標 dword p = strstr(username,"@") - username; memcpy(puername, username, p); //得到username,如從"[email protected]"得到"13203200199" char base[256]; stringtobase64(puername, base); //得到username的base64編碼 char str[maxsize]; memset(str, 0, maxsize); sprintf(str, "%s\r\n", base/*"mtmymdmymdaxotk="*/); sendandrecvmsg(sockclient, str, lstrlen(str), 0, buff, maxsize); //傳送username,並接收server的返回 stringtobase64(password, base); memset(str, 0, 1024); sprintf(str, "%s\r\n", base); sendandrecvmsg(sockclient, str, lstrlen(str),0, buff, maxsize); //傳送使用者密碼。並接收server的返回 char mailfrom[256] = ; sprintf(mailfrom, "mail from: \r\n", username); sendandrecvmsg(sockclient, mailfrom, lstrlen(mailfrom), 0, buff, maxsize); char rcptto[256] = ; sprintf(rcptto, "rcpt to: \r\n", targetemail); sendandrecvmsg(sockclient, rcptto, lstrlen(rcptto), 0, buff, maxsize); sendandrecvmsg(sockclient, "data\r\n", lstrlen("data\r\n"), 0, buff, maxsize); char email[1024] = ; formatemail(username, targetemail, emailtitle, content, email); sendandrecvmsg(sockclient,email,lstrlen(email), 0, buff, maxsize); sendandrecvmsg(sockclient,"quit\r\n", lstrlen("quit\r\n"), 0, buff, maxsize); closesocket(sockclient); wsacleanup(); }

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

上面一篇已經講到如何發信了,今天索性來個結尾談一談如何發信 和前面的流程差不多,我們也手工模擬一次發信流程 其實和前面的發信流程差不太多!一樣的,我們以網易的郵箱為例!我們先要連線到網易的pop郵箱 命令為 telnet pop.163.com 110 意思很明顯,要求連線到網易的pop伺服器的11...

傳送電子郵件

傳送電子郵件 param emaillist 的物件 param data 傳送的資料 throws ioexception throws addres ception private void sendemail listemaillist,listdata throws ioexception,...

django 電子郵件傳送

用途 傳送系統出問題了時的報警郵件 以qq郵箱為例 進入郵箱 設定 賬戶 開啟pop3 smtp服務 拿到授權碼 settings.py中設定 email backend django.core.mail.backends.smtp.emailbackend 固定寫法 email host smtp...