【问题标题】:CDO.Message Email from Office 365 Account in VBAVBA 中来自 Office 365 帐户的 CDO.Message 电子邮件
【发布时间】:2021-05-22 14:25:45
【问题描述】:

我正在尝试使用 VBA 中的 CDO.message 从 Office 355 上的帐户发送电子邮件,以自动执行 Microsoft Access 中的一些电子邮件任务。

代码来自this源。

我明白了

“传输连接服务器失败”

根据我的研究,这似乎是 TLS 身份验证的问题。

Dim objMessage, objConfig, fields
Set objMessage = New CDO.message
Set objConfig = New CDO.Configuration
Set fields = objConfig.fields
With fields
    .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.office365.com"
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 '465
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
    .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "noreply@domain.ca"
    .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "passowrd"
    '.Item("http://schemas.microsoft.com/cdo/configuration/sendtls") = True
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    .Update
End With
Set objMessage.Configuration = objConfig
    
With objMessage
    .subject = "Test Message"
    .From = "noreply@domain.ca"
    .To = "noreply@domain.ca"
    .HTMLBody = "Test Message"
End With
objMessage.Send

编辑:无论用户如何,都需要从同一个电子邮件地址发送电子邮件,因此,我不相信使用 Outlook 会起作用。

编辑 2:我的 ISP 似乎阻止了端口 25 和 465。使用 telnet 我能够从端口 587 获得响应,但是,我得到了与以前相同的错误(除了这次我立即得到它,而不是在很长一段时间后得到它)。可能是由于缺少 TLS 身份验证。

【问题讨论】:

  • smtpserverport 25?大多数 ISP 都会阻止它。
  • @StureS 你对使用什么端口有什么建议吗?我尝试了端口 465(在网上找到了该建议),我得到了同样的错误。
  • 尝试 587 与 TLS
  • @StureS 使用 587 和 TLS 我收到错误“服务器拒绝了发件人地址...发送邮件需要 STARTTLS”
  • 您的登录程序有问题。这是合乎逻辑的。您实际上是在声明您想从一个人发送一封电子邮件,无论实际发件人是谁。这就是垃圾邮件的工作原理,不会被允许。

标签: excel vba email ms-access cdo.message


【解决方案1】:

这是我以前使用过的替代方法:

Private Sub btnSendEmail_Click()
    Dim olObject As Object
    Dim mail As Object
    Dim address As String, subject As String, body As String
    
    Set olObject = New Outlook.Application
    Set mail = olObject.CreateItem(olMailItem)
    
    address = "fakeemail@test.com"
    subject = "THIS IS THE EMAILS SUBJECT LINE"
    body = "THIS GOES INTO EMAILS MESSAGE BODY"
    
    mail.To = address
    mail.subject = subject
    mail.HTMLBody = body
    mail.Send
    
    If MsgBox("Email Sent!", vbExclamation + vbOKOnly, "Submitted") = vbOK Then: Exit Sub
End Sub

以下是所需的参考资料: vba references

我在 MS Access 表单中使用了此功能,用户在该表单中输入进入消息的文本,然后单击“发送电子邮件”按钮通过 Outlook 发送。希望这会有所帮助!

【讨论】:

  • 感谢您的建议!不幸的是,无论哪个用户使用该应用程序,我都需要从同一电子邮件发送电子邮件。使用 Outlook 要求用户已经登录到该帐户。据我所知,CDO.message 是满足我需求的唯一方法。
  • 您实际上是在声明您想从一个人那里发送一封电子邮件,无论实际发件人是谁。这就是垃圾邮件的工作原理,不会被允许。
【解决方案2】:

你的设置是正确的。

您最有可能错过的是创建和使用应用密码

官方文档:

Manage app passwords for two-step verification

作为第一步,打开命令提示符并验证您可以访问服务器:

telnet smtp.office365.com 25

这将立即返回如下内容:

220 HE1PR09CA0075.outlook.office365.com Microsoft ESMTP MAIL Service ready at Fri, 19 Feb 2021 18:48:46 +0000

如果超时,请检查您的防火墙和路由器设置。

【讨论】:

  • 嗯。我不必在此帐户上进行 2FA。你仍然认为应用密码是问题吗?
  • 也许不是,但请尝试初步检查 - 请参阅扩展答案。
  • 它在 25 和 465 时超时。我使用端口 587 得到响应,但是,在 MS-Access 中使用该端口时,我仍然得到“传输无法连接到服务器”。跨度>
  • 那我就没主意了。
  • 更好的选择是设置一个通讯组“noreply”并让公司中的每个人都以 /send 的身份发送代表权限,然后使用 Outlook 引用使用 .SentOnBehalfOfName 发送电子邮件?
猜你喜欢
  • 2022-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多