ページ 11

[Winsock]サーバーには接続されているのにメールが届かない

Posted: 2011年3月01日(火) 17:51
by 結城
こんにちは
またお世話になります
えー今回メールを送るコードを書いていて(猫でもわかるプログラミングから)
ソケットも正常に作成されている
サーバーにはつながっているが、メールが届かない
という謎の状況になっています

サーバーはGmailですので
SMTPアドレスはsmtp.gmail.com
送信元はhoge@gmail.com(仮)
送信先はhoge2@gmail.com(仮)
返信先はhoge@gmail.com(=送信先をコピー)
件名はtest
本文はtest text
の条件で試しましたが一向にメールが届きません

どういうわけでしょうか???
わかる方いらっしゃったらお願いいたします

環境はVisualStudio2005 C++ Express です
(2008もあるんですけどね、ちなみになぜか2010はインストールに失敗する)

コードです

コード:

#include "stdafx.h"

char szStr[1536], szStrRcv[1536];

void MyConnect(
			   HWND hWnd,
			   char szServerName[256],
			   char szFrom[256],
			   char szReplyTo[256],
			   char szTo[256],
			   char szSubject[256],
			   char szMain[512])
{
	WSADATA wsaData;
	LPHOSTENT lpHost;
	LPSERVENT lpServ;
	SOCKET s;
	int iProtocolPort;
	SOCKADDR_IN sockadd;
	if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0)
	{
		return;
	}

	lpHost = gethostbyname(szServerName);
	if (lpHost == NULL)
	{
		sprintf(szStr, "%sが見つかりません", szServerName);
		return;
	}
	s = socket(PF_INET, SOCK_STREAM, 0);
	if (s == INVALID_SOCKET)
	{
		return;
	}
	lpServ = getservbyname("mail", NULL );
	/*if (lpServ == NULL)
	{
		iProtocolPort = htons(IPPORT_SMTP);
	} else {
	}*/
	iProtocolPort = htons(587);
	sockadd.sin_family = AF_INET;
	sockadd.sin_port = iProtocolPort;
	sockadd.sin_addr = *((LPIN_ADDR)*lpHost->h_addr_list);
	int error_connect = 0;
	if (connect(s, (PSOCKADDR)&sockadd, sizeof(sockadd)))
	{
		error_connect = WSAGetLastError();
		return;
	}

	int send_e = 0;
	memset(szStrRcv, '\0', sizeof(szStrRcv));
	recv(s, szStrRcv, sizeof(szStrRcv), 0);
	strcpy(szStr, "HELO ");
	strcat(szStr, szServerName);
	strcat(szStr, "\r\n");
	send_e = send(s, szStr, strlen(szStr), 0);
	memset(szStrRcv, '\0', sizeof(szStrRcv));
	recv(s, szStrRcv, sizeof(szStrRcv), 0);

	sprintf(szStr, "MAIL FROM : <%s>\r\n", szFrom);
	send_e = send(s, szStr, strlen(szStr), 0);
	memset(szStrRcv, '\0', sizeof(szStrRcv));
	recv(s, szStrRcv, sizeof(szStrRcv), 0);

	sprintf(szStr, "RCPT TO :<%s>\r\n", szTo);
	send_e = send(s, szStr, strlen(szStr), 0);

	memset(szStrRcv, '\0', sizeof(szStrRcv));
	recv(s, szStrRcv, sizeof(szStrRcv), 0);
	strcpy(szStr, "DATA\r\n");
	send_e = send(s, szStr, strlen(szStr), 0);

	memset(szStrRcv, '\0', sizeof(szStrRcv));
	recv(s, szStrRcv, sizeof(szStrRcv), 0);
	strcpy(szStr, "X-Mailer: Nekodemo_Wakaru-Mailer\r\n");
	send_e = send(s, szStr, strlen(szStr), 0);

	if (strcmp(szReplyTo, "") != 0)
	{
		sprintf(szStr, "Reply-To: %s\r\n", szReplyTo);
		send_e = send(s, szStr, strlen(szStr), 0);
	}else{
		sprintf(szStr, "Reply-To: %s\r\n", szFrom);
		send_e = send(s, szStr, strlen(szStr), 0);
	}
	
	if (strcmp(szSubject, "") ==0)
	{
		strcpy(szSubject,"None");
	}
	sprintf(szStr, "Subject: %s \r\n", szSubject);
	send_e = send(s, szStr, strlen(szStr), 0);
	//ここでもう一度「\r\n」を送信しておかないと //本文に日本語を使う場合1行目が文字化けします
	strcpy(szStr, "\r\n");
	send_e = send(s, szStr, strlen(szStr), 0);
	
	strcpy(szStr,szMain);
	send_e = send(s, szStr, strlen(szStr), 0);
	strcpy(szStr, ".\r\n");
	send_e = send(s, szStr, strlen(szStr), 0);
	memset(szStrRcv, '\0', sizeof(szStrRcv));
	recv(s, szStrRcv, sizeof(szStrRcv), 0);
	strcpy(szStr, "QUIT\r\n");
	send_e = send(s, szStr, strlen(szStr), 0);
	memset(szStrRcv, '\0', sizeof(szStrRcv));
	recv(s, szStrRcv, sizeof(szStrRcv), 0);
	closesocket(s);
	WSACleanup();
	MessageBox(hWnd, L"通信を終了しました", L"OK", MB_OK);
	return;
}



Re: [Winsock]サーバーには接続されているのにメールが届かない

Posted: 2011年3月01日(火) 18:08
by softya(ソフト屋)
Gmailだと認証やら暗号通信が必須です。
何処かでエラーが返って来ていませんか?

[追記]
勘違いされている方も多いので書いておきます。
VBはVisualBasicで別の言語の略称です。
なのでVB2005 C++ではなく、VisualStudio2005 C++かVS2005 C++が正しいです。
ちなみに、VS2005 C++と書くと有料版だと思われてしまいますので、無料のExpressの場合はVC++2005Expressと書くのが良いかと思います。

Re: [Winsock]サーバーには接続されているのにメールが届かない

Posted: 2011年3月01日(火) 18:18
by 結城
あ、すみません書き間違えました修正しておきます

ホームページを見たところそんなようなことが書いてありましたが
やはりそうだったのですか……

SMTPサーバーへの接続でパスワード認証をすることというのは出来るのでしょうか?

Re: [Winsock]サーバーには接続されているのにメールが届かない

Posted: 2011年3月01日(火) 18:48
by softya(ソフト屋)
私も暗号認証や暗号通信が必要なメールサーバへの接続はしたことがないので、これといった答えは持っていません。
検索したこともないので、軽く検索してみましたが楽に出来そうな方法は無さそうです。
OpenSSLやSMTPsなどいろいろ調べれば参考コードが見つかるかも知れませんが日本国内だと難しいかも知れませんね。
何らかのライブラリを見つければ接続することは難しくはないと思います(Winsockの勉強にはなりませんが)

Re: [Winsock]サーバーには接続されているのにメールが届かない

Posted: 2011年3月01日(火) 19:15
by 結城
そうなのですか...詳しい情報をありがとうございます
すこしSMTPsについて調べてみてまたわからないことがあったら聞きたいと思います

とりあえず解決ということにします