CDOで、自動でメール送信する方法について


ごめす  2006-02-03 22:44:19  No: 130043

適用環境:XP or 2000
言語:VB6.0
動作環境には、ノートン先生が入っています。

いつもこちらを拝見し、勉強させていただいています。

早速ですが、標題の件について質問させていただきます。

今回、UI無しのタイマーをトリガとした定周期で動作するプログラムに、
エラーが発生した際に、自動でメールを送信する機能を実装したいと
考えています。

で、CDOを採用してメール送信を組み込んだのですが、以下問題が発生。

  1.SENDメソッドを使用した後に、すぐにメールを送信しない。
  2.動作確認の為、5分毎に同じエラーが発生するようにしているが、
    次のSENDメソッドかCDOを使うタイミングで、メール送信処理が始まり、
    ノートン先生で「メールおくれないよ」という警告が表示されます。
    (一つ前のメールは、確実に送信されない)

  ※送れる/送れないはノートン先生のチェックでとりあえず判定しています。

ここから、本題となりますが、

  なぜ、1ですぐ送信できないのでしょうか??

    サンプルで、簡易メーラもどきを作った際は、
    このような問題は発生せず、すぐに送信されております。
    ・・・ただ、それを含むクリックイベントが完了したタイミングで
      送信されているようです。
      非同期/同期のような設定があるのでしょうか。。
    
    今回の定周期タスクに画面を持たしてみて、そこからボタンイベントで、
    イベントを発生させた場合に、下記ステップでメール送信を実行している
    ことと、どうやらその時に一つ前のメールを送っているようです。
    Set cdoConf = New CDO.Configuration
    
    
  →なんとなく、CDO用の送信キューにためるだけで終わっている?
    ユーザイベントを使わないと、送れない?
    という感じを持っています。
    
  2.については、上記解決すれば、おのずと消去されるので、重要視していません。

以下に、ソースを抜粋します。

'=================
'CDO変数
'=================
'参照設定
Private cdoMsg    As CDO.Message
Private cdoConf   As CDO.Configuration
''実行時
'Private cdoMsg    As Object
'Private cdoConf   As Object

'===============================================================================
'メンバ変数
'
'  ※複数指定する場合は、タブでアイテム間を区切ること。
'
'===============================================================================
Private m_SndMethod     As enmSendMethod
Private m_strSmtpSv     As String       'SMTPサーバ名(IPも可)
Private m_strMailTo     As String       'To
Private m_strMailFrom   As String       'From
Private m_strCC         As String       'CC
Private m_strBCC        As String       'BCC
Private m_blnAuth       As Boolean      '認証有無
Private m_strUserName   As String       '認証名  
Private m_strUserPass   As String       '認証パス
Private m_strSubject    As String       '主題
Private m_strTextBody   As String       '本文
Private m_strAttachment As String       '添付ファイル(フルパス)

'===============================================================================
'関数ステップ
'
'
'===============================================================================
Private Function SendMailCdo(ByRef FeedBack As String) As Long
    Dim strRet      As String
    Dim lngRet      As Long
    Dim strWork()   As String
    
    On Error GoTo ErrHandler
    
    SendMailCdo = -1
    
'    Set cdoMsg = CreateObject("CDO.Message")
'    Set cdoConf = CreateObject("CDO.Configuration")
    Set cdoMsg = New CDO.Message
    Set cdoConf = New CDO.Configuration  ’←なんで、ここで送信?
    
    With cdoConf.Fields
    
        .Item(cdoSendUsingMethod) = cdoSendUsingPort
        .Item(cdoSMTPServer) = m_strSmtpSv
        
        If m_blnAuth Then
            .Item(cdoSMTPAuthenticate) = 1
            .Item(cdoSendUserName) = m_strUserName
            .Item(cdoSendPassword) = m_strUserPass
        End If
        
        .Update
    End With
    
    With cdoMsg
    
        Set .Configuration = cdoConf

        '宛先
        '複数はカンマ区切り
        .To = Replace(m_strMailTo, vbTab, ",")
        .CC = ""
        .BCC = ""

        .From = m_strMailFrom
        
        .Subject = m_strSubject
        .TextBody = m_strTextBody

        
        .Send
    End With
        
    SendMailCdo = 0
    
    Exit Function
ErrHandler:
    SendMailCdo = Err.Number
    FeedBack = Err.Description
    Exit Function
exit function

=======================================================

ご存知の方、おられましたら
ぜひ御教授願います。

以上です。


ごめす  2006-02-03 22:52:35  No: 130044

すみません、追記です。

CDOは、「参照設定」の名称でいくと、
"Microsoft CDO for Windows 2000 Library"とあり、
cdosys.dllを参照しています。

最終的には、2000/2003サーバにも導入する予定なので、
デバッグ後、実行時バインドに切り替えて使用するつもりです。

以上です。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加