【问题标题】:VBScript SMTP Auto EmailVBScript SMTP 自动电子邮件
【发布时间】:2013-07-03 08:52:56
【问题描述】:

我有一个脚本可以自动通过电子邮件发送存储在 Excel 中的地址列表,但它只发送到第一个地址而不循环到其余地址,我似乎无法修复它:

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 = "billing@energia.ie"
    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

任何帮助将不胜感激!

谢谢!

【问题讨论】:

  • 您能否提供 xls 和文本文件的屏幕截图?这样我就可以确定我们正在研究同样的问题。

标签: email vbscript smtp cdo.message


【解决方案1】:
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 将处理其余部分。


旁注:正如 Vishnu Prasad Kallummel 在 cmets 中指出的那样,您的代码不会关闭它启动的 Excel 实例。与在 VBScript 中创建的其他对象不同,Office 应用程序不会自动终止脚本,因此您必须自己处理:

...
wb.Close
app.Quit

【讨论】:

  • 循环必须用 LastRow+1 终止,并且 excel 应用程序(进程)没有被关闭。
  • 循环很好,因为使用的范围从第一行开始(例如标题)。关于应用程序实例的要点。添加了一条注释 WRT。
猜你喜欢
  • 2016-10-23
  • 2011-06-01
  • 2011-07-30
  • 2018-10-28
  • 2019-10-11
  • 2012-03-09
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
相关资源
最近更新 更多