#6
by DAICHI0922 » 6年前
ありがとうございます。
なんとか、SMTPとの会話に持ち込めました。しかし...
MAIL FROMで切断されてしまうようです...
先の返信でもMAIL FROMでエラーになるとおっしゃっていますが、どうにかなりませんか。
コード:
------------出力結果-----------
WinSock初期化成功
ソケット作成成功
ホストアドレス取得成功
サーバとの接続を確立
応答を受信中...
220 smtp-relay.gmail.com ESMTP v191sm1186935itb.7 - gsmtp
Request > EHLO test.gmail.com
サーバーにリクエスト開始... (EHLO test.gmail.com)
応答を受信中...
250-smtp-relay.gmail.com at your service, [59.147.248.66]
Request >
サーバーにリクエスト開始... ()
応答を受信中...
250-SIZE 157286400
250-8BITMIME
250-STARTTLS
250-ENHANCE
Request > STARTTLS
サーバーにリクエスト開始... (STARTTLS)
応答を受信中...
DSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
Request > SMTPUTF8
サーバーにリクエスト開始... (SMTPUTF8)
応答を受信中...
220 2.0.0 Ready to start TLS
Request > MAIL FROM:<test1234@gmail.com>
サーバーにリクエスト開始... (MAIL FROM:<test1234@gmail.com>)
サーバへの送信失敗です
エラー10054が発生しました
続行するには何かキーを押してください . . .
コード:
#include <iostream>
#include <string>
#include <winsock.h>
#pragma comment(lib, "wsock32.lib")
#define WIN32_LEAN_AND_MEAN
char ServerName[] = "smtp-relay.gmail.com"; // 接続先のホスト名
unsigned short Port = 587; //smtpポート
using namespace std;
#define BUFSIZE 2600 // バッファサイズ
#define RECVSIZE 65536 // 受信バッファサイズ
int main() {
// WinSock初期化
WORD wVersionRequested = MAKEWORD(1, 1);
WSADATA wsaData;
int nErrorStatus;
nErrorStatus = WSAStartup(wVersionRequested, &wsaData);
if (atexit((void(*)(void))(WSACleanup))) {
printf("atexit(WSACleanup)失敗\n");
return -1;
}
if (nErrorStatus != 0) {
printf("初期化失敗です\n");
return -1;
}
cout << "WinSock初期化成功" << endl;
// ソケット作成
int soc; // ソケット
soc = socket(AF_INET, SOCK_STREAM, 0);
if (soc == INVALID_SOCKET) {
printf("ソケット作成失敗です\n");
printf("エラー%dが発生しました\n", WSAGetLastError());
return -1;
}
cout << "ソケット作成成功" << endl;
// サーバのIPアドレス取得
PHOSTENT phostent;
unsigned long ulIPAddress; // サーバのIPアドレス格納変数
ulIPAddress = inet_addr(ServerName); // IPアドレス取得
// inet_addr()関数が失敗したら
if (ulIPAddress == -1) {
if ((phostent = gethostbyname(ServerName)) != NULL) {
ulIPAddress = *((unsigned long *)(phostent->h_addr));
}
else {
printf("ホストアドレス取得失敗です\n");
printf("エラー%dが発生しました\n", WSAGetLastError());
closesocket(soc);
return -1;
}
}
cout << "ホストアドレス取得成功" << endl;
// サーバへ接続
SOCKADDR_IN addrServer; // サーバのアドレス
addrServer.sin_family = AF_INET; // アドレスファミリの指定
addrServer.sin_addr.s_addr = ulIPAddress; // サーバのIPアドレスの指定
addrServer.sin_port = htons((unsigned short)Port); // ポート番号の指定
if (connect(soc, (LPSOCKADDR)&addrServer, sizeof(addrServer)) == SOCKET_ERROR) {
printf("サーバへの接続失敗です\n");
printf("エラー%dが発生しました\n", WSAGetLastError());
closesocket(soc);
return -1;
}
cout << "サーバとの接続を確立" << endl;
// リクエストを送信
//DWORD dwNonBlocking = 1;
//ioctlsocket(soc, FIONBIO, &dwNonBlocking);
for (;;) {
// データの受信
char recv_buf[RECVSIZE];
cout << "応答を受信中...\n" << endl;
int nBytesRecv = recv(soc, recv_buf, strlen(recv_buf), 0); //ここで止まったまま
if (nBytesRecv == SOCKET_ERROR) {
printf("サーバからの受信失敗です\n");
printf("エラー%dが発生しました\n", WSAGetLastError());
break;
}
recv_buf[nBytesRecv] = '\0'; // 受信バッファの後ろにNULLを付加する
printf("%s", recv_buf); // 受信した内容を表示
string Rec;
cout << "\n\nRequest > "; getline(cin, Rec);
char request[BUFSIZE];
cout << "\nサーバーにリクエスト開始... (" << Rec << ")" << endl;
//sprintf_s(request, BUFSIZE, "%s",);
Rec += "\r\n";
if (send(soc, Rec.c_str(), strlen(Rec.c_str()), 0) == SOCKET_ERROR) {
printf("サーバへの送信失敗です\n");
printf("エラー%dが発生しました\n", WSAGetLastError());
shutdown(soc, 2);
closesocket(soc);
return -1;
}
}
shutdown(soc, 2);
closesocket(soc);
return 0;
}
ありがとうございます。
なんとか、SMTPとの会話に持ち込めました。しかし...
MAIL FROMで切断されてしまうようです...
先の返信でもMAIL FROMでエラーになるとおっしゃっていますが、どうにかなりませんか。
[code]
------------出力結果-----------
WinSock初期化成功
ソケット作成成功
ホストアドレス取得成功
サーバとの接続を確立
応答を受信中...
220 smtp-relay.gmail.com ESMTP v191sm1186935itb.7 - gsmtp
Request > EHLO test.gmail.com
サーバーにリクエスト開始... (EHLO test.gmail.com)
応答を受信中...
250-smtp-relay.gmail.com at your service, [59.147.248.66]
Request >
サーバーにリクエスト開始... ()
応答を受信中...
250-SIZE 157286400
250-8BITMIME
250-STARTTLS
250-ENHANCE
Request > STARTTLS
サーバーにリクエスト開始... (STARTTLS)
応答を受信中...
DSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
Request > SMTPUTF8
サーバーにリクエスト開始... (SMTPUTF8)
応答を受信中...
220 2.0.0 Ready to start TLS
Request > MAIL FROM:<test1234@gmail.com>
サーバーにリクエスト開始... (MAIL FROM:<test1234@gmail.com>)
サーバへの送信失敗です
エラー10054が発生しました
続行するには何かキーを押してください . . .
[/code]
[code]
#include <iostream>
#include <string>
#include <winsock.h>
#pragma comment(lib, "wsock32.lib")
#define WIN32_LEAN_AND_MEAN
char ServerName[] = "smtp-relay.gmail.com"; // 接続先のホスト名
unsigned short Port = 587; //smtpポート
using namespace std;
#define BUFSIZE 2600 // バッファサイズ
#define RECVSIZE 65536 // 受信バッファサイズ
int main() {
// WinSock初期化
WORD wVersionRequested = MAKEWORD(1, 1);
WSADATA wsaData;
int nErrorStatus;
nErrorStatus = WSAStartup(wVersionRequested, &wsaData);
if (atexit((void(*)(void))(WSACleanup))) {
printf("atexit(WSACleanup)失敗\n");
return -1;
}
if (nErrorStatus != 0) {
printf("初期化失敗です\n");
return -1;
}
cout << "WinSock初期化成功" << endl;
// ソケット作成
int soc; // ソケット
soc = socket(AF_INET, SOCK_STREAM, 0);
if (soc == INVALID_SOCKET) {
printf("ソケット作成失敗です\n");
printf("エラー%dが発生しました\n", WSAGetLastError());
return -1;
}
cout << "ソケット作成成功" << endl;
// サーバのIPアドレス取得
PHOSTENT phostent;
unsigned long ulIPAddress; // サーバのIPアドレス格納変数
ulIPAddress = inet_addr(ServerName); // IPアドレス取得
// inet_addr()関数が失敗したら
if (ulIPAddress == -1) {
if ((phostent = gethostbyname(ServerName)) != NULL) {
ulIPAddress = *((unsigned long *)(phostent->h_addr));
}
else {
printf("ホストアドレス取得失敗です\n");
printf("エラー%dが発生しました\n", WSAGetLastError());
closesocket(soc);
return -1;
}
}
cout << "ホストアドレス取得成功" << endl;
// サーバへ接続
SOCKADDR_IN addrServer; // サーバのアドレス
addrServer.sin_family = AF_INET; // アドレスファミリの指定
addrServer.sin_addr.s_addr = ulIPAddress; // サーバのIPアドレスの指定
addrServer.sin_port = htons((unsigned short)Port); // ポート番号の指定
if (connect(soc, (LPSOCKADDR)&addrServer, sizeof(addrServer)) == SOCKET_ERROR) {
printf("サーバへの接続失敗です\n");
printf("エラー%dが発生しました\n", WSAGetLastError());
closesocket(soc);
return -1;
}
cout << "サーバとの接続を確立" << endl;
// リクエストを送信
//DWORD dwNonBlocking = 1;
//ioctlsocket(soc, FIONBIO, &dwNonBlocking);
for (;;) {
// データの受信
char recv_buf[RECVSIZE];
cout << "応答を受信中...\n" << endl;
int nBytesRecv = recv(soc, recv_buf, strlen(recv_buf), 0); //ここで止まったまま
if (nBytesRecv == SOCKET_ERROR) {
printf("サーバからの受信失敗です\n");
printf("エラー%dが発生しました\n", WSAGetLastError());
break;
}
recv_buf[nBytesRecv] = '\0'; // 受信バッファの後ろにNULLを付加する
printf("%s", recv_buf); // 受信した内容を表示
string Rec;
cout << "\n\nRequest > "; getline(cin, Rec);
char request[BUFSIZE];
cout << "\nサーバーにリクエスト開始... (" << Rec << ")" << endl;
//sprintf_s(request, BUFSIZE, "%s",);
Rec += "\r\n";
if (send(soc, Rec.c_str(), strlen(Rec.c_str()), 0) == SOCKET_ERROR) {
printf("サーバへの送信失敗です\n");
printf("エラー%dが発生しました\n", WSAGetLastError());
shutdown(soc, 2);
closesocket(soc);
return -1;
}
}
shutdown(soc, 2);
closesocket(soc);
return 0;
}
[/code]