C++ Builder CE ネットワークプログラミング

TIdSMTPを利用してメールを出してみる

今回は起動すると指定smtpサーバーを経由して、指定アドレスに指定サブジェクト、指定本文でのメールを送信するだけの単機能プログラムを作っておく。後で使うかも。VCLなプログラムではあるが、フォームも使わない、ユーザの操作も伴わない。という意味ではコンソールプログラムに近い

まずいつものようなフォームにコンポーネントをドロップするやり方はしない。コンポーネントは動的に割り付けて使用する。今回使うのはTIdSMTPである。まず必要なヘッダをインクルードするが、何が必要なのかを見極める必要がある。そのためには、一旦コンポーネントパレットからIndyのTIdSMTPをフォームにドロップして、Unit1.hを検分します。増えたのは、

#include <IdBaseComponent.hpp>
#include <IdComponent.hpp>
#include <IdExplicitTLSClientServerBase.hpp>
#include <IdMessageClient.hpp>
#include <IdSMTP.hpp>
#include <IdSMTPBase.hpp>
#include <IdTCPClient.hpp>
#include <IdTCPConnection.hpp>

であるが、わかればもうフォームにドロップしたIdSMTP1(インスタンス)は削除してかまわない。他のコンポーネントをドロップしていないのであれば、ctrl-xでおけ。上記のヘッダー群が残っていることを確認する。Unit1.hは、

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <IdBaseComponent.hpp>
#include <IdComponent.hpp>
#include <IdExplicitTLSClientServerBase.hpp>
#include <IdMessageClient.hpp>
#include <IdSMTP.hpp>
#include <IdSMTPBase.hpp>
#include <IdTCPClient.hpp>
#include <IdTCPConnection.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Unit1.cppは、

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{

	TIdSMTP* smtp;
	TIdMessage* msg;

	smtp = new TIdSMTP();



	smtp->Host = "192.168.0.230"; //SMTPサーバ

	msg = new TIdMessage();



	msg->From->Name = "nao";
	msg->From->Address = "nao@ghost.mydns.jp";

	TIdEMailAddressItem* to = msg->Recipients->Add();
	to->Name = "nao";
	to->Address = "nao@ghost.mydns.jp";



	msg->Subject = "notify";


	msg->Body->Text = "nothing";


	smtp->Connect();
	smtp->Send(msg);
	smtp->Disconnect();

    Application->Terminate();

}
//---------------------------------------------------------------------------

フォームを使わない、つまり表示しないので、Project1.cppを、

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
	try
	{
		Application->Initialize();
		Application->MainFormOnTaskBar = true;
		Application->CreateForm(__classid(TForm1), &Form1);
            Application->ShowMainForm = false;
		Application->Run();
	}
	catch (Exception &exception)
	{
		Application->ShowException(&exception);
	}
	catch (...)
	{
		try
		{
			throw Exception("");
		}
		catch (Exception &exception)
		{
			Application->ShowException(&exception);
		}
	}
	return 0;
}
//---------------------------------------------------------------------------

赤字部分だけ追加します。これでフォームが表示されません。挙動はコンソールプログラムの如くです。

コメント