用C语言编写一个使用SMTP协议发送邮件的代码
时间: 2023-09-16 18:13:36 浏览: 52
以下是使用C语言实现SMTP协议发送邮件的代码:
```c
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define SMTP_SERVER "smtp.example.com"
#define SMTP_PORT 25
#define BUFFER_SIZE 1024
int main() {
int sock;
struct sockaddr_in server_addr;
char buffer[BUFFER_SIZE];
// 创建套接字
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket() failed");
return 1;
}
// 设置服务器地址
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(SMTP_SERVER);
server_addr.sin_port = htons(SMTP_PORT);
// 连接服务器
if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("connect() failed");
return 1;
}
// 接收服务器的欢迎信息
if (recv(sock, buffer, BUFFER_SIZE, 0) < 0) {
perror("recv() failed");
return 1;
}
printf("%s", buffer);
// 发送 HELO 命令
sprintf(buffer, "HELO %s\r\n", SMTP_SERVER);
if (send(sock, buffer, strlen(buffer), 0) < 0) {
perror("send() failed");
return 1;
}
// 接收服务器的响应
if (recv(sock, buffer, BUFFER_SIZE, 0) < 0) {
perror("recv() failed");
return 1;
}
printf("%s", buffer);
// 发送 AUTH LOGIN 命令
if (send(sock, "AUTH LOGIN\r\n", strlen("AUTH LOGIN\r\n"), 0) < 0) {
perror("send() failed");
return 1;
}
// 接收服务器的响应
if (recv(sock, buffer, BUFFER_SIZE, 0) < 0) {
perror("recv() failed");
return 1;
}
printf("%s", buffer);
// 发送 base64 编码后的用户名
sprintf(buffer, "username\r\n"); // 将 username 替换为实际的用户名
if (send(sock, buffer, strlen(buffer), 0) < 0) {
perror("send() failed");
return 1;
}
// 接收服务器的响应
if (recv(sock, buffer, BUFFER_SIZE, 0) < 0) {
perror("recv() failed");
return 1;
}
printf("%s", buffer);
// 发送 base64 编码后的密码
sprintf(buffer, "password\r\n"); // 将 password 替换为实际的密码
if (send(sock, buffer, strlen(buffer), 0) < 0) {
perror("send() failed");
return 1;
}
// 接收服务器的响应
if (recv(sock, buffer, BUFFER_SIZE, 0) < 0) {
perror("recv() failed");
return 1;
}
printf("%s", buffer);
// 发送 MAIL FROM 命令
sprintf(buffer, "MAIL FROM:<sender@example.com>\r\n"); // 将 sender@example.com 替换为实际的发件人地址
if (send(sock, buffer, strlen(buffer), 0) < 0) {
perror("send() failed");
return 1;
}
// 接收服务器的响应
if (recv(sock, buffer, BUFFER_SIZE, 0) < 0) {
perror("recv() failed");
return 1;
}
printf("%s", buffer);
// 发送 RCPT TO 命令
sprintf(buffer, "RCPT TO:<recipient@example.com>\r\n"); // 将 recipient@example.com 替换为实际的收件人地址
if (send(sock, buffer, strlen(buffer), 0) < 0) {
perror("send() failed");
return 1;
}
// 接收服务器的响应
if (recv(sock, buffer, BUFFER_SIZE, 0) < 0) {
perror("recv() failed");
return 1;
}
printf("%s", buffer);
// 发送 DATA 命令
if (send(sock, "DATA\r\n", strlen("DATA\r\n"), 0) < 0) {
perror("send() failed");
return 1;
}
// 接收服务器的响应
if (recv(sock, buffer, BUFFER_SIZE, 0) < 0) {
perror("recv() failed");
return 1;
}
printf("%s", buffer);
// 发送邮件内容
sprintf(buffer, "Subject: Test\r\n"); // 将 Test 替换为实际的邮件主题
if (send(sock, buffer, strlen(buffer), 0) < 0) {
perror("send() failed");
return 1;
}
sprintf(buffer, "From: sender@example.com\r\n"); // 将 sender@example.com 替换为实际的发件人地址
if (send(sock, buffer, strlen(buffer), 0) < 0) {
perror("send() failed");
return 1;
}
sprintf(buffer, "To: recipient@example.com\r\n"); // 将 recipient@example.com 替换为实际的收件人地址
if (send(sock, buffer, strlen(buffer), 0) < 0) {
perror("send() failed");
return 1;
}
sprintf(buffer, "\r\nThis is a test email.\r\n"); // 将 This is a test email. 替换为实际的邮件内容
if (send(sock, buffer, strlen(buffer), 0) < 0) {
perror("send() failed");
return 1;
}
// 发送邮件结束标志
if (send(sock, "\r\n.\r\n", strlen("\r\n.\r\n"), 0) < 0) {
perror("send() failed");
return 1;
}
// 接收服务器的响应
if (recv(sock, buffer, BUFFER_SIZE, 0) < 0) {
perror("recv() failed");
return 1;
}
printf("%s", buffer);
// 发送 QUIT 命令
if (send(sock, "QUIT\r\n", strlen("QUIT\r\n"), 0) < 0) {
perror("send() failed");
return 1;
}
// 接收服务器的响应
if (recv(sock, buffer, BUFFER_SIZE, 0) < 0) {
perror("recv() failed");
return 1;
}
printf("%s", buffer);
// 关闭套接字
close(sock);
return 0;
}
```
需要将代码中的 `SMTP_SERVER`、`username`、`password`、`sender@example.com`、`recipient@example.com`、`Test` 和 `This is a test email.` 替换为实际的值。