LoginSignup
1
1

More than 5 years have passed since last update.

Free Pascal であけましておめでとうございます!

Posted at

あけましておめでとうございます。
毎年、適当な言語を選んで、あけましておめでとうメールを送っています。
今年は、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.
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1