2013-07-03 78 views
0

我有一個腳本來自動電子郵件存儲在Excel地址名單,但它只發送到第一個地址,而不是循環的休息,我似乎無法修復它:VBScript的SMTP自動電子郵件

Set objMessage = CreateObject("CDO.Message") 
Set app = CreateObject("Excel.Application") 
Set fso = CreateObject("Scripting.FileSystemObject") 

For Each f In fso.GetFolder("Y:\Billing_Common\autoemail").Files 
    If LCase(fso.GetExtensionName(f)) = "xls" Then 
    Set wb = app.Workbooks.Open(f.Path) 

set sh = wb.Sheets("Auto Email Script") 
row = 2 
email = sh.Range("A" & row) 
LastRow = sh.UsedRange.Rows.Count 

Const ForReading = 1, ForWriting = 2, ForAppending = 8 
Dim f         
Set f = fso.OpenTextFile("Y:\Billing_Common\autoemail\Script\Email.txt", ForReading)           
BodyText = f.ReadAll 

For r = row to LastRow 
    If App.WorkSheetFunction.CountA(sh.Rows(r)) <> 0 Then 
    objMessage.Subject = "Billing: Meter Read" 
    objMessage.From = "[email protected]" 
    row = row + 1 
    objMessage.To = email 
    objMessage.TextBody = BodyText 

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") = "SERVER ADDRESS HERE" 

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

objMessage.Configuration.Fields.Update 
objMessage.Send 

    End if 
Next 

f.Close 
Set f = Nothing 
Set fso = Nothing 
wb.Close 
End If 
Next 

任何幫助將不勝感激的傢伙!

謝謝!

+0

你能提供的XLS和文本文件的屏幕截圖?所以我可以肯定我們正在研究同樣的問題。 –

回答

2
row = 2 
email = sh.Range("A" & row) 
... 
For r = row to LastRow 
    ... 
    objMessage.To = email 
    ... 
Next 

您設置email到細胞"A2"的價值,並不會改變它。如果您要發送郵件給多個收件人,你應該做的是

objMessage.To = sh.Range("A" & r).Value 

或(更好)建立收件人列表(假設你的使用範圍與第一個錶行頭開始):

ReDim recipients(LastRow - row) 
For r = row To LastRow 
    recipients(r - row) = sh.Range("A" & r).Value 
Next 
objMessage.To = Join(recipients, ";") 

併發送消息一次。 MTA將處理其餘的事情。


旁註:爲毗溼奴·普拉薩德·Kallummel在評論中指出您的代碼不會關閉它啓動Excel實例。不像在VBScript中創建的其他對象,Office應用程序不會自動與腳本終止,所以你必須自己處理:

... 
wb.Close 
app.Quit 
+1

循環必須以LastRow + 1結束,並且excel應用程序(進程)不在/正在關閉。 –

+0

當使用範圍從第一行開始時(例如,標題),循環很好。關於應用程序實例的好處。添加了一條記錄WRT。 –