あけましておめでとうございます。
毎年、適当な言語を選んで、あけましておめでとうメールを送っています。
今年は、FreePascalにしてみました。やっぱinnosetup scriptはちょいと違うもんですね。
環境
- CentOS6.6 x86_64
- Free Pascal 2.6.4
- Synapse (TCP/IPライブラリ)
Free Pascalのインストール
http://www.freepascal.org/
RPMをダウンロードしてインストール。
Synapseのインストール
SynapseはPascalの TCP/IPライブラリです。メールの送受信だけでなくFTPやSSHなど様々なプロトコルを対応しています。
Synapseのインストールは http://www.ararat.cz/synapse/doku.php/download ここからダウンロードしてどこかに展開して終わり。
unitのサーチパスは、/etc/fpc.cfg に追加 もしくは、コンパイルの際に-Fuでパスを指定してください。
コンパイル & 実行
適当に本文のテキストをbody.txtに書いてSJISで保存してください。
あとは実行するだけ。
$ make -f Makefile all
$ ./newyear_mail
Makefile
Makefile
LDM = newyear_mail
UNITDIR = ./synapse
FPCFLAGS = -Px86_64 -Fu$(UNITDIR)
all : $(LDM)
$(LDM) : $(LDM).pas
@rm -f $(LDM).o
fpc $(FPCFLAGS) $(LDM).pas
clean :
rm -f $(LDM) $(LDM).o
コード
TLSなgmail経由で送ったほうが良いでしょうけど、今回はsmtp認証でloginメソッド版です。
newyear_mail.pas
program NewYearMail;
{$mode objfpc}
uses
Classes, Sysutils, blcksock, smtpsend;
procedure SendMail(
User, Password, SMTPHost, SMTPPort: string;
mailfrom, mailto, mailsubject: string;
mailbody: TStringList
);
var
SMTP: TSMTPSend;
ret: Boolean;
i: integer;
maildata: TStringList;
begin
SMTP := TSMTPSend.Create;
maildata := TStringList.Create;
maildata.Add('Mime-Version: 1.0');
maildata.Add('Content-Transfer-Encoding: 7bit');
maildata.Add('Content-Type: Text/Plain; charset=iso-2022-jp');
maildata.Add('From: ' + mailfrom);
maildata.Add('To: ' + mailto);
maildata.Add('Subject: ' + mailsubject);
maildata.Add('');
for i := 0 to mailbody.Count -1 do begin
maildata.Add(mailbody[i]);
end;
try
SMTP.UserName := User;
SMTP.Password := Password;
SMTP.TargetHost := SMTPHost;
SMTP.TargetPort := SMTPPort;
if SMTP.Login then
begin
ret := SMTP.MailFrom(mailfrom, Length(mailfrom)) and SMTP.MailTo(mailto) and SMTP.Maildata(maildata);
SMTP.Logout;
end;
finally
SMTP.Free;
end;
end;
var
list: TStringList;
i: Integer;
FileName: TextFile;
buff: String;
body: TStringList;
begin
list := TStringList.Create;
body := TStringList.Create;
list.Add('foo@example.com');
list.Add('hoge@example.com');
list.Add('bar@example.com');
AssignFile(FileName, 'body.txt');
try
Reset(FileName);
repeat
Readln(FileName, buff);
body.Add(buff);
until(EOF(FileName));
CloseFile(FileName);
except
on E: EinOutError do
begin
Writeln('File handling error occurred. Details: '+E.ClassName+'/'+E.Message);
end;
end;
for i := 0 to list.Count -1 do begin
SendMail(
'dharry',
'mypassword',
'example.jp',
'587',
'dharry@example.jp',
list[i],
'I wish you a Happy new year 2015!',
body
);
WriteLn(list[i]);
end;
end.