0

メールを自動的に送信したい MS Access 2010 db があります。クエリをセットアップしましたが、CDO VBA で行き詰まりました。彼らのクエリは「qryEmails」と呼ばれ、次の 4 つのフィールドが含まれています。

ReturnCode, SalesOrderNumber, Name, EmailAddress

アクセス方法:

  1. 各レコードをループし、リストされた各電子メール アドレスに電子メールを送信します
  2. 各メールに、最初の 3 つのフィールドへの参照を含むメッセージを含めることで、各メッセージがパーソナライズされたように表示されます
  3. 動的な件名を持っているので、ReturnCodeフィールドは各件名にあります

最初は小さなステップを試していましたが、これまでのところ、同じアドレスに数百通のメールを受信して​​います。これが私のコードです(情報を開示したくない場合はXXXを使用しました):

Dim rst As ADODB.Recordset
Dim strSQL As String
Dim strEmail As String
Set rst = New ADODB.Recordset
'
strSQL = "[qryEmails]"  'source of recordset
rst.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
'
Do While Not rst.EOF
    strEmail = rst.Fields("EmailAddress")

    Set objMessage = CreateObject("CDO.Message")
    objMessage.Subject = "Your refund is:" '
    objMessage.FROM = """SENDER"" <XXX@somewhere.com>"
    objMessage.To = rst.Fields("EmailAddress")
    objMessage.TextBody = objMessage.TextBody & rst(1)


    '==Add fields to email body
    'Do While strEmail = rst.Fields("EmailAddress")

    'rst.MoveNext
    'If rst.EOF Then Exit Do
    'Loop

' ========= SMTP server configuration 

        objMessage.Configuration.Fields.Item _
         ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2

        'Name or IP of Remote SMTP Server
        objMessage.Configuration.Fields.Item _
        ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "XXX"

        'Server port (typically 25)
        objMessage.Configuration.Fields.Item _
        ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25

        objMessage.Configuration.Fields.Update

        '==End remote SMTP server configuration section==

        'Send email
        objMessage.Send
        'Clear variable for next loop
        Set objMessage = Nothing
    Loop
rst.Close
Set rst = Nothing

これが何百通ものメールを送信している理由は何ですか? これまでのクエリ結果は、テスト目的で 2 つのアドレスのみを返しています。

4

1 に答える 1

1

ループ内では、レコードセットは同じ行に残ります。そして、レコードセットの行は変更されないため、到達することはありませんrst.EOF

そのコードには、無効な行が含まれていますMoveNext。その行のコメントを外します。Loopそして、おそらくステートメントの直前に配置したいと思うでしょう。

Do While Not rst.EOF
    ' do everything you need for current record,
    ' then move to the next record ...
    rst.MoveNext
Loop
于 2013-12-16T16:01:10.093 に答える