<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      C 語言使用 SMTP 協議發送郵件

      操作系統:Windows 7 (32-bit);編譯器:Tiny C Compiler 0.9.27。

      0. SMTP 協議通信流程

      1. 與服務器端建立 TCP 連接
      2. 發送 HELO <name> 命令標識發件人
      3. 發送 AUTH LOGIN 命令開始登錄
      4. 發送用戶名(經過 Base64 編碼)
      5. 發送密碼(經過 Base64 編碼)
      6. 發送發件人郵箱地址 MAIL FROM: <addr>
      7. 發送收件人郵箱地址 RCPT TO: <addr>
      8. 發送 DATA 命令開始發送郵件正文
      9. 發送郵件正文(以 \r\n.\r\n 結束)
      10. 發送 QUIT 命令結束

      注:每行命令都要以 \r\n 結尾。

      1. 實現 Base64 編碼

      使用共用體。

      #include <string.h>
      
      // 查表
      #define BASE_TAB \
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
        "abcdefghijklmnopqrstuvwxyz" "0123456789+/"
      
      union base64_t {
          struct {
              unsigned c: 8;
              unsigned b: 8;
              unsigned a: 8;
          } src;
          struct {
              unsigned d: 6;
              unsigned c: 6;
              unsigned b: 6;
              unsigned a: 6;
          } res;
      };
      
      void _base64(char *res, char *src) {
          union base64_t data;
          data.src.a = (unsigned)src[0];
          data.src.b = (unsigned)src[1];
          data.src.c = (unsigned)src[2];
          res[0] = BASE_TAB[data.res.a];
          res[1] = BASE_TAB[data.res.b];
          res[2] = BASE_TAB[data.res.c];
          res[3] = BASE_TAB[data.res.d];
      }
      
      void base64(char *res, char *src) {
          int len = strlen(src);
          // src 中的每 3 個字符做一次操作
          while (*src != 0) {
              _base64(res, src);
              // 若 len 不是 3 的倍數, 則 res 末尾會有若干個 0
              src += 3, res += 4;
          }
          // 填充 '='
          if (len % 3 != 0) {
              // 先回退
              res -= (3 - len % 3);
              // 再填充
              memset(res, '=', 3 - len % 3);
          }
      }
      

      對于共用體中 d b c a 的順序,可參見這篇文章

      2. 關于建立連接和發送、接收數據

      將其封裝為函數或宏,便于使用。

      #include <string.h>
      #include <winsock2.h>
      
      #define ADDR_SIZE  sizeof(struct sockaddr)
      #define ADDR_OF(p) (struct sockaddr *)(p)
      
      // 發送數據
      #define snsend(sock, str, len, ...) \
          do { memset(str, 0, len); \
               snprintf(str, len, __VA_ARGS__); \
               send(sock, str, strlen(str), 0); \
          } while (0);
      
      // 接收數據
      #define snrecv(sock, str, len) \
          do { memset(str, 0, len); \
               recv(sock, str, len, 0); \
          } while (0);
      
      // 客戶端建立服務器端連接
      SOCKET client(char *ip, int port) {
          SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
          struct sockaddr_in addr;
          addr.sin_family = AF_INET;
          addr.sin_addr.s_addr = inet_addr(ip);
          addr.sin_port = htons(port);
          connect(sock, ADDR_OF(&addr), ADDR_SIZE);
          return sock;
      }
      

      3. 發送郵件函數

      #include <stdio.h>
      #include <string.h>
      
      // 字符串和緩沖區大小
      #define STR_SIZE  256
      // 郵箱服務器 IP 和端口
      #define SMTP_ADDR "8.8.8.8"
      #define SMTP_PORT 25
      
      typedef char string[STR_SIZE];
      
      // 此處 pass 需要事先在函數外 Base64 編碼,而 user 不需要
      void send_email(char *user, char *pass, char *addr, char *body) {
          SOCKET sock =  0;
          string buf  = {0}; // 發送緩沖區
          string rbuf = {0}; // 接收緩沖區
          string tmp  = {0};
      
          sock = client(SMTP_ADDR, SMTP_PORT);
          snrecv(sock, rbuf, STR_SIZE);
          // printf("%s", rbuf); // 顯示服務器返回信息
      
          // HELO & AUTH LOGIN
          snsend(sock, buf, STR_SIZE, "HELO smtp\r\n");
          snrecv(sock, rbuf, STR_SIZE);
          // printf("%s", rbuf); // 顯示服務器返回信息
          snsend(sock, buf, STR_SIZE, "AUTH LOGIN\r\n");
          snrecv(sock, rbuf, STR_SIZE);
          // printf("%s", rbuf); // 顯示服務器返回信息
      
          // 用戶名 & 密碼
          base64(tmp, user);
          snsend(sock, buf, STR_SIZE, "%s\r\n", tmp);
          snrecv(sock, rbuf, STR_SIZE);
          // printf("%s", rbuf); // 顯示服務器返回信息
          snsend(sock, buf, STR_SIZE, "%s\r\n", pass);
          snrecv(sock, rbuf, STR_SIZE);
          // printf("%s", rbuf); // 顯示服務器返回信息
      
          // MAIL FROM & RCPT TO
          snsend(sock, buf, STR_SIZE, "MAIL FROM: <%s>\r\n", user)
          snrecv(sock, rbuf, STR_SIZE);
          // printf("%s", rbuf); // 顯示服務器返回信息
          snsend(sock, buf, STR_SIZE, "RCPT TO: <%s>\r\n", addr);
          snrecv(sock, rbuf, STR_SIZE);
          // printf("%s", rbuf); // 顯示服務器返回信息
      
          // DATA & 郵件正文
          snsend(sock, buf, STR_SIZE, "DATA\r\n");
          snrecv(sock, rbuf, STR_SIZE);
          // printf("%s", rbuf); // 顯示服務器返回信息
          snsend(sock, buf, STR_SIZE, "%s\r\n.\r\n", body);
          snrecv(sock, rbuf, STR_SIZE);
          // printf("%s", rbuf); // 顯示服務器返回信息
      
          // QUIT
          snsend(sock, buf, STR_SIZE, "QUIT\r\n");
          snrecv(sock, rbuf, STR_SIZE);
          // printf("%s", rbuf); // 顯示服務器返回信息
          closesocket(sock);
      }
      

      4. 測試用例

      int main(void) {
          char tmp[STR_SIZE] = {0};
          char *user = "alice@a.com";
          char *pass = "password";
          char *addr = "bob@b.com";
          char *body = "From: \"alice\"<a@a.com>\r\n" \
                       "To: \"bob\"<b@b.com>\r\n" \
                       "Subject: Hello\r\n\r\n" \
                       "Hello, world!";
          base64(tmp, pass);
          send_email(user, tmp, addr, body);
          return 0;
      }
      

      posted on 2021-07-23 23:56  UXOD  閱讀(576)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 91精品国产午夜福利| 日本阿v片在线播放免费| 国产av普通话对白国语| 在线高清免费不卡全码| 日韩一区二区三区水蜜桃| 国产在线精品中文字幕| 精品国产女同疯狂摩擦2| 中文字幕乱码一区二区免费| 中文字幕一区二区精品区| 国产精品欧美福利久久| 无码va在线观看| 亚洲国产另类久久久精品| 亚洲综合久久精品哦夜夜嗨| 亚洲国产色播AV在线| 亚洲日韩精品无码一区二区三区| 久久人人97超碰人人澡爱香蕉| 四虎影视国产精品永久在线| 亚洲成a人v欧美综合天堂下载 | 色播久久人人爽人人爽人人片av| 蜜桃臀av一区二区三区| 午夜夜福利一区二区三区| 成全我在线观看免费第二季| 国精品91人妻无码一区二区三区| JIZZJIZZ国产| 久热这里只有精品6| 免费 黄 色 人成 视频 在 线| 国内精品大秀视频日韩精品| 国产午夜亚洲精品不卡网站| 浠水县| 亚洲熟女精品一区二区| 2021亚洲国产精品无码| 久久国产精品波多野结衣av| 国产精品成人午夜久久| 亚洲精品一区二区美女| 亚洲综合精品第一页| 免费成人网一区二区天堂| 91精品国产91热久久久久福利| 女人张开腿让男人桶爽| 国产播放91色在线观看| 亚洲国产大胸一区二区三区| 亚洲人妻精品一区二区|