SNDDSTを使って、AS/400からメールを送ることができるのなら、ダウンロードもそれでできないかという発想から、ファイル指定して、メールアドレスを指定すると、CSV変換して、メールを送る、コマンドを作ってみました。 AS/400からメールを発行する部分は、こちらを参照してください。V4R3以降はマニュアルに出ておらず、InfoCenterに出ています。実は、自分も、いろいろ、ほかの人に教わってつながったので、偉そうなことはいえないのですが、つながってしまうと簡単です。 また、ここでは、V4R5を前提として考えています。 SMTP, POPなどの設定が終われば、AS/400から、SNDDSTというコマンドで、Internetメールを出すことができます。そもそも、SNDDSTは、オフィスビジョン400(OV400)のコマンドとして、その文書の配布目的で使われていました。それが今は、拡張されて、インターネットメールを送ることにも、使われています。また、いつからサポートされたか、不明確なのですが、TYPE(*LMSG)を使うと、ドキュメント以外にただメッセージを送ることも可能です。但し、今回は、メールに添付するのが目的ですので、TYPE(*DOC)を使います。 さて、目指しているコマンドは、
-
CSVファイルを作る。
-
SNDDSTで、それをアタッチして送る。
です。 CSVファイルを作るコマンド自体は、システムコマンド、ユーザー定義コマンド(つまり自作)のどちらかでしょうが、ここでは、前者のシステムコマンドを利用するやり方を考えます。CPYTOIMPFです。 また、特殊なプログラム(RTVSQLLOGR)を呼び出していますが、これは、CSV化されたファイルの長さを求めるためのものです。 では、早速、CLPを見てみましょう。
PGM (&FLLB &MBR &DOCNAM &MSG &IMPORTANCE &TOINTNET)
DCL &FLLB *CHAR 30
DCL &MBR *CHAR 10
DCL &DOCNAM *CHAR 12
DCL &MSG *CHAR 256
DCL &IMPORTANCE *CHAR 7
DCL &TOINTNET *CHAR 866 /* 2 + 2*8 + (100+4+2)*8 */
DCL &MSGDTA *CHAR 50
DCL &RCDLEN *DEC (7 0)
DCL &WRKDOC# *DEC (7 0)
DCL &WRKDOC#C *CHAR 7
DCL &WRKFILE *CHAR 10
DCL &FILE *CHAR 10
DCL &FLIB *CHAR 10
DCL &POS *DEC (5 0)
DCL &TOFILELEN *DEC (5 0)
DCL &WRKFLR *CHAR 10 'CVTCSV '
DCL &DTAARA *CHAR 10 'CVTCSV '
DCL &RCDLENC *CHAR 5
DCL &GPLNAME *CHAR 10 'QGPL'
DCL &SYSNAME *CHAR 8
DCL &NBRLST *DEC (5 0)
DCL &POS1 *DEC (5 0)
DCL &POS2 *DEC (5 0)
DCL &COUNT *DEC (5 0)
DCL &EML *CHAR 100
DCL &RCT *CHAR 4
DCL &PRI *CHAR 1000
DCL &CC *CHAR 1000
DCL &BCC *CHAR 1000
DCL &SNDDST *CHAR 4000
MONMSG CPF0000 *N GOTO END
IF ( %BIN( &TOINTNET 1 2 ) = 0 ) RETURN
CHGVAR &FILE %SST(&FLLB 1 10)
CHGVAR &FLIB %SST(&FLLB 11 10)
CHKOBJ &FLIB/&FILE *FILE MBR(&MBR) AUT(*READ)
/*--------------------------------------*/
/* CREATE WORK FOLDER */
/*--------------------------------------*/
CRTFLR &WRKFLR TEXT('Work Folder to convert CSV file') AUT(*ALL)
MONMSG CPF0000
/*--------------------------------------*/
/* CREATE WORK FILE */
/*--------------------------------------*/
CHKOBJ &GPLNAME/&DTAARA *DTAARA
MONMSG CPF9800 *N DO
CRTDTAARA &GPLNAME/&DTAARA TYPE(*DEC) LEN(7 0) +
VALUE(0) TEXT(''For Generate Conversion File Name')
ENDDO
RTVDTAARA &GPLNAME/&DTAARA &WRKDOC#
CHGVAR &WRKDOC# ( &WRKDOC# + 1 )
CHGDTAARA &GPLNAME/&DTAARA &WRKDOC#
CHGVAR &WRKDOC#C &WRKDOC#
CHGVAR &WRKFILE ( 'C' |< &WRKDOC#C )
IF (&DOCNAM = '*GEN ') DO
CHGVAR &DOCNAM ' '
CHGVAR &DOCNAM (&WRKFILE |< '.CSV')
ENDDO
IF (&DOCNAM = '*FILE ') DO
CHGVAR &DOCNAM ' '
CHGVAR &DOCNAM (&FILE |< '.CSV')
ENDDO |
(1) |
/*--------------------------------------*/
/* SET RECORD LENGTH OF WORK FILE */
/*--------------------------------------*/
DLTF QTEMP/&WRKFILE
MONMSG CPF0000
CRTPF QTEMP/&WRKFILE RCDLEN( 1 )
OVRDBF &FILE &FLIB/&FILE MBR(&MBR) NBRRCDS(1)
CPYTOIMPF (&FLIB/&FILE &MBR) +
TOFILE(QTEMP/&WRKFILE) MBROPT(*REPLACE) +
STRDLM(*NONE)
MONMSG CPF2817 *N DO
CALL RTVSQLLOGR ('SQL0404' &MSGDTA)
CHGVAR &POS ( %BIN(&MSGDTA 1 2) + 5 )
CHGVAR &TOFILELEN %BIN(&MSGDTA &POS 2)
CHGVAR &RCDLENC &TOFILELEN
ENDDO
DLTOVR &FILE
DLTF QTEMP/&WRKFILE
MONMSG CPF0000
CRTWRKFILE:
CHKOBJ QTEMP/&WRKFILE *FILE
MONMSG CPF9800 *N DO
CRTPF QTEMP/&WRKFILE RCDLEN(&RCDLENC)
ENDDO
/*--------------------------------------*/
/* CONVERT DATA (TO CSV ) */
/*--------------------------------------*/
CLRPFM QTEMP/&WRKFILE
CPYTOIMPF (&FLIB/&FILE &MBR) +
TOFILE(QTEMP/&WRKFILE) MBROPT(*REPLACE) +
STRDLM(*NONE)
/*--------------------------------------*/
/* COPY FILE TO DOCUMENT */
/*--------------------------------------*/
CPYTOPCD QTEMP/&WRKFILE TOFLR(&WRKFLR) TODOC(&DOCNAM) REPLACE(*YES) |
(2) |
/*--------------------------------------*/
/* GET MAIL ADDRESS AND TYPE */
/*--------------------------------------*/
CHGVAR &COUNT 0
CHGVAR &NBRLST %BIN( &TOINTNET 1 2)
CHGVAR &PRI ' '
CHGVAR &CC ' '
CHGVAR &BCC ' '
CHGVAR &POS1 0
CHGVAR &POS2 0
LOOP:
CHGVAR &COUNT ( &COUNT + 1 )
CHGVAR &POS1 ( 2 + &COUNT * 2 - 1 )
CHGVAR &POS2 ( %BIN( &TOINTNET &POS1 2 ) + 1 + 2 )
CHGVAR &EML %SST( &TOINTNET &POS2 100 )
CHGVAR &POS2 ( &POS2 + 100 )
CHGVAR &RCT %SST( &TOINTNET &POS2 4 )
IF (&EML *NE '*NONE') DO
IF (&RCT = '*PRI') CHGVAR &PRI (&PRI|< '('''|< &EML |< ''' *PRI)')
IF (&RCT = '*CC ') CHGVAR &CC (&CC |< '('''|< &EML |< ''' *CC )')
IF (&RCT = '*BCC') CHGVAR &BCC (&BCC|< '('''|< &EML |< ''' *BCC)')
ENDDO
IF ( &COUNT < &NBRLST ) GOTO LOOP
/*--------------------------------------*/
/* SEND DOC BY SNDDST */
/*--------------------------------------*/
CHGVAR &SNDDST +
('SNDDST TYPE(*DOC) +
TOINTNET('|< &PRI |< &CC |< &BCC |< ') +
DSTD('|< &DOCNAM |<') +
MSG('''|< &MSG |<''') +
DOC('|< &DOCNAM |<') +
IMPORTANCE('|< &IMPORTANCE |<') +
CFMDEL( *YES ) +
FLR('|< &WRKFLR |<')')
CALL QCMDEXC (&SNDDST 4000)
SNDPGMMSG MSG( &SNDDST ) MSGTYPE( *COMP ) |
(3) |
/*--------------------------------------*/
/* Delete Work File and Doc. */
/*--------------------------------------*/
DLTF QTEMP/&WRKFILE
MONMSG CPF0000
END:
RETURN
ENDPGM
|
(1)フォルダーとドキュメント名の準備
簡単なので、説明は省きます。
(2)データをCSV化する
ここで、CPF2817でモニターしているのは、ちょっと、わけがあります。この最初のCPYTOIMFでは、わざとエラーを起こさせています。よく見ればわかりますが、レコード長1のファイルにコピーしています。さらに、そのときのメッセージで「長さは...であるべき」の...の部分を取り出しています。詳しくは、13.9.SQLのログを取り出そうを見てください。
(3)SNDDSTのコマンドの実行
メールアドレスをパラメータでもらい、SNDDSTに入れる際、*PRI,
*CC, *BCCの指定をそのまますると、うまくコマンドが解釈してくれないので、QCMDEXCを使っています。CSVを添付ファイルにして、メールを送るので、TYPEは*DOCですね。
なお、SUBJECTを入れていないので、それを入れたほうが、受取人の人は助かるでしょう。
2002-4-28 |