home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 35 Internet
/
35-Internet.zip
/
kabki622.zip
/
kkmail2.cmd
< prev
next >
Wrap
OS/2 REXX Batch file
|
1996-10-25
|
33KB
|
1,242 lines
/* Åëè·É▌ÆΦâfü[â^ */
'@echo off'
'chcp 932'
pcmVersion=" < special thanks : PCM/2 OS/2 REXX ver0.60 by Pururun >"
KKMailVer ="KKMail Ver0.1(NKF)"
PCM_HOME="pcm"
PCMAIL_PROFILE="kkmail.cfg"
PCMAIL_CUR_BOX="current.pms"
LAST_NUMBER_FILE="number.pms"
CUR_NUMBER_FILE="current.pcm"
smtpPort=25
popPort=110
interFace=" RexxSock "
myHostName=""
DEBUG=(0)
ASCERASE=(0)
JSTDATE=(1)
INC_LIST_FLAG = 1
INC_LIST = "kkmail.inc"
_CONV_ = 1 /* 1é╚éτé╬ò╩âvâìâZâXé┼âRü[âhò╧è╖é╖éΘ */
/* 1ê╚èOé╚éτô»êΩâvâìâZâXé┼ìséñ */
/* Åëè·ë╗ */
main:
options etmode
arg cfgDir .
if RxFuncQuery("SysLoadFuncs") then
do
call RxFuncAdd "SysLoadFuncs", "RexxUtil", "SysLoadFuncs"
call SysLoadFuncs
end
if RxFuncQuery("SockLoadFuncs") then
do
call RxFuncAdd "SockLoadFuncs","RxSock","SockLoadFuncs"
call SockLoadFuncs
end
if RxFuncQuery("RxJisLoadFuncs") then
do
call RxFuncAdd 'RxJisLoadFuncs', 'RXJIS', 'RxJisLoadFuncs'
call RxJisLoadFuncs
end
say KKMailVer || pcmVersion
if \ReadProfile() then exit 1
curFolder = "inbox"
addr = SockGetHostId()
call SockGetHostByAddr addr, "host.!"
signal on halt name shutdown
rc = SendMqueues()
rc = RecvMail(profile.password,"","","FALSE")
say "Complete"
prog = 'kkconv.cmd ' || inc_list_file || ' ' || profile.path||"\folder\"||profile.incmbox||"\"
if _CONV_ = 1 then
'@start /c ' || prog
else
'@call ' || prog
exit 0
/* profile.pcm âtâ@âCâïé≡ô╟é±é┼Åëè·ò╧Éöé≡É▌ÆΦé╖éΘ */
ReadProfile:
profile.path=""
profile.smtphost=""
profile.pophost=""
profile.user=""
profile.password=""
profile.incmbox=""
profile.mqueue=""
profile.domain=""
profile.tzstring=""
ret = 1
if cfgDir\="" then do
fName = cfgDir
rc = CheckCFG(fName)
end
else
rc = 0
if rc = 0 then do
fName = "."
if CheckCFG(fName) = 0 then do
fName = value(PCM_HOME,,"OS2ENVIRONMENT")
if fName="" then do
say "è┬ï½ò╧Éö("||PCM_HOME||")é≡É▌ÆΦé╡é─é¡é╛é│éóüB"
return 0
end
if CheckCFG(fName) = 0 then do
say "è┬ï½É▌ÆΦâtâ@âCâïé¬î⌐é┬é⌐éΦé▄é╣é±üB"
return 0
end
end
end
if right(fName,1)="\" then fName=left(fName,(length(fName)-1))
if INC_LIST_FLAG = 1 then
inc_list_file = fName || "\" || INC_LIST
else
inc_list_file = ""
fName = fName||"\"||PCMAIL_PROFILE
rc = SysFileTree( fName, "stem", "F" )
if stem.0=0 then
do
say "è┬ï½É▌ÆΦâtâ@âCâï("||fName||")é¬î⌐é┬é⌐éΦé▄é╣é±üB"
return 0
end
rb = stream( fName,"c","OPEN READ")
do forever
buf=linein( fName )
if buf="" then leave
if left(buf,1)="#" then iterate
buf=translate( buf, " ", " " )
if left(buf,5)="PATH:" then
do
parse var buf keywd profile.path
profile.path=strip(profile.path)
if right(profile.path,1)="\" then profile.path=left(profile.path,(length(profile.path)-1))
end
if left(buf,9)="SMTPHOST:" then
do
parse var buf keywd profile.smtphost
profile.smtphost=strip(profile.smtphost)
end /* do */
if left(buf,8)="POPHOST:" then
do
parse var buf keywd profile.pophost
profile.pophost=strip(profile.pophost)
end /* do */
if left(buf,5)="USER:" then
do
parse var buf keywd profile.user
profile.user=strip(profile.user)
end
if left(buf,9)="PASSWORD:" then
do
parse var buf keywd profile.password
profile.password=strip(profile.password)
end
if left(buf,9)="INC-MBOX:" then
do
parse var buf keywd profile.incmbox
profile.incmbox=strip(profile.incmbox)
end
if left(buf,7)="MQUEUE:" then
do
parse var buf keywd profile.mqueue
profile.mqueue=strip(profile.mqueue)
end
if left(buf,7)="DOMAIN:" then
do
parse var buf keywd profile.domain
profile.domain=strip(profile.domain)
end
if left(buf,9)="TZSTRING:" then
do
parse var buf keywd profile.tzstring
profile.tzstring=strip(profile.tzstring)
end /* do */
end /* do */
rb = stream( fName,"c","CLOSE")
if profile.path="" then
do
say "è┬ï½É▌ÆΦâtâ@âCâï("||fName||")é╔("||"PATH: "||"é≡É▌ÆΦé╡é─ë║é│éóüB"
ret = 0
end
if profile.pophost="" then
do
say "è┬ï½É▌ÆΦâtâ@âCâï("||fName||")é╔("||"POPHOST: "||"é≡É▌ÆΦé╡é─ë║é│éóüB"
ret = 0
end
if profile.smtphost="" then
do
say "è┬ï½É▌ÆΦâtâ@âCâï("||fName||")é╔("||"SMTPHOST: "||"é≡É▌ÆΦé╡é─ë║é│éóüB"
ret = 0
end
if profile.user="" then
do
say "è┬ï½É▌ÆΦâtâ@âCâï("||fName||")é╔("||"USER: "||"é≡É▌ÆΦé╡é─ë║é│éóüB"
ret = 0
end
if profile.incmbox="" then profile.incmbox="inbox"
if profile.mqueue="" then profile.mqueue="mqueue"
if profile.tzstring="" then profile.tzstring="+0900"
return ret
CheckCFG: procedure expose PCMAIL_PROFILE
arg f
if right(f,1)="\" then f=left(f,(length(f)-1))
f = f||"\"||PCMAIL_PROFILE
rc = SysFileTree( f, "stem", "F" )
if stem.0=0 then
return 0
return 1
/* âüü[âïé≡Ä≤ÉMé╖éΘ */
RecvMail:
parse arg passwd, folder, nfolder, checkOnly
if nfolder="" then
f=profile.incmbox
else
f=nfolder
rc = CheckFolder(f)
if rc=0 then
do
say "ÆåÆfé╡é▄é╡é╜!!"
exit 1
end
rc = NetOpen(profile.pophost,popPort)
if rc=0 then
do
say "POPâTü[âoü[("||profile.pophost||")é╞É┌æ▒é┼é½é▄é╣é±!"
password=""
return 1
end
rc = NetRec1("recbuf1")
if rc=0 then
do
say "POPâTü[âoü[é⌐éτïæö█é│éΩé▄é╡é╜üB"
call NetClose
exit 1
end
if left(recbuf1,1)\="+" then
do
say "POPâTü[âoü[é⌐éτïæö█é│éΩé▄é╡é╜üB"
call NetClose
exit 1
end
rc = CheckUser(profile.user,profile.passwd)
if rc=0 then
do
rc=NetSend("QUIT");
rc=NetRec1("recbuf1");
rc=NetClose()
return 0
end
num=GetStatus()
if num=0 then
say "éáé╚é╜ê╢é╠âüü[âïé═éáéΦé▄é╣é±üB"
else
say "éáé╚é╜ê╢é╠ "||num||" Æ╩é╠âüü[âïé¬ô═éóé─éóé▄é╖üB"
if checkOnly\="TRUE" & num\=0 then
rc = GetNewMails( f, num )
rc = NetSend("QUIT")
rc = NetRec1("recbuf1")
rc = NetClose()
/* set new folder to current folder */
if f=nfolder then
curFolder=nfolder
else
do
if f=profile.incmbox & folder \="" then curFolder=profile.incmbox
end
return 1
/* âtâHâïâ_ü[é╠ùLû│é≡Æ▓é╫éΘ */
CheckFolder:
procedure expose profile.path profile.mqueue
parse arg folder
fname=profile.path||"\folder"
rc = SysFileTree( fname, "stem", "D" )
if stem.0=0 then
do
rc = SysMkDir(fname)
if rc\=0 then return 0
end
fname=profile.path||"\folder\"||folder
rc = SysFileTree( fname, "stem", "D" )
if stem.0=0 then
do
rc = SysMkDir(fname)
if rc\=0 then return 0
end
return 1
/* ùLî°é╚âåü[âUü[é⌐Æ▓é╫éΘü@[recmail.c] */
CheckUser:
parse arg userName,passwd
passwd = profile.password
rc=NetSend("USER "||userName)
rc=NetRec1("recbuf1")
if rc=0 | left(recbuf1,1)\="+" then
do
say "éáé╚é╜("||userName||")é═é╗é╠âzâXâgé╔âüü[âïâ{âbâNâXé≡Ä¥é┴é─éóé▄é╣é±üB"
return 0
end
rc=NetSend("PASS "||passwd)
rc=NetRec1("recbuf1")
if rc=0 | left(recbuf1,1)\="+" then
do
say "âpâXâÅü[âhé¬êßéóé▄é╖üB["||recbuf1||"]"
password=""
return 0
end
return 1
/* ùXò╓Ä≤é»é╠Å≤ï╡é≡Æ▓é╫éΘ */
GetStatus:
rc=NetSend("STAT")
rc=NetRec1("recbuf1")
if rc=0 | left(recbuf1,1)\="+" then
do
say "POPâvâìâgâRâïâGâëü[(STAT)["||recbuf1||"]"
return 0
end
parse var recbuf1 crap num .
return num
/* ÉVé╡éóòíÉöé╠âüü[âïé≡Ä≤ÉMé╖éΘ */
GetNewMails:
parse arg folder,num
nmn = ReadNewMailNumber(folder)
onmn = nmn
if nmn=-1 then
do
nmn=1
onmn=1
end /* do */
do i=1 to num
/*
rc = NetSend("RETR "||i)
rc = NetRec1("recbuf1")
if rc=0 | left(recbuf1,1)\="+" then
do
say "POPâvâìâgâRâïâGâëü[(RETR)["||recbuf1||"]"
return 0
end
*/
fname=profile.path||"\folder\"||folder||"\"||nmn
rc = SaveTillDot(i,fname)
if rc=0 then
do
ret = 0
leave
end /* do */
rc = DispSmallHeader(nmn,fname,"FALSE",(nmn=omnm))
nmn=nmn+1
end /* do */
if inc_list_file \= "" then
call stream inc_list_file, "c", "close"
rc = WriteNewMailNumber(folder,nmn)
if rc=0 then
do
say "ÉVé╡éóâüü[âïö╘ìåé╠âZü[âué╔Ä╕ösé╡é▄é╡é╜üB"
return 0
end /* do */
recbuf1=""
if ASCERASE then
do
call charout , "âüü[âïâXâvü[âïé≡Å┴ïÄé╡é▄é╖é⌐? (Y/N):"
parse upper pull ans
if left(ans,1)\="Y" then return ret
end
do i=1 to num
rc = NetSend("DELE "||i)
rc = NetRec1("recbuf1")
if rc=0 | left(recbuf1,1)\="+" then
do
say "POPâvâìâgâRâïâGâëü[(DELE)["||recbuf1||"]"
return 0
end /* do */
end /* do */
return ret
/* âüü[âïé╠ò╢Å═é≡Ä≤ÉMé╖éΘ */
SaveTillDot:
procedure expose DEBUG sock recbuf1 mrecbuf. inc_list_file MailDate MailFromAddr MailSubjAndBody
parse arg number,fName
rc = NetRec(number)
if rc=0 then return 0
rb=stream( fName,"c","OPEN WRITE")
if rb\="READY:" then
do
say "âüü[âïâZü[âuâtâ@âCâï("||fName||")é╠âIü[âvâôé╔Ä╕ösé╡é▄é╡é╜üB"
return 0
end
j=1
subjFlag = 0
MailDate = ""
MailFromAddr = ""
MailSubjAndBody = ""
do i=1 to mrecbuf.0
if left(mrecbuf.i,8)="Subject:" | left(mrecbuf.i,5)="From:" | left(mrecbuf.i,3)="Cc:" then
do
sjisbuf.j=RxJisMimeJisTo(mrecbuf.i)
if left(mrecbuf.i,8)="Subject:" then
subjFlag = 1
else
subjFlag = 0
end /* do */
else do
if subjFlag = 1 then do
sjisbuf.j=RxJisMimeJisTo(mrecbuf.i)
end
else do
/*sjisbuf.j=RxJisMimeJisTo(mrecbuf.i) */
sjisbuf.j = mrecbuf.i
end
subjFlag = 0
end
buf = sjisbuf.j
if left(buf,5)="Date:" then MailDate = ParseDate( substr(buf,6) )
if left(buf,5)="From:" then MailFromAddr= strip( substr(buf,6) )
if left(buf,8)="Subject:" then MailSubjAndBody=strip( substr(buf,9) )
j=j+1
end /* do */
sjisbuf.0=j-1;
rc = lineout( fName,,1)
if rc\=0 then
do
say "âüü[âïâtâ@âCâï("||fName||")é╠Åoù═é╔Ä╕ösé╡é▄é╡é╜üB"
rb=stream(fName,"c","CLOSE")
return 0
end /* do */
do i=1 to sjisbuf.0
rc = lineout( fName,sjisbuf.i)
if rc\=0 then
do
say "âüü[âïâtâ@âCâï("||fName||")é╠Åoù═é╔Ä╕ösé╡é▄é╡é╜üB"
rb=stream(fName,"c","CLOSE")
return 0
end
end /* do */
rc = lineout(fName)
rb=stream(fName,"c","CLOSE")
return 1
ParseDate:
procedure
parse arg buf
buf = translate(buf," ",",")
parse value buf with wk dd mmm .
return dd||" "||mmm
DispSmallHeader:
procedure expose inc_list_file MailDate MailFromAddr MailSubjAndBody
parse arg n, fName, quiet, curf
call charout , right(n,4," ")
if curf then call charout ,"+"; else call charout ," "
buf = MailDate ||" " || left(MailFromAddr,15," ") || " " || left(MailSubjAndBody,48 )
call charout , buf||d2c(13)||d2c(10)
if inc_list_file \= "" then
call lineout inc_list_file, right(n, 4, " ") || " " || buf
return 1
/* ăé╠âüü[âïö╘ìåé≡ô╟é▌é╛é╖ */
ReadNewMailNumber:
procedure expose profile.path profile.mqueue LAST_NUMBER_FILE
parse arg folder
fname=profile.path||"\folder\"||folder||"\"||LAST_NUMBER_FILE
rb=stream(fname,"c","OPEN READ")
if rb="READY:" then
do
n = linein( fname,1 )
call stream fname,"c","CLOSE"
end
else
do
n = -1
end
return n
/* ăé╠âüü[âïö╘ìåé≡ïLÿ^é╖éΘ */
WriteNewMailNumber:
procedure expose profile.path profile.mqueue LAST_NUMBER_FILE
parse arg folder, n
fname=profile.path||"\folder\"||folder||"\"||LAST_NUMBER_FILE
rb=stream(fname,"c","OPEN WRITE")
if rb="READY:" then
do
call lineout fname,n,1
call lineout fname
call stream fname,"c","CLOSE"
return 1
end
else
do
say "âëâXâgâüü[âïNoâtâ@âCâï("||fname||")é¬ì∞ɼé┼é½é▄é╣é±"
return 0
end
/* */
SendMqueues:
n = GetMqueuesVol()
if n=0 then return 1
fname=profile.path||"\folder\"||profile.mqueue
rc = SysFileTree(fname||"\*","stemF","F")
if stemF.0=0 then return 0
say "âLâàü[é╠âüü[âïé≡æùÉMé╡é▄é╖üB"
do j=1 to stemF.0
fn = substr(word(stemF.j,5), lastpos("\",word(stemF.j,5))+1)
if \datatype(fn,"N") then iterate
rc = DeliverMail(word(stemF.j,5), profile.domain, "Queue");
if rc = 0 then return 0
end /* do */
return 1
GetMqueuesVol:
procedure expose profile.path profile.mqueue CUR_NUMBER_FILE
fname=profile.path||"\folder\"||profile.mqueue
rc = SysFileTree(fname||"\*","stemF","F")
if stemF.0=0 then return 0
cnt = 0; fst = 0; end = 0;
do j=1 to stemF.0
fn = substr(word(stemF.j,5), lastpos("\",word(stemF.j,5))+1)
if \datatype(fn,"N") then iterate
cnt=cnt+1
if fn+0>end then end = fn+0
if fn+0<fst | fst=0 then fst=fn+0
end /* do */
return cnt
/* */
DeliverMail:
parse arg fName, myHost, mode
/* âüü[âïé≡özù±é╔ô╟é▌ì₧é▐ */
_fname_ = fName || '.J'
'@nkf -j < ' || fName || ' > ' || _fname_
/*rb = stream(fName,"c","OPEN READ")*/
rb = stream(_fname_,"c","OPEN READ")
if rb\="READY:" then
do
say "âüü[âïâtâ@âCâï("||fName||")é╠ô╟é▌ì₧é▌é╔Ä╕ösé╡é▄é╡é╜üB"
rb=stream(fName,"c","CLOSE")
return 0
end
_i_ = 1
bodyFlag = 0
/*
do while lines(fName)\=0
buf=linein(fName)
*/
do while lines(_fname_)\=0
buf=linein(_fname_)
MailBody._i_ = buf
_i_ = _i_ + 1
if strip(buf)="" & bodyFlag = 0 then
bodyFlag = 1
end /* do */
/*rb = stream(fName,"c","CLOSE")*/
rb = stream(_fname_,"c","CLOSE")
'@del ' || _fname_
if bodyFlag = 0 then do
say "âüü[âïâwâbâ_ü[é╞ôαùeé╠ï½é≡ö╗Æfé╖éΘé╜é▀é╠ìsé¬éáéΦé▄é╣é±üI"
return 0
end
MailBody.0 = _i_
sendNum = CheckSendMailUsers(fName)
if sendNum=0 then return 0
/* send mail */
rc = NetOpen(profile.smtphost, smtpPort)
if rc=0 then
do
say "âüü[âïâzâXâg("||profile.smtphost||")é╞é╠É┌æ▒é¬é┼é½é▄é╣é±üB"
rc=0
if mode = "Normal" then rc = MqueueCopy(fName)
if rc\=0 then rc=SysFileDelete(fName)
return 0
end
rc = NetRec2("recbuf1")
if rc=0 | left(recbuf1,3)\="220" then
do
say "âüü[âïâzâXâgé⌐éτé╠âîâXâ|âôâXé┼ïæö█é│éΩé▄é╡é╜üB"
call NetClose
return 0
end
/* greeting sequence */
call NetSend "HELO "||myHost
rc = NetRec2("recbuf1")
if rc=0 | left(recbuf1,3)\="250" then
do
say "SMTPâvâìâgâRâïâGâëü[(HELO)"
call NetSend "QUIT"
call NetRec2 "recbuf1"
call NetClose
return 0
end
rc = SendMails(fName,sendNum)
if rc\=0 then
do
rc = FolderCarbonCopy(fName)
/* if rc\=0 then call unlink(fName) */
rc = SysFileDelete(fName)
end
call NetSend "QUIT"
rc = NetRec2("recbuf1")
if rc=0 then say "SMTPâvâìâgâRâïâGâëü[(QUIT)"
call NetClose
return 1
/* */
CheckSendMailUsers:
parse arg fName
c=0
_i_=1
do while _i_ < MailBody.0
buf=MailBody._i_
_i_ = _i_ + 1
if strip(buf)="" then leave
if left(buf,3)="To:" then
do
buf=substr(buf,4)
c = GetMailUserNames( buf, c )
iterate
end
if left(buf,3)="Cc:" then
do
buf=substr(buf,4)
c = GetMailUserNames( buf, c )
iterate
end
if left(buf,4)="Bcc:" then
do
buf=substr(buf,5)
c = GetMailUserNames( buf, c )
iterate
end
end /* do */
return c
/* */
GetMailUserNames:
procedure expose sendUserName.
parse arg str, c
buf = translate( str, " "," \<>," )
sendUserName.0=c+words( buf )
if sendUserName.0=c then return c
j=1
do _i=c+1 to sendUserName.0
sendUserName._i=strip(word(buf,j))
j=j+1
end /* do */
return sendUserName.0
/* */
SendMails:
parse arg fName, pNum
rc = NetSend("MAIL FROM:<"||profile.user||">")
rc = NetRec2("recbuf1")
if left(recbuf1,3)\="250" then
do
say "éréléséoâvâìâgâRâïâGâëü[(MAIL FROM:)"
return 0
end
if DEBUG then say "MAIL FROM: ok!!"
do _i=1 to pNum
if left(sendUserName._i,1)="<" then rc = NetSend("RCPT TO:"||sendUserName._i)
else rc = NetSend("RCPT TO:<"||sendUserName._i||">")
rc = NetRec2("recbuf1")
if left(recbuf1,3)\="250" then
do
say "éréléséoâvâìâgâRâïâGâëü[(RCPT TO:<"||sendUserName._i||">)"
return 0
end
else
say "æùÉMɵ ["||_i||"] : <"||sendUserName._i||">"
end /* do */
rc = NetSend("DATA")
rc = NetRec2("recbuf1")
if left(recbuf1,3)\="354" then
do
say "éréléséoâvâìâgâRâïâGâëü[(DATA)"
return 0
end
if DEBUG then say "DATA start ok !!"
say "û{ò╢é≡æùÉMÆåé┼é╖...."
rc = SendMailBody(fName)
if rc=0 then
do
say "éréléséoâvâìâgâRâïâGâëü[(DATA[MailBody])"
return 0
end
say "âüü[âïé╠æùÉMé¬É│Åφé╔è«ù╣é╡é▄é╡é╜üB"
return 1
/* */
SendMailBody:
procedure expose DEBUG JSTDATE pcmVersion sock recbuf1 profile.tzstring MailBody.
parse arg fName
_i_=1
mimeFlag=0
bodyFlag=0
do while _i_ < MailBody.0
buf=MailBody._i_
_i_ = _i_ + 1
if left(buf,3)="Cc:" & strip(buf)="Cc:" then iterate
if left(buf,4)="Bcc:" then iterate
if left(buf,4)="Fcc:" then iterate
if strip(buf)="" & bodyFlag = 0 then
do
bodyFlag = 1
if JSTDATE then
do
buf = "Date: "||GetMailFormatDate()
rc = NetSend(buf)
end /* do */
if mimeFlag=0 then
do
buf = "X-Mailer: PC/M ["||pcmVersion||"]"
iterate
end
else
do
mimeFlag=0
buf = "MIME-Version: 1.0"
rc = NetSend(buf)
buf = "Content-Type: text/plain; charset=ISO-2022-JP"
rc = NetSend(buf)
buf = "X-Mailer: PC/M ["||pcmVersion||"]"
iterate
end /* do */
end /* do */
/* sndbuf=RxJisToJis(buf) */
sndbuf=buf
if left(sndbuf,8)="Subject:" | left(sndbuf,5)="From:" then
do
sndbuf=Base64ex(sndbuf)
if pos("=?ISO-2022-JP?B?",sndbuf)\=0 then mimeFlag=1
do while pos(d2c(13),sndbuf)\=0
po = pos( d2c(13),sndbuf)
rc = NetSend(left(sndbuf,(po-1)))
sndbuf=substr(sndbuf,po+1)
end /* do */
end /* do */
rc = NetSend(sndbuf)
end /* do */
rb = stream(fName,"c","CLOSE")
rc = NetSend("")
rc = NetSend(".")
rc = NetRec2("recbuf1")
if left(recbuf1,3)\="250" then return 0
return 1
/* */
FolderCarbonCopy:
parse arg fName
fccfolder=""
_i_ = 1
do while _i_ < MailBody.0
buf=MailBody._i_
_i_ = _i_ + 1
if left(buf,4)="Fcc:" then
do
buf = strip(substr(buf,5))
if buf="" then return 0
fccfolder=buf
leave
end
if strip(buf)="" then return 1
end /* do */
if fccfolder\="" then
do
rc = CheckFolder(fccfolder)
if rc=0 then return 0
nmn=ReadNewMailNumber(fccfolder)
if nmn<0 then nmn=1
dfname=profile.path||"\folder\"||fccfolder||"\"||nmn
rb=stream(dfname,"c","OPEN WRITE")
if rb\="READY:" then
do
say "âüü[âïâZü[âuâtâ@âCâï("||dfname||")é╠ì∞ɼé╔Ä╕ösé╡é▄é╡é╜"
rb = stream(fName,"c","CLOSE")
return 0
end
call lineout dfname,,1
i = 1
bodyFlag = 0
do while i < MailBody.0
buf=MailBody.i
i = i + 1
if strip(buf)="" & bodyFlag = 0 then
do
bodyFlag = 1
rb = lineout( dfname, "Date: "||GetMailFormatDate())
rb = lineout( dfname, "" )
iterate
end
else
rb = lineout( dfname, buf )
end
call stream dfname
rb = stream(dfname,"c","CLOSE")
rc = WriteNewMailNumber(fccfolder, nmn+1 )
if rc=0 then
do
say "ÉVé╡éóâüü[âïö╘ìåé╠âZü[âué╔Ä╕ösé╡é▄é╡é╜üB"
return 0
end
end
return 1
/* */
GetMailFormatDate:
procedure expose profile.tzstring
datestr=date("N")
parse var datestr dd mmm yy
return left( date("W"), 3)||", "||dd||" "||mmm||" "||right(yy,2)||" "||time()||" "||profile.tzstring
/* */
NetOpen:
procedure expose DEBUG host.! address.! sock
parse arg hostName, portNum
rc = SockGetHostByName( hostName, "host.!" )
if rc=0 then
do
say "âzâXâgé╠Ä»ò╩é¬Åoùêé▄é╣é±üB("||hostName||")"
return 0
end
sock = SockSocket("AF_INET","SOCK_STREAM",0 )
if sock = -1 then
do
say "â\âPâbâgé¬ì∞ɼé┼é½é▄é╣é±üB"
return 0
end
address.!family = "AF_INET"
address.!port = portNum
address.!addr = host.!addr
rc = SockConnect( sock,"address.!" )
if rc=-1 then
do
say "PC-MAILâzâXâgé╓é╠âRâlâNâgé¬é┼é½é▄é╣é±üB"
call socksoclose sock
return 0
end
return 1
NetClose:
procedure expose DEBUG sock
call socksoclose sock
return 1
/* */
NetSend:
procedure expose DEBUG sock
parse arg buf
if DEBUG then
do
if left(buf,4)="PASS" then
say "[ PC ] PASS ****"
else
say "[ PC ] "||buf
end /* do */
buf = buf || d2c(13) || d2c(10)
rc = SockSend( sock, buf )
/* if errno\=0 | rc<=0 then */
if rc<=0 then
do
say "âfü[â^æùÉMâGâëü["
return 0
end
return 1
/* */
NetRec1:
procedure expose DEBUG sock mrecbuf. recbuf1
parse arg i
crlf = d2c(13)||d2c(10)
o=0
mrecbuf.0=0
buf =""
do forever
o = mrecbuf.0
rc = SockRecv( sock, "getstring", 4096 )
buf = buf || getstring
s = 1
e = 1
do while( pos(crlf, buf, s)\=0 )
o = o + 1
e = pos(crlf, buf, s)
mrecbuf.o=substr(buf,s,(e-s))
s = e+2
if DEBUG then say "[HOST] "||mrecbuf.o
end /* while */
buf=substr(buf,s) /* rest of LINEs */
mrecbuf.0 = o
if o=1 then
do
recbuf1=mrecbuf.1
leave
end
end
return 1
/* */
NetRec2:
procedure expose DEBUG sock mrecbuf. recbuf1
parse arg i
crlf = d2c(13)||d2c(10)
o=0
mrecbuf.0=0
buf =""
do forever
o = mrecbuf.0
rc = SockRecv( sock, "getstring", 4096 )
buf = buf || getstring
s = 1
e = 1
do while( pos(crlf, buf, s)\=0 )
o = o + 1
e = pos(crlf, buf, s)
mrecbuf.o=substr(buf,s,(e-s))
s = e+2
if DEBUG then say "[HOST] "||mrecbuf.o
end /* while */
buf=substr(buf,s) /* rest of LINEs */
mrecbuf.0 = o
if substr(mrecbuf.o,4,1) = " " then
do
recbuf1=mrecbuf.o
leave
end
end
return 1
/* */
NetRec:
procedure expose DEBUG sock mrecbuf. recbuf1
parse arg i
crlf = d2c(13)||d2c(10)
progress=" .oO"
o=0
mrecbuf.0=0
buf =""
rc = NetSend("RETR "||i)
do forever
call charout , substr(progress,1+o//length(progress),1)||d2c(13)
o = mrecbuf.0
rc = SockRecv( sock, "getstring", 4096 )
buf = buf || getstring
s = 1
e = 1
do while( pos(crlf, buf, s)\=0 )
o = o + 1
e = pos(crlf, buf, s)
mrecbuf.o=substr(buf,s,(e-s))
s = e+2
end /* while */
buf=substr(buf,s) /* rest of LINEs */
if mrecbuf.o = "." then
do
mrecbuf.0 = o-1
leave
end
mrecbuf.0 = o
end
call charout ," "||d2c(13)
if mrecbuf.0\=0 & left(mrecbuf.1,1)\="+" then
do
say "POPâvâìâgâRâïâGâëü[(RETR)["||mrecbuf.1||"]"
return 0
end /* do */
if mrecbuf.0\=0 then mrecbuf.1=""
return 1
StringToJIS:
procedure
parse arg str
dstr=""
kanjiFlag=0
kanaFlag=0
len=length(str)
if len=0 then return str
do i=1 to len
c=substr(str,i,1)
if c2d(c) > 127 then
/* kanji */
do
if \kanjiFlag then
do
dstr=dstr||d2c(27)||"$@"
kanjiFlag=1
end /* do */
c1=c2d(c)
i=i+1
c2=c2d(substr(str,i,1))
if c1<c2d('a0'x) then c1=(256 + c1-c2d('71'x))//256
else c1=(256+c1-c2d('b1'x))//256
c1 = c1 * 2 + 1
if c2>c2d('7f'x) then c2=c2-1
if c2>c2d('9d'x) then
do
c2 = ( 256 + c2 - c2d('7d'x))//256
c1 = c1 + 1
end /* do */
else
do
c2 = (256 + c2 - c2d('1f'x))//256
end /* do */
dstr=dstr||d2c(c1)||d2c(c2)
end /* do */
else /* ank */
do
if kanjiFlag then
do
dstr=dstr||d2c(27)||"(J"
kanjiFlag=0
end /* do */
dstr=dstr||c
end
end /* do */
if kanjiFlag then
do
dstr=dstr||d2c(27)||"(J"
kanjiFlag=0
end /* do */
return dstr
StringToSJIS:
parse arg str1
if pos( '1B'x||'$' , str1 ) = 0 then return str1
sp = 1
str2 = ""
spend = length( str1 )
do while ( sp <= spend )
if (substr( str1, sp , 1) == '1B'x ) & ( substr( str1, sp+1, 1 ) == '$' ) then
do
sp = sp + 3
if sp <= spend then
do while ( substr(str1,sp,1) \= '1B'x | substr(str1,sp+1,1) \= '(' )
c1 = c2d( substr( str1,sp,1 ));
sp = sp +1;
c2 = c2d(substr( str1, sp,1))
sp = sp + 1;
c3 = ( c1 - 1 ) % 2;
if c1 <= c2d('5E'x) then
c3 = c3 + c2d('71'x)
else
c3 = c3 + c2d('B1'x)
str2 = str2 || d2c(c3 // 256)
c4 = c2
if ((c1 // 2)= 1) then
do
if( c2 < c2d('60'x) ) then
c4 = c4 + c2d('1F'x)
else
c4 = c4 + c2d('20'x)
end
else
c4 = c4 + c2d('7E'x)
str2 = str2 || d2c(c4)
end /* do */
sp = sp + 3
end /* do */
else
do
str2 = str2 || substr(str1,sp,1)
sp = sp + 1
end
end /* do */
return str2
/* MIME */
/* base 64 encode */
Base64ex:
procedure
parse arg str1
isoJP="=?ISO-2022-JP?B?"
po=pos(d2c(27),str1)
if po=0 then return str1
str2=""
do forever
if str1="" then leave
po=pos(d2c(27)||"$",str1)
poe=pos(d2c(27)||"(",str1,(po+1))
if po=0 then leave
if po>=poe then leave
str2=str2||left(str1,(po-1) )
k=3+poe-po
if k<43 then
do
str2=str2||encode(substr(str1,po,k))
str1=substr(str1,(poe+3))
end /* do */
else
do
str2=str2||encode(substr(str1,po,39)||d2c(27)||"(J")||d2c(13)||d2c(9)
str1=d2c(27)||"$@"||substr(str1,(po+39))
end /* do */
end /* do */
str2=str2||str1
return str2
encode:
procedure
parse arg str1
base64alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
len=length(str1)
str2="=?ISO-2022-JP?B?"
do i=1 to len by 3
c81=substr(str1,i+0,1)
c82=substr(str1,i+1,1)
c83=substr(str1,i+2,1)
if c82="" & c83="" then
do
d61= 1+(c2d(c81)%4)
d62= 1+((c2d(c81)//4)*16)
str2=str2||substr(base64alpha,d61,1)||substr(base64alpha,d62,1)||"=="
iterate
end /* do */
if c83="" then
do
d61= 1+(c2d(c81)%4)
d62= 1+((c2d(c81)//4)*16)+(c2d(c82)%16)
d63= 1+((c2d(c82)//16)*4)
str2=str2||substr(base64alpha,d61,1)||substr(base64alpha,d62,1)||substr(base64alpha,d63,1)||"="
iterate
end /* do */
d61= 1+(c2d(c81)%4)
d62= 1+((c2d(c81)//4)*16)+(c2d(c82)%16)
d63= 1+((c2d(c82)//16)*4)+((c2d(c83)%64)//64)
d64= 1+(c2d(c83)//64)
str2=str2||substr(base64alpha,d61,1)||substr(base64alpha,d62,1)||substr(base64alpha,d63,1)||substr(base64alpha,d64,1)
end /* do */
str3=""
do while length(str2)>73
str3=str3||left(str2,72)||"?="||d2c(13)||d2c(9)||"=?ISO-2022-JP?Q?"
str2=substr(str2,73)
end /* do */
str3=str3||str2||"?="
return str3
/* base64-decode */
/* sjisbuf.i=StringToSJIS( Base64dx( mrecbuf.i ) ) */
Base64dx:
procedure expose i mrecbuf.
parse arg str1
isoJp="=?ISO-2022-JP?B?"
isoJpEnd="?="
/* po=pos(isoJp,str1)
if po=0 then return str1 */
do k=1 to 5
m=i+1
next = left( mrecbuf.m, 1 )
/* if (next \= d2c(9)) & (next \= d2c(32)) then leave */
if (next \= d2c(9)) then leave
i=i+1;
/* len=length(str1)
if len=0 then len=1
str1=left(str1, len-1)||substr(mrecbuf.i , 2) */
str1=str1||substr(mrecbuf.i, 2)
end /* do */
str1u=translate(str1);
po=pos(isoJp,str1u)
if po=0 then return str1
str2=""
do forever
if str1="" then leave
po=pos(isoJp,str1u)
if po=0 then leave
str2=str2||left(str1,(po-1) )
str1=substr(str1,po+16)
str1u=translate(str1)
po=pos(isoJpEnd,str1u)
if po=0 then leave
str2=str2||decode(left(str1,(po-1)))
str1=substr(str1,(po+2))
str1u=translate(str1)
end /* do */
str2=str2||str1
return str2
decode:
procedure
parse arg str1
base64alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
len=length(str1)
str2=""
do i=1 to len by 4
c61=substr(str1,i+0,1)
c62=substr(str1,i+1,1)
c63=substr(str1,i+2,1)
c64=substr(str1,i+3,1)
if c63="=" & c64="=" then
do
d81= (pos(c61,base64alpha)-1)*4 + (pos(c62,base64alpha)-1)%16
str2=str2||d2c(d81)
iterate
end /* do */
if c64="=" then
do
d81= (pos(c61,base64alpha)-1)*4 + (pos(c62,base64alpha)-1)%16
d82= ((pos(c62,base64alpha)-1)//16)*16 + (pos(c63,base64alpha)-1)%4
str2=str2||d2c(d81)||d2c(d82)
iterate
end /* do */
d81= (pos(c61,base64alpha)-1)*4 + (pos(c62,base64alpha)-1)%16
d82= ((pos(c62,base64alpha)-1)//16)*16 + (pos(c63,base64alpha)-1)%4
d83= ((pos(c63,base64alpha)-1)//4)*64 + (pos(c64,base64alpha)-1)
str2=str2||d2c(d81)||d2c(d82)||d2c(d83)
end /* do */
return str2