home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 November / VPR9711A.ISO / VPR_DATA / Special / Mich102 / mich102.lzh / Michelle.DAS < prev    next >
Text File  |  1996-07-03  |  27KB  |  1,064 lines

  1. '***********************************************************************
  2. '                  Internet Mail for Dana "Michelle"
  3. '                                 (C) RIM-Arts software 1995,1996
  4. ' rel 1.00 95/11
  5. ' rel 1.01 95/12
  6. ' rel 1.02 96/7
  7. '***********************************************************************
  8.  
  9. '-----------------------------------------------------------------------
  10. ' 起動キーの設定
  11. ' キーとシフトステータスの組み合わせで2種類まで設定できます
  12. ' キーコードについては、Dana Script Help の「仮想キーコード一覧」と
  13. '「常駐スクリプト」の STATE_KEY_PRESS の説明を参考にして下さい。
  14. '-----------------------------------------------------------------------
  15. Const KEY1   = &H0D        'VK_RETURN
  16. Const SHIFT1 = &H60        'Ctrl+Shift+
  17. Const KEY2   = &H02        'VK_RBUTTON
  18. Const SHIFT2 = &H20        'Ctrl+
  19.  
  20. '-----------------------------------------------------------------------
  21. ' EUC 受信の場合はTrueにしてください。(必ず変換しますのでご注意)
  22. '-----------------------------------------------------------------------
  23. Const EUC_RECEIVE = False
  24.  
  25. Const MB_YESNO = &H04
  26. Const MB_YESNOCANCEL = &H03
  27. Const MB_ICONQUESTION = &H20
  28. Const MB_DEFBUTTON1 = &H0
  29. Const MB_DEFBUTTON2 = &H100
  30.  
  31. Const IDOK = 1
  32. Const IDCANCEL = 2
  33. Const IDYES = 6
  34. Const IDNO = 7
  35.  
  36. Declare Proc DeleteMail Lib "DanaInet.DLL" (messageno%) As Integer
  37. Declare Proc EndReceiveSession Lib "DanaInet.DLL" ()
  38. Declare Proc GetAddress Lib "DanaInet.DLL" (home$, hWnd%) As String
  39. Declare Proc GetConfiguration Lib "DanaInet.DLL" (ini$, name$, add$, login$, pop$, smtp$, del$)
  40. Declare Proc GetErrorStatus Lib "DanaInet.DLL" () As String
  41. Declare Proc GetFormValue Lib "DanaInet.DLL" (control$) As String
  42. Declare Proc GetLastMailNo Lib "DanaInet.DLL" () As String
  43. Declare Proc GetMail Lib "DanaInet.DLL" (messageno%, buf$, newlinecode%, deleteflag%) As Integer
  44. Declare Proc ListMail Lib "DanaInet.DLL" (header$, stat$) As Integer
  45. Declare Proc MailAuthenticate Lib "DanaInet.DLL" (user$) As Integer
  46. Declare Proc MailInitialize Lib "DanaInet.DLL" (pop$, smtp$, hWnd%)
  47. Declare Proc MailShutdown Lib "DanaInet.DLL" ()
  48. Declare Proc OpenSendForm Lib "DanaInet.DLL" (home$, hWnd%)
  49. Declare Proc SendMail Lib "DanaInet.DLL" (from$, add$, cc$, bcc$, subj$, content$) As Integer
  50. Declare Proc SetConfiguration Lib "DanaInet.DLL" (ini$, hWnd%)
  51. Declare Proc SetFormValue Lib "DanaInet.DLL" (control$, value$)
  52. Declare Proc StartReceiveSession Lib "DanaInet.DLL" () As Integer
  53.  
  54. Declare Proc CreateDirectory Lib "Kernel32" Alias "CreateDirectoryA" (dirname$, n$)
  55. Declare Proc SetFocus Lib "User32" (hWnd%) As Integer
  56. Declare Proc wsprintf Lib "User32" Alias "wsprintfA" (s$, fmt$, ..)
  57.  
  58. Const STATE_INIT        = 0
  59. Const STATE_KEY_PRESS   = 8
  60. Const STATE_BEFORE_EXIT = 7
  61.  
  62. Static hRecvMenu%
  63. Static nCnt%
  64. Static nNewCnt%
  65. Static bInit%
  66.  
  67. Static g_name$
  68. Static g_add$
  69. Static g_login$
  70. Static g_pop$
  71. Static g_smtp$
  72. Static g_bDel%
  73. Static g_ini$
  74. Static outbox$
  75. Static inbox$
  76.  
  77. Static sInBox$(10000)
  78.  
  79. Main ()
  80.  
  81.     Select Case .DanaState
  82.     Case STATE_INIT
  83.         g_name$ = Space$(256)
  84.         g_add$ = Space$(256)
  85.         g_login$ = Space$(256)
  86.         g_pop$ = Space$(256)
  87.         g_smtp$ = Space$(256)
  88.         g_ini$ = .HomePath + "DanaInet.INI"
  89.         UpdateConfig()
  90.         If g_pop$ = "" Or g_smtp$ = "" Then
  91.             SetConfiguration(g_ini$, .hMainWnd)
  92.             UpdateConfig()
  93.             MsgBox("Michelleのメインメニューは、Ctrl+Shift+Enter" + Chr(10) + "または、Ctrl+右マウスボタンで起動します")
  94.         End If
  95.         outbox$ = .HomePath + "outbox\"
  96.         inbox$  = .HomePath + "inbox\"
  97.         CreateDirectory(inbox$, 0)
  98.         CreateDirectory(outbox$, 0)
  99.         CreateDirectory(outbox$ + "sent\", 0)
  100.         StayResident()
  101.     Case STATE_KEY_PRESS
  102.         OnKeyPress(.ParmA, .ParmB)
  103.     Case STATE_BEFORE_EXIT
  104.         OnBeforeExit()
  105.     Case Else
  106.     End Select
  107.  
  108. End
  109.  
  110. '/////////////////////////////////////////////////////////
  111. ' Message handlers
  112.  
  113. '--------------------------------------------------------
  114. ' Key pressed
  115. '--------------------------------------------------------
  116. Proc OnKeyPress(nKey%, nShift%)
  117. '    Dim sCmd$
  118. '    sCmd$ = KeyToCmd(nKey, nShift)
  119.     If (nKey = KEY1 And nShift = SHIFT1) Or (nKey = KEY2 And nShift = SHIFT2) Then
  120.         InetMailMain()
  121.         .ParmA = 0
  122.     End If
  123. End Proc
  124.  
  125. '--------------------------------------------------------
  126. ' Before exit Dana
  127. '--------------------------------------------------------
  128. Proc OnBeforeExit()
  129.     MichelleExit()
  130. End Proc
  131.  
  132. '/////////////////////////////////////////////////////////
  133. ' Initialize
  134.  
  135. 'Menu ID (must be greater than 10000 and less than 17000)
  136. Const C_SEND    = 10001
  137. Const C_RECV    = 10002
  138. Const C_SENDALL = 10003
  139. Const C_REPLY   = 10004
  140. Const C_LIST    = 10005
  141. Const C_DELETE  = 10006
  142. Const C_CONFIG  = 10007
  143. Const C_RECVALL = 10008
  144. Const C_DELFILE = 10009
  145. Const C_TRASH   = 10010
  146. Const C_INBOXDAT= 10011
  147. Const C_ADDRBOOK= 10012
  148. Const C_EDITDELI= 10013
  149. Const C_OPENLOG = 10014
  150. Const C_EDITSIG = 10015
  151. Const C_EMPTYSENT= 10016
  152.  
  153. Const INBOX_DAT    = "inbox.dat"
  154. Const MAILDELI_DAT = "maildeli.dat"
  155. Const SENTMAIL_LOG = "sentmail.log"
  156. Const SIGNATURE_TXT = "sign.txt"
  157.  
  158. Const WILD_CARD = "*.*"
  159.  
  160. Const C_EXIT    = 9999
  161.  
  162. Proc MichelleExit()
  163.     Dim f$, d$
  164.     If hRecvMenu Then DiscardMenu(hRecvMenu)
  165.     If bInit Then MailShutdown()
  166.     d$ = inbox$ + "trash\"
  167.     f$ = Dir(d$ + WILD_CARD)
  168.     While f$ <> ""
  169.         FKill(d$ + f$)
  170.         f$ = Dir("")
  171.     Wend
  172. End Proc
  173.  
  174. '--------------------------------------------------------
  175. ' Main Routine
  176. '--------------------------------------------------------
  177. Proc InetMailMain ()
  178.  
  179.     Dim hMenu%, hMenuIn%, hMenuOut%, hMenuUsr%, hMenuMov%, hMenuEmpty%, hMenuSent%
  180.     hMenu = NewMenu()
  181.     If .TotLine > 0 Then            'Check this or die. :-)
  182.         If UCase(outbox$) = UCase(Left(.PathName, Len(outbox$))) Or UCase(inbox$) = UCase(Left(.PathName, Len(inbox$))) Then
  183.             hMenuMov = AddMenuItem(hMenu, "移動(&M)", 0)
  184.             AddFolders(hMenuMov, 17000)
  185.                 AddMenuItem(hMenuMov, "ごみ箱", C_TRASH)
  186.             AddMenuItem(hMenu, "削除(&D)", C_DELFILE)
  187.             AddMenuItem(hMenu, "", -1)
  188.         End If
  189.     End If
  190.     AddMenuItem(hMenu, "受信(&R)", C_RECV)
  191.     AddMenuItem(hMenu, "全て受信(&V)", C_RECVALL)
  192.     AddMenuItem(hMenu, "送信(&S)...", C_SEND)
  193.     AddMenuItem(hMenu, "一括送信(&A)", C_SENDALL)
  194.     AddMenuItem(hMenu, "返信メールの作成(&P)", C_REPLY)
  195.     AddMenuItem(hMenu, "", -1)
  196.     hMenuIn = AddMenuItem(hMenu, "受信箱(&I)", 0)
  197.     CreateBox(hMenuIn, 0, "inbox")
  198.     hMenuOut = AddMenuItem(hMenu, "送信箱(&O)", 0)
  199.     If CreateBox(hMenuOut, 100, "outbox") Then
  200.         AddMenuItem(hMenuOut, "", -1)
  201.     End If
  202.         hMenuSent = AddMenuItem(hMenuOut, "送信済み(&S)", 0)
  203.         If CreateBox(hMenuSent, 200, "outbox\sent") Then
  204.             AddMenuItem(hMenuSent, "", -1)
  205.             AddMenuItem(hMenuSent, "空にする(&E)", C_EMPTYSENT)
  206.         End If
  207.         AddMenuItem(hMenuOut, "送信ログ(&L)", C_OPENLOG)
  208.     hMenuUsr = AddMenuItem(hMenu, "書簡整理箱(&U)", 0)
  209.     CreateUsrBox(hMenuUsr)
  210.     AddMenuItem(hMenu, "", -1)
  211.     AddMenuItem(hMenu, "サーバー上のメールを削除(&T)...", C_DELETE)
  212.     hMenuEmpty = AddMenuItem(hMenu, "書簡箱を整理(&E)...", 0)
  213.         AddMenuItem(hMenuEmpty, "受信箱(&I)", 18000)
  214.         AddFolders(hMenuEmpty, 18000)
  215.     If nNewCnt Then
  216.         AddMenuItem(hMenu, "受信メール一覧(&L)...", C_LIST)
  217.     End If
  218.     AddMenuItem(hMenu, "", -1)
  219.     AddMenuItem(hMenu, "自動振分け定義編集(&Y)...", C_EDITDELI)
  220.     AddMenuItem(hMenu, "署名の編集(&G)...", C_EDITSIG)
  221.     AddMenuItem(hMenu, "アドレス帳(&B)...", C_ADDRBOOK)
  222.     AddMenuItem(hMenu, "環境設定(&C)...", C_CONFIG)
  223.     AddMenuItem(hMenu, "Michelle の終了(&X)", C_EXIT)
  224.     Dim nRC%
  225.     nRC = DoMenu(hMenu)
  226.  
  227.     Dim sTgt$, f$
  228.  
  229.     Select Case nRC
  230.     Case C_SEND
  231.         Send()
  232.     Case C_RECV
  233.         Receive()
  234.     Case C_RECVALL
  235.         ReceiveAll()
  236.     Case C_REPLY
  237.         Reply()
  238.     Case C_LIST
  239.         ReceivedMail()
  240.     Case C_DELETE
  241.         Delete()
  242.     Case C_SENDALL
  243.         AllSend()
  244.     Case C_CONFIG
  245.         SetConfiguration(g_ini$, .hMainWnd)
  246.         UpdateConfig()
  247.     Case C_DELFILE
  248.         If MsgBox("削除します.よろしいですか?", "", MB_YESNO) = IDYES Then
  249.             SaveAs(.PathName)
  250.             FKill(.PathName)
  251.             Command("CloseFile")
  252.         End If
  253.     Case C_TRASH
  254.         sTgt$ = inbox$ + "trash"
  255.         CreateDirectory(sTgt$, 0)
  256.         FKill(.PathName)
  257.         SaveAs(sTgt$ + "\" + .FileName)
  258.     Case C_INBOXDAT
  259.         FileOpen(.HomePath + INBOX_DAT)
  260.     Case C_EDITDELI
  261.         FileOpen(.HomePath + MAILDELI_DAT)
  262.     Case C_EDITSIG
  263.         FileOpen(.HomePath + SIGNATURE_TXT)
  264.     Case C_ADDRBOOK
  265.         InsertString(GetAddress(.HomePath, .hMainWnd))
  266.     Case C_OPENLOG
  267.         FileOpen(.HomePath + SENTMAIL_LOG)
  268.         .Cols = 256
  269.         Command("TextBot")
  270.     Case C_EXIT
  271.         MichelleExit()
  272.         Terminate()
  273.     Case C_EMPTYSENT
  274.         sTgt$ = outbox$ + "sent\"
  275.         f$ = Dir(sTgt$ + WILD_CARD)
  276.         While f$ <> ""
  277.             FKill(sTgt$ + f$)
  278.             f$ = Dir("")
  279.         Wend
  280.     Case Else
  281.         If nRC > 0 And nRC <= 10000 Then
  282.             FileOpen(sInBox$(nRC))
  283.         Else If nRC > 17000 And nRC < 18000 Then
  284.             ' Move to
  285.             sTgt$ = inbox$ + GetMenuItem(hMenuMov, nRC)
  286.             CreateDirectory(sTgt$, 0)
  287.             FKill(.PathName)
  288.             SaveAs(sTgt$ + "\" + .FileName)
  289.         Else If nRC >= 18000 Then
  290.             ' Empty Folders
  291.             If nRC > 18000 Then
  292.                 sTgt$ = inbox$ + GetMenuItem(hMenuEmpty, nRC) + "\"
  293.             Else
  294.                 sTgt$ = inbox$
  295.             End If
  296.             EmptyFolder(sTgt$)
  297.         End If
  298.     End Select
  299.  
  300.     DiscardMenu(hMenu)
  301.  
  302. End Proc
  303.  
  304. '--------------------------------------------------------
  305. ' Server Initialize
  306. '--------------------------------------------------------
  307. Proc MailInit() As Integer
  308.     If bInit Then Return True
  309.     If MailInitialize(g_pop$, g_smtp$, .hMainWnd) Then
  310.         If MailAuthenticate(g_login$) Then
  311.             bInit = True
  312.             Return True
  313.         Else
  314.             MsgBox("認証に失敗しました" + Chr(10) + GetErrorStatus())
  315.             MailShutdown()
  316.             Return False
  317.         End If
  318.     Else
  319.         MsgBox("初期化に失敗しました" + Chr(10) + GetErrorStatus())
  320.         Return False
  321.     End If
  322. End Proc
  323.  
  324. '--------------------------------------------------------
  325. ' Add Folders to Menu
  326. '--------------------------------------------------------
  327. Proc AddFolders(hMenu%, nBase%)
  328.     Dim fp%
  329.     Dim s$
  330.     Dim n%
  331.     fp = FOpen(.HomePath + INBOX_DAT, "r")
  332.     If fp Then
  333.         s$ = FGets(fp)
  334.         While s$ <> ""
  335.             s$ = Trim(s$)
  336.             If s$ <> Chr(10) And Left$(s$, 1) <> "#" Then
  337.                 n = n + 1
  338.                 AddMenuItem(hMenu, Left(s$, Len(s$)-1), nBase + n)
  339.             End If
  340.             s$ = FGets(fp)
  341.         Wend
  342.         FClose(fp)
  343.     End If
  344. End Proc
  345.  
  346. Proc CreateUsrBox(hMenu%)
  347.     Dim fp%
  348.     Dim s$, d$
  349.     Dim n%
  350.     Dim nBase%
  351.     Dim hSubMenu%
  352.     nBase = 300
  353.     fp = FOpen(.HomePath + INBOX_DAT, "r")
  354.     If fp Then
  355.         s$ = FGets(fp)
  356.         While s$ <> ""
  357.             s$ = Trim(s$)
  358.             If s$ <> Chr(10) And Left$(s$, 1) <> "#" Then
  359.                 n = n + 1
  360.                 d$ = Left(s$, Len(s$)-1)
  361.                 hSubMenu = AddMenuItem(hMenu, d$, 0)
  362.                 CreateBox(hSubMenu, nBase, "inbox\" + d$)
  363.                 nBase = nBase + 100
  364.             End If
  365.             s$ = FGets(fp)
  366.         Wend
  367.         FClose(fp)
  368.     End If
  369.     hSubMenu = AddMenuItem(hMenu, "ごみ箱", 0)
  370.     CreateBox(hSubMenu, nBase, "inbox\trash")
  371.     AddMenuItem(hMenu, "", -1)
  372.     AddMenuItem(hMenu, "書簡定義の編集(&E)", C_INBOXDAT)
  373. End Proc
  374.  
  375. Proc CreateBox(hMenu%, nInit%, sDir$) As Integer
  376.     Dim s$, d$, f$, n%
  377.     d$ = .HomePath + sDir$
  378.     s$ = Dir(d$ + "\" + WILD_CARD)
  379.     While s$ <> ""
  380.         Dim h$
  381.         f$ = d$ + "\" + s$
  382.         h$ = GetHeader(f$)
  383.         If Trim(h$) <> "" Then
  384.             n = n + 1
  385.             If n > 100 Then
  386.                 Return n-1
  387.             End If
  388.             sInBox$(nInit + n) = f$
  389.             AddMenuItem(hMenu, "&" + Str(n) + " " + h$, nInit + n)
  390.         End If
  391.         s$ = Dir$("")
  392.     Wend
  393.     Return n
  394. End Proc
  395.  
  396. '--------------------------------------------------------
  397. ' Get Header Information from Mail File
  398. '--------------------------------------------------------
  399. Proc GetHeader(sFile$) As String
  400.     Dim fp%, s$, n%
  401.     Dim from$, subj$
  402.     fp = FOpen(sFile$, "r")
  403.     If fp Then
  404.         s$ = FGets(fp)
  405.         While s$ <> Chr(10) And s$ <> ""
  406.             s$ = Left(s$, Len(s$) - 1)
  407.             n = InStr(s$, ":")
  408.             If n Then
  409.                 Dim m$
  410.                 m$ = UCase(Left(s$, n - 1))
  411.                 If m$ = "FROM" Then
  412.                     from$ = Mid$(s$, n + 1, 40)
  413.                 Else If m$ = "SUBJECT" Then
  414.                     subj$ = Mid$(s$, n + 1, 40)
  415.                 End If
  416.             End If
  417.             s$ = FGets(fp)
  418.         Wend
  419.         FClose(fp)
  420.     End If
  421.     Return subj + Chr(9) + from$
  422. End Proc
  423.  
  424. '/////////////////////////////////////////////////////////
  425. ' Command routines
  426.  
  427. '--------------------------------------------------------
  428. ' Empty This Folder
  429. '--------------------------------------------------------
  430. Proc EmptyFolder(sFold$)
  431.     Dim s$
  432.     Dim nRC%
  433.     s$ = Dir(sFold$ + WILD_CARD)
  434.     If s$ = "" Then
  435.         MsgBox("書簡箱は空です")
  436.         Return
  437.     End If
  438.     While s$ <> ""
  439.         nRC = MsgBox(Trim(GetHeader(sFold$ + s$)) + Chr(10) + "削除しますか?", "", MB_YESNOCANCEL | MB_ICONQUESTION)
  440.         If nRC = IDCANCEL Then Return
  441.         If nRC = IDYES Then
  442.             FKill(sFold$ + s$)
  443.         End If
  444.         s$ = Dir("")
  445.     Wend
  446. End Proc
  447.  
  448. '--------------------------------------------------------
  449. ' Send Command
  450. '--------------------------------------------------------
  451. Proc Send()
  452.     Dim add$, subj$, cc$, bcc$, content$
  453.     Dim nRC%
  454.     Silent()
  455.     Command("SelectAll")
  456.     content$ = GetSelected()
  457.     SelectCancel()
  458.     GotoThere(1,1)
  459.     NoSilent()
  460.     Refresh()
  461.     Dim hLine%
  462.     Dim sLine$
  463.     Dim n%, nIdx%, s$
  464.     Dim sArr$(4)
  465.     Dim I%
  466.     For I = 1 To 4
  467.         sArr$(I) = ""
  468.     Next
  469.     Dim bFound%
  470.     hLine = GetTopLine()
  471.     sLine$ = LoadThisLine(hLine)
  472.     If InStr(sLine$, ":") <> 0 Then
  473.         Do
  474.             n = InStr(sLine$, ":")
  475.             If n Then
  476.                 s$ = Left(sLine$, n-1)
  477.                 Select Case UCase(s$)
  478.                 Case "TO"
  479.                     nIdx = 1
  480.                 Case "SUBJECT"
  481.                     nIdx = 2
  482.                 Case "CC"
  483.                     nIdx = 3
  484.                 Case "BCC"
  485.                     nIdx = 4
  486.                 Case Else
  487.                     nIdx = 0
  488.                 End Select
  489.                 If nIdx Then
  490.                     sArr$(nIdx) = Trim(Mid$(sLine$, n + 1))
  491.                 End If
  492.             Else If sLine$ = "" Then
  493.                 bFound = True
  494.                 Exit Do
  495.             Else
  496.                 If nIdx Then
  497.                     sArr$(nIdx) = sArr$(nIdx) + Trim(sLine$)
  498.                 End If
  499.                 Exit Do
  500.             End If
  501.             hLine = GetNext(hLine)
  502.             If hLine = 0 Then Exit Do
  503.             sLine$ = LoadThisLine(hLine)
  504.         Loop While True
  505.     End If
  506.     add$  = sArr$(1)
  507.     subj$ = sArr$(2)
  508.     cc$   = sArr$(3)
  509.     bcc$  = sArr$(4)
  510.     If bFound Then
  511.         n = InStr(content$, Chr(13) + Chr(10) + Chr(13) + Chr(10))
  512.         If n Then
  513.             content$ = Mid(content$, n + 4, Len(content$))
  514.         End If
  515.     End If
  516.     Do
  517.         SetFormValue("To", add$)
  518.         SetFormValue("Subject", subj$)
  519.         SetFormValue("Cc", cc$)
  520.         SetFormValue("Bcc", bcc$)
  521.         If OpenSendForm(.HomePath, .hMainWnd) <> IDOK Then Return
  522.         add$  = GetFormValue("To")
  523.         subj$ = GetFormValue("Subject")
  524.         cc$   = GetFormValue("Cc")
  525.         bcc$  = GetFormValue("Bcc")
  526.         If add$ <> "" Then
  527.             Exit Do
  528.         Else
  529.             MsgBox("宛先(To:)を入力して下さい")
  530.         End If
  531.     Loop While True
  532.  
  533.     If MsgBox("今すぐ送信しますか?", "", MB_YESNO) = IDYES Then
  534.         If MailInit() Then
  535.             content$ = content$ + GetSignature()
  536.             If SendMail(g_name$ + " <" + g_add$ + ">", add$, cc$, bcc$, subj$, content$) = 0 Then
  537.                 MsgBox("送信に失敗しました" + Chr(10) + GetErrorStatus())
  538.             Else
  539.                 If UCase(outbox$) = UCase(Left(.PathName, Len(outbox$))) Then
  540.                     FKill(.PathName)
  541.                     SaveAs(outbox$ + "sent\" + .FileName)
  542.                     Command("CloseFile")
  543.                 Else
  544.                     SaveAsOutMail(add$, cc$, bcc$, subj$, content$, False)
  545.                 End If
  546.                 AddLogFile(add$, subj$)
  547.             End If
  548.         End If
  549.     Else
  550.         If UCase(outbox$) = UCase(Left(.PathName, Len(outbox$))) Then
  551.             SaveAs(.PathName)
  552.             FKill(.PathName)
  553.             Command("CloseFile")
  554.             SaveAsOutMail(add$, cc$, bcc$, subj$, content$, True)
  555.         Else
  556.             SaveAsOutMail(add$, cc$, bcc$, subj$, content$, True)
  557.         End If
  558.     End If
  559. End Proc
  560.  
  561. '--------------------------------------------------------
  562. ' Send All
  563. '--------------------------------------------------------
  564. Proc AllSend()
  565.     Dim s$, d$, tmp$, tmp2$
  566.     Dim fp%, n%
  567.     Dim add$, cc$, bcc$, subj$, content$
  568.     Dim sig$
  569.     sig$ = GetSignature()
  570.     d$ = outbox$
  571.     s$ = Dir(d$ + WILD_CARD)
  572.     If s$ = "" Then
  573.         MsgBox("送信待ち状態のメールはありません")
  574.         Return
  575.     End If
  576.     While s$ <> ""
  577.         add$ = ""
  578.         cc$ = ""
  579.         bcc$ = ""
  580.         subj$ = ""
  581.         content$ = ""
  582.         fp = FOpen(d$ + s$, "r")
  583.         If fp Then
  584.             tmp$ = FGets(fp)
  585.             While tmp$ <> Chr(10) And tmp$ <> ""
  586.                 tmp$ = Left(tmp$, Len(tmp$) - 1)
  587.                 n = InStr(tmp$, ":")
  588.                 If n Then
  589.                     tmp2$ = UCase(Left(tmp$, n - 1))
  590.                     Select Case tmp2$
  591.                     Case "TO"
  592.                         add$ = LTrim(Mid(tmp$, n + 1))
  593.                     Case "CC"
  594.                         cc$ = LTrim(Mid(tmp$, n + 1))
  595.                     Case "BCC"
  596.                         bcc$ = LTrim(Mid(tmp$, n + 1))
  597.                     Case "SUBJECT"
  598.                         subj$ = LTrim(Mid(tmp$, n + 1))
  599.                     End Select
  600.                 End If
  601.                 tmp$ = FGets(fp)
  602.             Wend
  603.             tmp$ = FGets(fp)
  604.             While tmp$ <> ""
  605.                 StoB(tmp$, Len(tmp$) - 1, &H0D)
  606.                 content$ = content$ + tmp$ + Chr(10)
  607.                 tmp$ = FGets(fp)
  608.             Wend
  609.             FClose(fp)
  610.             If MailInit() Then
  611.                 content$ = content$ + sig$
  612.                 If SendMail(g_name$ + " <" + g_add$ + ">", add$, cc$, bcc$, subj$, content$) = 0 Then
  613.                     MsgBox("送信に失敗しました" + Chr(10) + GetErrorStatus())
  614.                     Return
  615.                 End If
  616.                 AddLogFile(add$, subj$)
  617.                 FCopy(d$ + s$, outbox$ + "sent\" + s$)
  618.                 FKill(d$ + s$)
  619.             Else
  620.                 Return
  621.             End If
  622.         End If
  623.         s$ = Dir("")
  624.     Wend
  625. End Proc
  626.  
  627. Dim fname$(40)
  628. Dim bAll%
  629.  
  630. '--------------------------------------------------------
  631. ' Add Log File
  632. '--------------------------------------------------------
  633. Proc AddLogFile(add$, subj$)
  634.     Dim fp%
  635.     Dim s$
  636.     s$ = Space(256)
  637.     fp = FOpen(.HomePath + SENTMAIL_LOG, "w")
  638.     FSeek(fp, 0, 1)
  639.     wsprintf(s$, "%s %s To:%-30s %s" + Chr(10), Date(), Time("%H:%M"), add$, subj$)
  640.     FPuts(fp, s$)
  641.     FClose(fp)
  642. End Proc
  643.  
  644. '--------------------------------------------------------
  645. ' Receive All Mail in Server
  646. '--------------------------------------------------------
  647. Proc ReceiveAll()
  648.     bAll = True
  649.     Receive()
  650.     bAll = False
  651. End Proc
  652.  
  653. '--------------------------------------------------------
  654. ' Receive Unread Mail
  655. '--------------------------------------------------------
  656. Proc Receive()
  657.     Dim buf$
  658.     Dim stat$
  659.     Dim nRC%
  660.     Dim recv$
  661.     buf$ = Space$(2048)
  662.     stat$ = Space$(256)
  663.     If MailInit() Then
  664.         If StartReceiveSession() Then
  665.             nCnt = 0
  666.             nNewCnt = 0
  667.             If hRecvMenu <> 0 Then
  668.                 DiscardMenu(hRecvMenu)
  669.             End If
  670.             hRecvMenu = NewMenu()
  671.             Dim nBytes%
  672.             nBytes = ListMail(buf$, stat$)
  673.             While nBytes
  674.                 nCnt = nCnt + 1
  675.                 If InStr(stat$, "R") = 0 Or bAll Then
  676.                     fname$(nCnt) = TmpName(inbox$)
  677.                     FileOpen(fname$(nCnt))
  678.                     If .TotLine > 1 Then
  679.                         MsgBox("メールが多すぎます")
  680.                         Exit While
  681.                     End If
  682.                     .Cols = 256
  683.                     AddMenuItem(hRecvMenu, "&" + buf, nCnt)
  684.                     recv$ = Space(nBytes + 256)        'approximately.
  685.                     GetMail(nCnt, recv$, 0, g_bDel)
  686.                     nNewCnt = nNewCnt + 1
  687.                     DoEvents()
  688.                     SetFocus(.hWnd)            'for Dana's bug
  689.                     InsertString(recv$)
  690.                     Command("TextTop")
  691.                     If EUC_RECEIVE = True Then
  692.                         EucToSjisText()
  693.                     End If
  694.                     SaveAs(fname$(nCnt))
  695.                     Delivery()
  696.                     fname$(nCnt) = .PathName
  697.                 End If
  698.                 nBytes = ListMail(buf$, stat$)
  699.             Wend
  700.             recv$ = ""
  701.             EndReceiveSession()
  702.         Else
  703.             MsgBox("受信に失敗しました" + Chr(10) + GetErrorStatus())
  704.         End If
  705.     End If
  706.  
  707.     If nNewCnt > 1 Then
  708.         nRC = DoMenu(hRecvMenu)
  709.         if (nRC <> -1) Then FileOpen(fname$(nRC))
  710.     Else If nNewCnt = 0 Then
  711.         Dim sNew$
  712.         sNew$ = "新着メールはありません"
  713.         If nCnt Then
  714.             sNew$ = sNew$ + Chr(10) + Str(nCnt) + " 通の既読メールがサーバーにあります"
  715.         End If
  716.         MsgBox(sNew$)
  717.     End If
  718. End Proc
  719.  
  720. '--------------------------------------------------------
  721. ' List of Received Mail
  722. '--------------------------------------------------------
  723. Proc ReceivedMail()
  724.     Dim nRC%
  725.     If hRecvMenu Then
  726.         nRC = DoMenu(hRecvMenu)
  727.         if (nRC <> -1) Then FileOpen(fname$(nRC))
  728.     End If
  729. End Proc
  730.  
  731. '--------------------------------------------------------
  732. ' Compose Reply Mail
  733. '--------------------------------------------------------
  734. Proc Reply()
  735.     Dim add$, subj$, cc$, content$
  736.     Dim nRC%
  737.     Silent()
  738.     Command("SelectAll")
  739.     content$ = GetSelected()
  740.     SelectCancel()
  741.     GotoThere(1,1)
  742.     NoSilent()
  743.     Refresh()
  744.     Dim hLine%
  745.     Dim sLine$
  746.     Dim n%, nIdx%, s$
  747.     Dim sArr$(4)
  748.     Dim I%
  749.     For I = 1 To 4
  750.         sArr$(I) = ""
  751.     Next
  752.     hLine = GetTopLine()
  753.     sLine$ = LoadThisLine(hLine)
  754.     If InStr(sLine$, ":") <> 0 Then
  755.         Do
  756.             n = InStr(sLine$, ":")
  757.             If n Then
  758.                 s$ = Left(sLine$, n-1)
  759.                 Select Case UCase(s$)
  760.                 Case "FROM"
  761.                     nIdx = 1
  762.                 Case "SUBJECT"
  763.                     nIdx = 2
  764.                 Case "CC"
  765.                     nIdx = 3
  766.                 Case "REPLY-TO"
  767.                     nIdx = 4
  768.                 Case Else
  769.                     nIdx = 0
  770.                 End Select
  771.                 If nIdx Then
  772.                     sArr$(nIdx) = Trim(Mid$(sLine$, n + 1))
  773.                 End If
  774.             Else If sLine$ = "" Then
  775.                 Exit Do
  776.             Else
  777.                 If nIdx Then
  778.                     sArr$(nIdx) = sArr$(nIdx) + Trim(sLine$)
  779.                 End If
  780.             End If
  781.             hLine = GetNext(hLine)
  782.             If hLine = 0 Then Exit Do
  783.             sLine$ = LoadThisLine(hLine)
  784.         Loop While True
  785.     End If
  786.     If sArr$(4) <> "" Then        'Reply-To
  787.         add$ = sArr$(4)
  788.     Else
  789.         add$  = sArr$(1)
  790.     End If
  791.     subj$ = "Re:" + sArr$(2)
  792.     cc$   = sArr$(3)
  793.     If add$ = "" Then
  794.         MsgBox("返信先がわかりません.")
  795.         Return
  796.     End If
  797.     n = InStr(content$, Chr(13) + Chr(10) + Chr(13) + Chr(10))
  798.     If n Then
  799.         content$ = Mid(content$, n + 4, Len(content$))
  800.     End If
  801.     FileOpen(TmpName(outbox$))
  802.     SetFocus(.hWnd)
  803.     Silent()
  804.     InsertString(content$)
  805.     Command("SelectAll")
  806.     AddString("> ")
  807.     SelectCancel()
  808.     GotoThere(1,1)
  809.     InsertString("To: " + add$ + Chr(10))
  810.     InsertString("Subject: " + subj$ + Chr(10))
  811.     If cc$ <> "" Then
  812.         InsertString("Cc: " + cc$ + Chr(10))
  813.     End If
  814.     InsertString(Chr(10))
  815.     Command ("TextBot")
  816.     NoSilent()
  817.     Command ("InsertAft")
  818.     Refresh()
  819. End Proc
  820.  
  821. '--------------------------------------------------------
  822. ' Delete Mail Which Have been Read
  823. '--------------------------------------------------------
  824. Proc Delete()
  825.     Dim I%
  826.     Dim buf$
  827.     Dim stat$
  828.     buf$ = Space$(2048)
  829.     stat$ = Space$(256)
  830.     If MsgBox("サーバー上のメールを全て削除します" + Chr(10) + "よろしいですか?",  "", MB_YESNO) = IDNO Then
  831.         Return
  832.     End If
  833.     MailInit()
  834.     If StartReceiveSession() Then
  835.         I = 0
  836.         While ListMail(buf$, stat$)
  837.             I = I + 1
  838.             If InStr(stat$, "R") = 0 Then
  839.                 If MsgBox(buf$ + Chr(10) + "未読メールです" + Chr(10) + "削除してよろしいですか?",  "", MB_YESNO | MB_DEFBUTTON2) = IDYES Then
  840.                     If DeleteMail(I) = False Then
  841.                         MsgBox("削除に失敗しました" + Chr(10) + GetErrorStatus())
  842.                         EndReceiveSession()
  843.                         Return
  844.                     End If
  845.                 End If
  846.             Else If DeleteMail(I) = False Then
  847.                 MsgBox("削除に失敗しました" + Chr(10) + GetErrorStatus())
  848.                 EndReceiveSession()
  849.                 Return
  850.             End If
  851.         Wend
  852.         EndReceiveSession()
  853.     End If
  854. End Proc
  855.  
  856. '////////////////////////////////////////////////////////////////
  857. ' Sub routines
  858.  
  859. Proc UpdateConfig()
  860.     Dim sDel$
  861.     sDel = "  "
  862.     GetConfiguration(g_ini$, g_name$, g_add$, g_login$, g_pop$, g_smtp$, sDel$)
  863.     g_bDel = Val(sDel$)
  864. End Proc
  865.  
  866. '--------------------------------------------------------
  867. ' Delivery Received Mail
  868. '--------------------------------------------------------
  869. Proc Delivery()
  870.     Dim fp%
  871.     Dim s$
  872.     Dim n1%, n2%, i%, nC%
  873.     Dim head$, sch$, fold$
  874.     fp = FOpen(.HomePath + MAILDELI_DAT, "r")
  875.     If fp = 0 Then Return
  876.     s$ = FGets(fp)
  877.     Do
  878.         s$ = Trim(Left(s$, Len(s$)-1))
  879.         If Left(s$, 1) <> "#" And s$ <> "" Then
  880.             i = 0
  881.             n1 = 0
  882.             n2 = 0
  883.             Do
  884.                 nC = LodB(s$, i)
  885.                 If nC = &H09 Then
  886.                     If n1 = 0 Then
  887.                         n1 = i
  888.                     Else If n2 = 0 Then
  889.                         n2 = i
  890.                         Exit Do
  891.                     End If
  892.                 End If
  893.                 i = i+1;
  894.             Loop While nC
  895.             If n1 And n2 Then
  896.                 head$ = Left(s$, n1)
  897.                 sch$  = Mid(s$, n1+2, n2 - (n1+1))
  898.                 fold$ = Mid(s$, n2 + 2)
  899.                 If fold$ = "ごみ箱" Then
  900.                     fold$ = "trash"
  901.                 End If
  902.             End If
  903.             If head$ <> "" And sch$ <> "" And fold$ <> "" Then
  904.                 Dim hLine%
  905.                 Dim sLine$
  906.                 Dim sHead$
  907.                 sLine$ = ""
  908.                 sHead$ = ""
  909.                 hLine = GetTopLine()
  910.                 While hLine
  911.                     sLine$ = Trim(LoadThisLine(hLine))
  912.                     If sLine$ = "" Then Exit While
  913.                     i = InStr(sLine$, ":")
  914.                     If i <> 0 Or (i = 0 And sHead$ <> "") Then
  915.                         If i <> 0 Then 
  916.                             sHead$ = Left(sLine$, i-1)
  917.                             sLine$ = Mid(sLine$, i+1)
  918.                         End If
  919.                         If UCase(sHead$) = UCase(head$) Then
  920.                             n1 = InStr(sLine$, sch$)
  921.                             If n1 Then
  922.                                 Dim sSave$
  923.                                 sSave$ = inbox$ + fold$
  924.                                 CreateDirectory(sSave$, 0)
  925.                                 FKill(.PathName)
  926.                                 SaveAs(sSave$ + "\" + .FileName)
  927.                                 Return
  928.                             End If
  929.                         End If
  930.                     End If
  931.                     hLine = GetNext(hLine)
  932.                 Wend
  933.             End If
  934.         End If
  935.         s$ = FGets(fp)
  936.     Loop While s$ <> ""
  937.     FClose(fp)
  938. End Proc
  939.  
  940. '--------------------------------------------------------
  941. ' Save to Outbox
  942. '--------------------------------------------------------
  943. Proc SaveAsOutMail(add$, cc$, bcc$, subj$, content$, bOutBox%) As String
  944.     Dim outdir$
  945.     Dim fp%
  946.     Dim s$
  947.     If bOutBox Then
  948.         s$ = TmpName(outbox$)
  949.     Else
  950.         s$ = TmpName(outbox$ + "sent\")
  951.     End If
  952.     fp = FOpen(s$, "w")
  953.     If fp Then
  954.         FPuts(fp, "To:" + add$ + Chr(10))
  955.         FPuts(fp, "Cc:" + cc$ + Chr(10))
  956.         FPuts(fp, "Bcc:" + bcc$ + Chr(10))
  957.         FPuts(fp, "Subject:" + subj$ + Chr(10) + Chr(10))
  958.         Dim cr%
  959.         Dim w$
  960.         Dim nLen%
  961.         nLen = Len(content$)
  962.         Do
  963.             cr% = InStr(content$, Chr(13))
  964.             If cr Then
  965.                 w$ = Left(content$, cr-1) + Chr(10)
  966.                 content$ = Mid$(content$, cr+2, nLen)
  967.             Else
  968.                 w$ = content$ + Chr(10)
  969.                 content$ = ""
  970.             End If
  971.             FPuts(fp, w$)
  972.         Loop While content$ <> ""
  973.         FClose(fp)
  974.     Else
  975.         MsgBox("送信箱が開けません")
  976.     End If
  977.     Return s$
  978. End Proc
  979.  
  980. '--------------------------------------------------------
  981. ' Get Unique Temporary File Name
  982. '--------------------------------------------------------
  983. Dim nTmpCnt%
  984.  
  985. Proc TmpName(dirname$) As String
  986.     Dim s$
  987.     Do
  988.         s$ = Date("%m%d%H%M") + "." + Hex$(nTmpCnt)
  989.         nTmpCnt = nTmpCnt + 1
  990.         If nTmpCnt >= &H1000 Then nTmpCnt = 0
  991.         s$ = dirname$ + s$
  992.     Loop While Dir$(s$) <> ""
  993.     Return s$
  994. End Proc
  995.  
  996. '--------------------------------------------------------
  997. ' Get Signature Text
  998. '--------------------------------------------------------
  999. Proc GetSignature() As String
  1000.     Dim s$
  1001.     Dim sig$
  1002.     Dim fp%
  1003.     sig$ = Chr(13) + Chr(10)
  1004.     fp = FOpen(.HomePath + SIGNATURE_TXT, "r")
  1005.     If fp Then
  1006.         s$ = FGets(fp)
  1007.         While s$ <> ""
  1008.             s$ = Left(s$, Len(s$) -1)
  1009.             sig$ = sig$ + s$ + Chr(13) + Chr(10)
  1010.             s$ = FGets(fp)
  1011.         Wend
  1012.     End If
  1013.     If sig$ = Chr(13) + Chr(10) Then
  1014.         sig$ = ""
  1015.     End If
  1016.     Return sig$
  1017. End Proc
  1018.  
  1019. '-----------------------------------------------------------
  1020. ' convert EUC mail to SJIS
  1021. '-----------------------------------------------------------
  1022. Proc EucToSjisText()
  1023.     Dim Cur$, Sav$
  1024.     Dim hLine%
  1025.     Dim bKanji%
  1026.     hLine = GetTopLine()
  1027.     Sav$ = Space$(16384)
  1028.     Do While hLine
  1029.         Cur$ = LoadThisLine(hLine)
  1030.         Dim I%, Idx%, Char%, Char2%, nLen%
  1031.         Idx = 0
  1032.         nLen = Len(Cur$)
  1033.         bKanji = False
  1034.         For I = 0 To nLen
  1035.             Char = LodB(Cur$, I)
  1036.             If Char = &H00 Then
  1037.                 Exit For
  1038.             Else
  1039.                 If Char > &H7F Then
  1040.                     bKanji = True
  1041.                     I = I + 1
  1042.                     If Char = &H85 Then
  1043.                         Char2 = LodB(Cur$, I)
  1044.                         StoB(Sav$, Idx, Char2)
  1045.                         Idx = Idx + 1
  1046.                     Else
  1047.                         Char = (Char << 8) + LodB(Cur$, I)
  1048.                         Char2 = EucToSjis(Char)
  1049.                         StoB(Sav$, Idx, Char2 >> 8)
  1050.                         StoB(Sav$, Idx+1, Char2 & &HFF)
  1051.                         Idx = Idx + 2
  1052.                     End If
  1053.                 Else
  1054.                     StoB(Sav$, Idx, Char)
  1055.                     Idx = Idx + 1
  1056.                 End If
  1057.             End If
  1058.         Next I
  1059.         StoB(Sav$, Idx, &H00)
  1060.         if bKanji Then hLine = SaveThisLine(hLine, Sav$)
  1061.         hLine = GetNext(hLine)
  1062.     Loop
  1063. End Proc
  1064.