用C语言,使用winscok库,编写一个通过SMTP协议的发送邮件的文件
时间: 2023-07-04 07:13:12 浏览: 69
好的,以下是一个使用C语言和Winsock库发送邮件的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") // 链接Winsock库
#define SERVER_ADDR "smtp.example.com" // SMTP服务器地址
#define SERVER_PORT 25 // SMTP服务器端口号
#define FROM_ADDR "sender@example.com" // 发件人邮箱地址
#define TO_ADDR "recipient@example.com" // 收件人邮箱地址
#define USERNAME "sender@example.com" // 发件人用户名
#define PASSWORD "password" // 发件人密码
int main()
{
WSADATA wsaData;
SOCKET sock;
struct sockaddr_in serverAddr;
char buf[1024];
int ret;
// 初始化Winsock库
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("WSAStartup failed!\n");
return 1;
}
// 创建套接字
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET) {
printf("socket failed: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}
// 设置服务器地址和端口号
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr(SERVER_ADDR);
serverAddr.sin_port = htons(SERVER_PORT);
// 连接服务器
if (connect(sock, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
printf("connect failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
// 接收服务器的欢迎信息
ret = recv(sock, buf, sizeof(buf), 0);
if (ret == SOCKET_ERROR) {
printf("recv failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
buf[ret] = '\0';
printf("Server: %s\n", buf);
// 发送HELO命令
sprintf(buf, "HELO %s\r\n", SERVER_ADDR);
ret = send(sock, buf, strlen(buf), 0);
if (ret == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
// 接收服务器的响应
ret = recv(sock, buf, sizeof(buf), 0);
if (ret == SOCKET_ERROR) {
printf("recv failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
buf[ret] = '\0';
printf("Server: %s\n", buf);
// 发送AUTH LOGIN命令
sprintf(buf, "AUTH LOGIN\r\n");
ret = send(sock, buf, strlen(buf), 0);
if (ret == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
// 接收服务器的响应
ret = recv(sock, buf, sizeof(buf), 0);
if (ret == SOCKET_ERROR) {
printf("recv failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
buf[ret] = '\0';
printf("Server: %s\n", buf);
// 发送用户名
sprintf(buf, "%s\r\n", USERNAME);
ret = send(sock, buf, strlen(buf), 0);
if (ret == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
// 接收服务器的响应
ret = recv(sock, buf, sizeof(buf), 0);
if (ret == SOCKET_ERROR) {
printf("recv failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
buf[ret] = '\0';
printf("Server: %s\n", buf);
// 发送密码
sprintf(buf, "%s\r\n", PASSWORD);
ret = send(sock, buf, strlen(buf), 0);
if (ret == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
// 接收服务器的响应
ret = recv(sock, buf, sizeof(buf), 0);
if (ret == SOCKET_ERROR) {
printf("recv failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
buf[ret] = '\0';
printf("Server: %s\n", buf);
// 发送MAIL FROM命令
sprintf(buf, "MAIL FROM:<%s>\r\n", FROM_ADDR);
ret = send(sock, buf, strlen(buf), 0);
if (ret == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
// 接收服务器的响应
ret = recv(sock, buf, sizeof(buf), 0);
if (ret == SOCKET_ERROR) {
printf("recv failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
buf[ret] = '\0';
printf("Server: %s\n", buf);
// 发送RCPT TO命令
sprintf(buf, "RCPT TO:<%s>\r\n", TO_ADDR);
ret = send(sock, buf, strlen(buf), 0);
if (ret == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
// 接收服务器的响应
ret = recv(sock, buf, sizeof(buf), 0);
if (ret == SOCKET_ERROR) {
printf("recv failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
buf[ret] = '\0';
printf("Server: %s\n", buf);
// 发送DATA命令
sprintf(buf, "DATA\r\n");
ret = send(sock, buf, strlen(buf), 0);
if (ret == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
// 接收服务器的响应
ret = recv(sock, buf, sizeof(buf), 0);
if (ret == SOCKET_ERROR) {
printf("recv failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
buf[ret] = '\0';
printf("Server: %s\n", buf);
// 发送邮件内容
sprintf(buf, "From: <%s>\r\n", FROM_ADDR);
send(sock, buf, strlen(buf), 0);
sprintf(buf, "To: <%s>\r\n", TO_ADDR);
send(sock, buf, strlen(buf), 0);
sprintf(buf, "Subject: Test\r\n");
send(sock, buf, strlen(buf), 0);
sprintf(buf, "\r\n");
send(sock, buf, strlen(buf), 0);
sprintf(buf, "This is a test email.\r\n");
send(sock, buf, strlen(buf), 0);
sprintf(buf, ".\r\n");
ret = send(sock, buf, strlen(buf), 0);
if (ret == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
// 接收服务器的响应
ret = recv(sock, buf, sizeof(buf), 0);
if (ret == SOCKET_ERROR) {
printf("recv failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
buf[ret] = '\0';
printf("Server: %s\n", buf);
// 发送QUIT命令
sprintf(buf, "QUIT\r\n");
ret = send(sock, buf, strlen(buf), 0);
if (ret == SOCKET_ERROR) {
printf("send failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
// 接收服务器的响应
ret = recv(sock, buf, sizeof(buf), 0);
if (ret == SOCKET_ERROR) {
printf("recv failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
buf[ret] = '\0';
printf("Server: %s\n", buf);
// 关闭套接字和Winsock库
closesocket(sock);
WSACleanup();
return 0;
}
```
请将上述代码中的`SERVER_ADDR`、`SERVER_PORT`、`FROM_ADDR`、`TO_ADDR`、`USERNAME`和`PASSWORD`分别替换为你的SMTP服务器地址、SMTP服务器端口号、发件人邮箱地址、收件人邮箱地址、发件人用户名和密码。