8 3 7 LANSA電子メール関数のサンプル

IBM i LANSA

8.3.7 LANSA電子メール関数のサンプル

LANSAの関数のこの例は、一般的に、IBM iのスプール・ファイル(つまり、レポート)をコピーして、指定のアドレスにそれを電子メールで送信します。Visual LANSAを持っている場合は、この例をシステムに直接カット・アンド・ペーストして、IBM iで確認することができます。

FUNCTION OPTIONS(*DIRECT);

********** COMMENT();

********** COMMENT(Fields that the caller can optionally exchange in);

********** COMMENT(which should really be defined in the dictionary);

********** COMMENT();

DEFINE FIELD(#EMSPLFN) TYPE(*CHAR) LENGTH(010) DESC('Report AS/400 Spooled File Name') DEFAULT(O@PRTF1);

DEFINE FIELD(#EMSPLFD) TYPE(*CHAR) LENGTH(001) DESC('Delete Spooled File at Completion') DEFAULT(N);

DEFINE FIELD(#EMORIGIN) TYPE(*CHAR) LENGTH(060) DESC('Email Originator Name') DEFAULT(*FUNCTION);

DEFINE FIELD(#EMRECPNT) TYPE(*CHAR) LENGTH(060) DESC('Email Recpient Name') DEFAULT(*BLANKS);

DEFINE FIELD(#EMSUBJECT) TYPE(*CHAR) LENGTH(060) DESC('Email Subject') DEFAULT(*BLANKS);

********** COMMENT();

********** COMMENT(Local Fields for this function);

********** COMMENT();

DEFINE FIELD(#EMLINE) TYPE(*CHAR) LENGTH(132) DESC('Line of the report');

DEFINE FIELD(#EMRETC) TYPE(*CHAR) LENGTH(002) DESC('Return code');

********** COMMENT();

********** COMMENT(Create the holding file SPOOLDTA in QTEMP);

********** COMMENT();

EXEC_OS400 COMMAND('CRTPF QTEMP/SPOOLDTA RCDLEN(132) AUT(*ALL)') IF_ERROR(*NEXT);

USE BUILTIN(CLR_MESSAGES);

EXEC_OS400 COMMAND('CPYSPLF FILE(#EMSPLFN) TOFILE(QTEMP/SPOOLDTA) SPLNBR(*LAST)');

********** COMMENT();

********** COMMENT(Start the mail and read and send all lines in report);

********** COMMENT();

USE BUILTIN(MAIL_START) TO_GET(#EMRETC);

EXECUTE SUBROUTINE(CHECKERROR);

USE BUILTIN(MAIL_ADD_RECIPIENT) WITH_ARGS(TO #EMRECPNT) TO_GET(#EMRETC);

EXECUTE SUBROUTINE(CHECKERROR);

IF COND('#EMORIGIN *NE *BLANKS');

USE BUILTIN(MAIL_ADD_ORIGINATOR) WITH_ARGS(#EMORIGIN) TO_GET(#EMRETC);

EXECUTE SUBROUTINE(CHECKERROR);

ENDIF;

IF COND('#EMSUBJECT *NE *BLANKS');

USE BUILTIN(MAIL_SET_SUBJECT) WITH_ARGS(#EMSUBJECT) TO_GET(#EMRETC);

EXECUTE SUBROUTINE(CHECKERROR);

ENDIF;

USE BUILTIN(ACCESS_FILE) WITH_ARGS(OPEN SPOOLDTA QTEMP) TO_GET(#EMRETC);

EXECUTE SUBROUTINE(CHECKERROR);

USE BUILTIN(ACCESS_FILE) WITH_ARGS(READ SPOOLDTA QTEMP) TO_GET(#EMRETC #EMLINE);

EXECUTE SUBROUTINE(CHECKERROR);

DOWHILE COND('#EMRETC = OK');

USE BUILTIN(MAIL_ADD_TEXT) WITH_ARGS(#EMLINE) TO_GET(#EMRETC);

EXECUTE SUBROUTINE(CHECKERROR);

USE BUILTIN(ACCESS_FILE) WITH_ARGS(READ SPOOLDTA QTEMP) TO_GET(#EMRETC #EMLINE);

EXECUTE SUBROUTINE(CHECKERROR);

ENDWHILE;

********** COMMENT();

********** COMMENT(Close the temporary file and send the mail);

********** COMMENT();

USE BUILTIN(ACCESS_FILE) WITH_ARGS(CLOSE SPOOLDTA QTEMP) TO_GET(#EMRETC);

EXECUTE SUBROUTINE(CHECKERROR);

USE BUILTIN(MAIL_SEND) TO_GET(#EMRETC);

EXECUTE SUBROUTINE(CHECKERROR);

********** COMMENT();

********** COMMENT(Delete the spool file if required);

********** COMMENT();

IF COND('#EMSPLFD = Y');

EXEC_OS400 COMMAND('DLTSPLF FILE(#EMSPLFN) SPLNBR(*LAST)');

ENDIF;

********** COMMENT(Finished);

RETURN;

********** COMMENT();

********** COMMENT(Error checking subroutine);

********** COMMENT();

SUBROUTINE NAME(CHECKERROR);

IF COND('(#EMRETC *NE OK) *AND (#EMRETC *NE EF)');

ABORT MSGTXT('Fatal error detected during Email transfer. See previous messages for cause.');

ENDIF;

ENDROUTINE;

 

IBM i上でこのファンクションをコンパイルした後は、新規または既存のレポート・プログラムの末尾に以下のようなコードを追加できます。

<< PRODUCE THE REPORT >>>

ENDPRINT 

CHANGE FIELD(#EMRECPNT) TO('name.user@site');

EXCHANGE FIELDS(#EMRECPNT);

CALL PROCESS(*DIRECT) FUNCTION(<email function name>);

 

この例では、レポートのコピーをname.user@site宛てに送信します。

同様に以下の例では、

CHANGE FIELD(#EMRECPNT) TO('name.user@site');

CHANGE FIELD(#EMSUBJECT) TO('YTD Budget Report');

EXCHANGE FIELDS(#EMRECPNT #EMSUBJECT);

CALL PROCESS(*DIRECT) FUNCTION(MAILRPT);

 

「YTD予算レポート」という件名でレポートのコピーを送信します。