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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
結城
記事: 52
登録日時: 14年前
連絡を取る:

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

#1

投稿記事 by 結城 » 14年前

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

サーバーは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;
}


最後に編集したユーザー 結城 on 2011年3月01日(火) 18:24 [ 編集 1 回目 ]
ANGE;ART

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 14年前

Gmailだと認証やら暗号通信が必須です。
何処かでエラーが返って来ていませんか?

[追記]
勘違いされている方も多いので書いておきます。
VBはVisualBasicで別の言語の略称です。
なのでVB2005 C++ではなく、VisualStudio2005 C++かVS2005 C++が正しいです。
ちなみに、VS2005 C++と書くと有料版だと思われてしまいますので、無料のExpressの場合はVC++2005Expressと書くのが良いかと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
結城
記事: 52
登録日時: 14年前
連絡を取る:

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

#3

投稿記事 by 結城 » 14年前

あ、すみません書き間違えました修正しておきます

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 14年前

私も暗号認証や暗号通信が必要なメールサーバへの接続はしたことがないので、これといった答えは持っていません。
検索したこともないので、軽く検索してみましたが楽に出来そうな方法は無さそうです。
OpenSSLやSMTPsなどいろいろ調べれば参考コードが見つかるかも知れませんが日本国内だと難しいかも知れませんね。
何らかのライブラリを見つければ接続することは難しくはないと思います(Winsockの勉強にはなりませんが)
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
結城
記事: 52
登録日時: 14年前
連絡を取る:

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

#5

投稿記事 by 結城 » 14年前

そうなのですか...詳しい情報をありがとうございます
すこしSMTPsについて調べてみてまたわからないことがあったら聞きたいと思います

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

閉鎖

“C言語何でも質問掲示板” へ戻る