C语言发送邮件

Python022

C语言发送邮件,第1张

基本框架就是这,需要其他功能自己添加吧

C语言实现简单的SMTP发送邮件

#include <windows.h>

#include <stdio.h>

#include <WinSock.h>

#include <iostream>

using namespace std

#pragma comment(lib, "ws2_32.lib")

struct Base64Date6

{

unsigned int d4:6

unsigned int d3:6

unsigned int d2:6

unsigned int d1:6

}

// 协议中加密部分使用的是base64方法

char ConvertToBase64 (char c6)

void EncodeBase64 (char *dbuf, char *buf128, int len)

void SendMail (char *email,char *body)

int OpenSocket (struct sockaddr *addr)

int main()

{

char EmailTo[] = "[email protected]"

char EmailContents[] = "From: \"lucy\"[email protected]>\r\n"

"To: \"dasiy\"[email protected]>\r\n"

"Subject: Hello\r\n\r\n"

"Hello World, Hello Email!"

SendMail(EmailTo, EmailContents)

return 0

}

char ConvertToBase64(char uc)

{

if(uc <26)

{

return 'A' + uc

}

if(uc <52)

{

return 'a' + (uc - 26)

}

if(uc <62)

{

return '0' + (uc - 52)

}

if(uc == 62)

{

return '+'

}

return '/'

}

// base64的实现

void EncodeBase64(char *dbuf, char *buf128, int len)

{

struct Base64Date6 *ddd = NULL

int i= 0

char buf[256] = {0}

char *tmp = NULL

char cc = '\0'

memset(buf, 0, 256)

strcpy_s(buf, 256, buf128)

for(i = 1i <= len/3i++)

{

tmp = buf + (i-1)*3

cc = tmp[2]

tmp[2] = tmp[0]

tmp[0] = cc

ddd = (struct Base64Date6 *)tmp

dbuf[(i-1)*4+0] = ConvertToBase64((unsigned int)ddd->d1)

dbuf[(i-1)*4+1] = ConvertToBase64((unsigned int)ddd->d2)

dbuf[(i-1)*4+2] = ConvertToBase64((unsigned int)ddd->d3)

dbuf[(i-1)*4+3] = ConvertToBase64((unsigned int)ddd->d4)

}

if(len % 3 == 1)

{

tmp = buf + (i-1)*3

cc = tmp[2]

tmp[2] = tmp[0]

tmp[0] = cc

ddd = (struct Base64Date6 *)tmp

dbuf[(i-1)*4+0] = ConvertToBase64((unsigned int)ddd->d1)

dbuf[(i-1)*4+1] = ConvertToBase64((unsigned int)ddd->d2)

dbuf[(i-1)*4+2] = '='

dbuf[(i-1)*4+3] = '='

}

if(len%3 == 2)

{

tmp = buf+(i-1)*3

cc = tmp[2]

tmp[2] = tmp[0]

tmp[0] = cc

ddd = (struct Base64Date6 *)tmp

dbuf[(i-1)*4+0] = ConvertToBase64((unsigned int)ddd->d1)

dbuf[(i-1)*4+1] = ConvertToBase64((unsigned int)ddd->d2)

dbuf[(i-1)*4+2] = ConvertToBase64((unsigned int)ddd->d3)

dbuf[(i-1)*4+3] = '='

}

return

}

// 发送邮件

void SendMail(char *email, char *body)

{

int sockfd = {0}

charbuf[1500] = {0}

charrbuf[1500] = {0}

charlogin[128] = {0}

charpass[128] = {0}

WSADATA WSAData

struct sockaddr_in their_addr = {0}

WSAStartup(MAKEWORD(2, 2), &WSAData)

memset(&their_addr, 0, sizeof(their_addr))

their_addr.sin_family = AF_INET

their_addr.sin_port = htons(25)

hostent* hptr = gethostbyname("smtp.126.com")

memcpy(&their_addr.sin_addr.S_un.S_addr, hptr->h_addr_list[0], hptr->h_length)

printf("IP of smpt.126.com is : %d:%d:%d:%d\n",

their_addr.sin_addr.S_un.S_un_b.s_b1,

their_addr.sin_addr.S_un.S_un_b.s_b2,

their_addr.sin_addr.S_un.S_un_b.s_b3,

their_addr.sin_addr.S_un.S_un_b.s_b4)

// 连接邮件服务器,如果连接后没有响应,则2 秒后重新连接

sockfd = OpenSocket((struct sockaddr *)&their_addr)

memset(rbuf, 0, 1500)

while(recv(sockfd, rbuf, 1500, 0) == 0)

{

cout<<"reconnect..."<<endl

Sleep(2)

sockfd = OpenSocket((struct sockaddr *)&their_addr)

memset(rbuf, 0, 1500)

}

cout<<rbuf<<endl

// EHLO

memset(buf, 0, 1500)

sprintf_s(buf, 1500, "EHLO HYL-PC\r\n")

send(sockfd, buf, strlen(buf), 0)

memset(rbuf, 0, 1500)

recv(sockfd, rbuf, 1500, 0)

cout<<"EHLO REceive: "<<rbuf<<endl

// AUTH LOGIN

memset(buf, 0, 1500)

sprintf_s(buf, 1500, "AUTH LOGIN\r\n")

send(sockfd, buf, strlen(buf), 0)

memset(rbuf, 0, 1500)

recv(sockfd, rbuf, 1500, 0)

cout<<"Auth Login Receive: "<<rbuf<<endl

// USER

memset(buf, 0, 1500)

sprintf_s(buf, 1500, "[email protected]")//你的邮箱账号

memset(login, 0, 128)

EncodeBase64(login, buf, strlen(buf))

sprintf_s(buf, 1500, "%s\r\n", login)

send(sockfd, buf, strlen(buf), 0)

cout<<"Base64 UserName: "<<buf<<endl

memset(rbuf, 0, 1500)

recv(sockfd, rbuf, 1500, 0)

cout<<"User Login Receive: "<<rbuf<<endl

// PASSWORD

sprintf_s(buf, 1500, "XXXXXXXXXXXX")//你的邮箱密码

memset(pass, 0, 128)

EncodeBase64(pass, buf, strlen(buf))

sprintf_s(buf, 1500, "%s\r\n", pass)

send(sockfd, buf, strlen(buf), 0)

cout<<"Base64 Password: "<<buf<<endl

memset(rbuf, 0, 1500)

recv(sockfd, rbuf, 1500, 0)

cout<<"Send Password Receive: "<<rbuf<<endl

// MAIL FROM

memset(buf, 0, 1500)

sprintf_s(buf, 1500, "MAIL FROM: [email protected]>\r\n")

send(sockfd, buf, strlen(buf), 0)

memset(rbuf, 0, 1500)

recv(sockfd, rbuf, 1500, 0)

cout<<"set Mail From Receive: "<<rbuf<<endl

// RCPT TO 第一个收件人

sprintf_s(buf, 1500, "RCPT TO:<%s>\r\n", email)

send(sockfd, buf, strlen(buf), 0)

memset(rbuf, 0, 1500)

recv(sockfd, rbuf, 1500, 0)

cout<<"Tell Sendto Receive: "<<rbuf<<endl

// DATA 准备开始发送邮件内容

sprintf_s(buf, 1500, "DATA\r\n")

send(sockfd, buf, strlen(buf), 0)

memset(rbuf, 0, 1500)

recv(sockfd, rbuf, 1500, 0)

cout<<"Send Mail Prepare Receive: "<<rbuf<<endl

// 发送邮件内容,\r\n.\r\n内容结束标记

sprintf_s(buf, 1500, "%s\r\n.\r\n", body)

send(sockfd, buf, strlen(buf), 0)

memset(rbuf, 0, 1500)

recv(sockfd, rbuf, 1500, 0)

cout<<"Send Mail Receive: "<<rbuf<<endl

// QUIT

sprintf_s(buf, 1500, "QUIT\r\n")

send(sockfd, buf, strlen(buf), 0)

memset(rbuf, 0, 1500)

recv(sockfd, rbuf, 1500, 0)

cout<<"Quit Receive: "<<rbuf<<endl

//清理工作

closesocket(sockfd)

WSACleanup()

return

}

// 打开TCP Socket连接

int OpenSocket(struct sockaddr *addr)

{

int sockfd = 0

sockfd=socket(PF_INET, SOCK_STREAM, 0)

if(sockfd <0)

{

cout<<"Open sockfd(TCP) error!"<<endl

exit(-1)

}

if(connect(sockfd, addr, sizeof(struct sockaddr)) <0)

{

cout<<"Connect sockfd(TCP) error!"<<endl

exit(-1)

}

return sockfd

}

#include "stdio.h"

void main()

{

float a,b

printf("请输入包裹的重量(公斤):\n")

scanf("%f",&a)

if(a<=1)

b=1.5

else

{

b=1.5+(a-1)*0.8

}

printf("此包裹的邮费为:%.2f元",b)

}

#include<iostream>

using namespace std

int main()

{

float a

cin>>a

if(a<=1)cout<<1.5*a<<endl

if(a>1)cout<<1.5+2.3*a<<endl

return 0

}

第二题:#include<iostream>

using namespace std

int main()

{

int a,b1,b2,b3,c

cin>>a

b1=a/100

b2=a%100/10

b3=a%10

if(b2<b3)

{c=b3b3=b2b2=c}

if(b1<b2)

{c=b2b2=b1b1=c}

if(b2<b3)

{c=b3b3=b2b2=c}

cout<<b1*100+b2*10+b3<<endl

return 0

}