国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C和C#兩種方式實現郵件的簡單發送

2019-11-17 02:41:25
字體:
來源:轉載
供稿:網友

C和C#兩種方式實現郵件的簡單發送

內容為通過兩種方式發送郵件--1.C語言發送郵件 2.C#發送郵件

一,C語言進行郵件的發送

C語言發送郵件的步驟的簡單解析:

1.創建TCP連接 socket()

2.連接到郵箱服務器 SOCKADDR_IN,connect()

3.郵箱用戶和密碼認證登錄 "EHLO smtp.163.com/r/n" → "AUTH LOGIN/r/n"

4.發送郵件主題內容

  a.發送 "MAIL FROM:<"郵件的發送方地址">/r/n" //

  b.發送 "RCPT TO:<"郵件接收方的地址">/r/n"

c.發送 "DATA/r/n"

d.發送郵件頭(From,To,Subject,Date等),郵件體(郵件體可為空)

e.添加附件內容(可以添加多個,附件也可以不添加)

5.退出登錄 發送 "QUIT/r/n"

6.關閉TCP連接 closesocket(connection);

C語言關鍵代碼如下:

//創建TCP連接

1 if ((connection = socket(AF_INET, SOCK_STREAM, ipPROTO_TCP)) == INVALID_SOCKET)2 {3     return INVALID_SOCKET;4 }

//連接到郵箱服務器

 1 void ConnectToServer(SOCKET connection,const char *serverName) 2 { 3   //設置SockAddr_In地址結構    4   SOCKADDR_IN serAddr; 5    serAddr.sin_family = AF_INET; 6    serAddr.sin_port = htons(SMTP_PORT); 7    //來自 CAsysSocket::Connect() 8    serAddr.sin_addr.s_addr = inet_addr(serverName); 9    if (serAddr.sin_addr.s_addr == INADDR_NONE)10    {11      LPHOSTENT lphost;12      lphost = gethostbyname(serverName);13      if (lphost != NULL)14         serAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->S_un.S_addr;15      else16         return;17     }18    //連接服務器19    connect(connection, (SOCKADDR *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)20    return;21 }

//認證登錄

 1 //認證登錄 2 BOOL AuthLogin(SOCKET connection, const char *serverName,const char *userAccount, const char *passWord) 3 { 4    //發送EHLO%SMTP-Server Name%     說明:HELO 是不帶身份驗證的,而 EHLO 是帶身份驗證 5    char szHello[PARA_BUF] = { 0 }; 6    sprintf(szHello, "EHLO %s/r/n", serverName);                      //"EHLO %s/r/n" 7    if (!send_rev(connection, szHello, GENERIC_SUCCESS)) 8       return FALSE; 9 10    //發送AUTH LOGIN11    if (!send_rev(connection, "AUTH LOGIN/r/n",   AUTHLOGIN_SUCCESS))  // "AUTH LOGIN/r/n"12       return FALSE;13 14    //發送經過Base64編碼的用戶賬號15    char szAccount[100]={0};16    base64_encode(userAccount, strlen(userAccount), &szAccount);    //base64編碼17    strcat(szAccount, "/r/n");18    if (!send_rev(connection, szAccount, AUTHLOGIN_SUCCESS))        //賬號    19       return FALSE;20 21    //發送經過Base64編碼的密碼22    char szPassword[100]={0};23    base64_encode(password, strlen(password), &szPassword);       24    strcat(szPassword, "/r/n");25    if (!send_rev(connection, szPassword, AUTH_SUCCESS))            //密碼26      return FALSE;27    return TRUE;28 }

//發送郵件(包含了用戶的退出操作QUIT)

 1 //發送郵件 2 BOOL SendMail(SOCKET connection,const char *from,  const char *to, 3                         const char *subject, const char *body, 4                         const char *userName,const char *filePath) 5 { 6    char szFrom[PARA_BUF] = { 0 }; 7    char szTo[PARA_BUF] = { 0 }; 8    char szSubject[PARA_BUF] = { 0 };  9    char szBodyHead[PARA_BUF * 10] = { 0 };10    char szBody[PARA_BUF * 20] = { 0 };11 12    char szDateTime[PARA_BUF] = { 0 };13    char *szContent=NULL;                14    //郵件的內容,包括正文文本信息,附件內容信息等15   if (!chars_malloc(&szContent, MAX_FILE_SIZE*4/3 + M ) )16    {17       return FALSE;18    }19 20    //發送Header中的Mail From21    sprintf(szFrom, "MAIL FROM:<%s>/r/n", from);           //  MAIL FROM:<%s>/r/n22    if (!send_rev(connection, szFrom, GENERIC_SUCCESS) )23       return FALSE;24 25    //發送Header中RCPT TO26    sprintf(szTo, "RCPT TO:<%s>/r/n", to);               //   RCPT TO:<%s>/r/n27    if (!send_rev(connection, szTo, GENERIC_SUCCESS))28       return FALSE;29 30    //發送DATA/r/n31    if (!send_rev(connection, "DATA/r/n", DATA_SUCCESS))    //   DATA/r/n32       return FALSE;33 34    //進行 Body 處理    35   sprintf(szFrom, "FROM:%s<%s>/r/n", userName, from);     //content36    sprintf(szTo, "TO:<%s>/r/n", to);37    time_t ltime = time(NULL);38    _tzset();39    sprintf(szDateTime, "Date:%s", ctime(&ltime));40    sprintf(szSubject, "Subject:%s/r/n", subject);41 42    sprintf(szBodyHead, "X_Mailer:ntSmtp[ch]/r/n", subject);43    strcat(szBodyHead, "MIME_Version:1.0/r/n");44    strcat(szBodyHead, "Content-  type:multipart/mixed;Boundary=ntSmtp/r/n/r/n");45    strcat(szBodyHead, "--ntSmtp/r/n");46    strcat(szBodyHead, "Content-type:text/plain;Charset=gb2312/r/n");47    strcat(szBodyHead, "Content_Transfer-Encoding:8bit/r/n/r/n");48 49    sprintf(szBody, "%s/r/n/r/n", body);50 51    //連接成content的各部分內容52    strcat(szContent, szFrom);53    strcat(szContent, szTo);54    strcat(szContent, szDateTime);55    strcat(szContent, szSubject);56    strcat(szContent, szBodyHead);57    strcat(szContent, szBody);58 59    if (filePath != NULL)60    {           //將附件內容添加到szContent61       AppendAttachment( &szContent, filePath);62       //AppendAttachment(&szContent, filePath);63    }64    //添加結束標記    65    strcat(szContent, "/r/n./r/n");       //  /r/n./r/n66 67    //發送Content68    if ( !send_rev(connection, szContent, GENERIC_SUCCESS) )69       return FALSE;70 71    //發送Quit,退出登錄72    if( !send_rev(connection, "QUIT/r/n", QUIT_SUCCESS) )  //"QUIT/r/n"73       return FALSE;74 75    free(szContent);76    return TRUE;77 }

二,C#進行郵件的發送

通過C#進行郵件的發送,不需要C語言那樣必須把握住連接通信過程中的諸多細節,

如果進行簡單的郵件發送,只需要使用到兩個類,一個是MailMessage類,該類定義了

一封完整郵件多需要的信息(包括郵件的發送方,接收方,主題,正文內容,附件等信息),

另一個是SmtpClient類,該類是用于服務器端的操作,通過該類的對象,你就可以設置

郵箱服務器的地址(例如:smtp.163.com),郵箱的登錄賬號與密碼等,最終通過該類

的對象便可以將MailMessage的信息發送到指定的郵箱了.

C#發送郵件的步驟的簡單解析:

1.創建MailMessage對象,設置MailMessage的相關成員數據; 包括From,To,Subject,Body,Attachments等信息.

2.創建服務器端對象SmtpClient,設置服務器,郵箱賬號,密碼.

3.通過SmtpClient對象,將MailMessage郵件信息發送出去; 可以進行普通的發送以及異步發送(不阻塞線程).

C#關鍵代碼如下:

//異步發送郵件

 1 //發送按鈕 2 private void btn_Send_Click(object sender, EventArgs e) 3 { 4     //創建MailMessage對象 5     MailAddress from = new MailAddress("ntsmtp@163.com"); 6     MailAddress to = new MailAddress("miaosha5s@sohu.com"); 7     MailMessage mailMessage = new MailMessage(from, to) ; 8     mailMessage.Subject="主題"; 9     mailMessage.Body="這是一封來自遠方的郵件.";   10 11     Attachment attachment01 = new Attachment("E://01.jpg"); //附件12     Attachment attachment02 = new Attachment("E://02.mp3");13     mailMessage.Attachments.Add(attachment01);14     mailMessage.Attachments.Add(attachment02);15 16     //創建SmtpClient對象      郵箱服務器smtp.163.com17     SmtpClient smtpClient = new SmtpClient("smtp.163.com");  18     smtpClient.UseDefaultCredentials = true;19     smtpClient.Credentials =20     new NetworkCredential("郵箱賬號", "登錄密碼");   //郵箱認證登錄21     //smtpClient.Timeout = 5000;22     try23     {24     //使用異步發送,不會阻塞該線程25     smtpClient.SendCompleted += new //完成發送調用回調函數26     SendCompletedEventHandler(SendCompletedCallback); 27     smtpClient.SendAsync(mailMessage, mailMessage);   28     }29     catch(Exception ex)30     {31       mailMessage.Dispose();    //主動釋放資源32       smtpClient.Dispose();33       MessageBox.Show("發送失敗!  "+System.Environment.NewLine+34                    "錯誤信息:"+ ex.Message);35     }36    return;37 }    

//異步發送完成的回調函數:

 1 //異步發送郵件完成的回調函數 2 public static void SendCompletedCallback(object sender,       3                                     AsyncCompletedEventArgs e) 4 { 5    SmtpClient smtpClient = (SmtpClient)sender; 6    //MailMessage mailMessage = (MailMessage)e.UserState; 7    if (e.Cancelled) 8    { 9      MessageBox.Show("Send canceled.");10    }11    if (e.Error != null)      12    {13      MessageBox.Show("錯誤信息: "+e.Error.ToString() );14    }15    else16    {17      MessageBox.Show("Message Sent.");18      smtpClient.Dispose();19      //mailMessage.Dispose();20    }21 }

總結:通過兩種方式實現了簡單的郵件發送功能,從中可以比較這兩種語言在實現上的差異性,

C語言的實現更加講究流程和細節,你需要比較深的懂得網絡的相關知識和SMTP的相關協議,

優點是可以更加直接的操作郵件的發送過程,缺點就是實現起來比較繁瑣,容易異常.

C#的實現就更加簡潔明了了,它封裝了郵件發送過程中的很多細節,這些細節對用戶來說并不是

必要的,使用者只需要知道幾個重要的類(MailMessage,SmtpClient類)的使用,而且程序一般會比

C程序要來的穩定,不容易發生異常錯誤.

  附:C語言實現郵件發送的程序代碼借鑒自<Windows網絡程序設計完全講義>--作者:高守傳


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 嘉峪关市| 铜山县| 通江县| 长阳| 陇川县| 泽库县| 米泉市| 荥阳市| 定南县| 江安县| 巴彦淖尔市| 清丰县| 萍乡市| 闽清县| 峨山| 兴城市| 奉新县| 抚松县| 洛浦县| 南和县| 定边县| 南漳县| 抚宁县| 老河口市| 黑河市| 罗江县| 上虞市| 余干县| 县级市| 铜梁县| 新民市| 托里县| 略阳县| 亚东县| 贵南县| 静乐县| 洛隆县| 桂林市| 张掖市| 嘉兴市| 乌海市|