MS Access 发送电子邮件(不是来自 Outlook 或用户的电子邮件)
Posted
技术标签:
【中文标题】MS Access 发送电子邮件(不是来自 Outlook 或用户的电子邮件)【英文标题】:MS Access send email (not from outlook or user's email) 【发布时间】:2012-07-20 12:49:20 【问题描述】:我知道这个问题已经在各种情况下被问过几次,但我还没有找到明确的答案。我已经使用 Outlook 为访问应用程序实现了电子邮件,但我想摆脱这种情况。电子邮件的目的之一是在用户忘记密码时将其/或密码通过电子邮件发送给用户。他们可以选择登录屏幕的用户名,如果他们单击“忘记密码”,则会发送包含其登录信息的电子邮件(发送到与用户名关联的电子邮件地址)。
这样做的问题是电子邮件功能原样从用户的机器发送一封带有 Outlook 的电子邮件。因此,用户将能够“忘记密码”其他用户名并查看自己的 Outlook 发件箱(已发送项目)以查看敏感信息。
有没有办法像php的邮件功能一样,从服务器发送邮件?我希望从相同的电子邮件地址发送电子邮件,即(support@company.com),而不是在安全提示后从用户的 Outlook 地址发送。如果这是不可能的,我愿意接受任何其他解决方法的想法。
我还要补充一点,安装任何必须安装在每个潜在用户机器上的软件是不可行的。
这可能吗?
【问题讨论】:
Access 真的不能如你所愿。它是一个桌面数据库。 我对变通办法持开放态度:示例变通办法的想法可能是:如果用户的 Outlook 电子邮件(“发件人”)与电子邮件匹配,则仅发送“忘记密码”电子邮件用于数据库中的用户名(to)。 我对访问代码不是很熟悉,但是如果有一些功能可以将邮件发送到 SMTP 服务,那么您应该能够使用任何您想要的 SMTP 服务,而不是用户的本地 Outlook。users would be able to 'forgot password' other usernames and view their own outlook outbox(sent items) to see the sensitive information
听起来像是一个设计问题,您试图通过修复其他问题来解决。
【参考方案1】:
Windows 包含一个称为协作数据对象或 CDO 的对象。此对象允许您使用任何 SMTP 服务器发送电子邮件,前提是满足其他先决条件(防火墙打开、ISP 未阻止端口、在 SMTP 服务器上配置帐户、SMTP 服务器允许中继等)。
我发现的大多数示例都使用后期绑定,这是首选。在我对 XP 的测试中,如果您更喜欢使用早期绑定,正确的库引用似乎是“Microsoft CDO for Windows 2000 Library”。
重要的是要知道,任何时候发送电子邮件都必须通过(或从)某种电子邮件服务器发送。这意味着您必须通过该电子邮件服务器进行身份验证,并且通常还意味着您需要使用该电子邮件服务器上存在的“发件人”电子邮件地址发送电子邮件。
下面是一些使用后期绑定的代码:
Const cdoSendUsingPickup = 1
Const cdoSendUsingPort = 2
Const cdoAnonymous = 0
' Use basic (clear-text) authentication.
Const cdoBasic = 1
' Use NTLM authentication
Const cdoNTLM = 2 'NTLM
Public Sub SendEmail()
Dim imsg As Object
Dim iconf As Object
Dim flds As Object
Dim schema As String
Set imsg = CreateObject("CDO.Message")
Set iconf = CreateObject("CDO.Configuration")
Set flds = iconf.Fields
' send one copy with SMTP server (with autentication)
schema = "http://schemas.microsoft.com/cdo/configuration/"
flds.Item(schema & "sendusing") = cdoSendUsingPort
flds.Item(schema & "smtpserver") = "mail.myserver.com"
flds.Item(schema & "smtpserverport") = 25
flds.Item(schema & "smtpauthenticate") = cdoBasic
flds.Item(schema & "sendusername") = "email@email.com"
flds.Item(schema & "sendpassword") = "password"
flds.Item(schema & "smtpusessl") = False
flds.Update
With imsg
.To = "email@email.com"
.From = "email@email.com"
.Subject = "Test Send"
.htmlBody = "Test"
'.Sender = "Sender"
'.Organization = "My Company"
'.ReplyTo = "address@mycompany.com"
Set .Configuration = iconf
.Send
End With
Set iconf = Nothing
Set imsg = Nothing
Set flds = Nothing
End Sub
【讨论】:
“发件人”电子邮件地址存在于该电子邮件服务器上 - 这在我的语言环境中对我不起作用,根据我的阅读,我知道您必须使用服务器由您的 ISP 提供。这是为了防止垃圾邮件。 这完全取决于您的 ISP。有些只允许使用端口 25 与自己的 SMTP 服务器通信,有些则没有此限制。您的一些大型有线电视提供商会这样做,但您的许多较小的 ISP 没有此限制。例如,Windstream 或 CenturyLink 都没有此限制。您也可以通过使用备用端口(假设您的 SMTP 服务器公开备用端口)来解决此问题,因为大多数 ISP 仅对端口 25 施加此限制。作为一个示例,您可以使用 GMail 作为您的 SMTP 服务器 - GMail使用 587 或 465 和 SSL。 我也在处理一种相同的需求,并意识到上面的代码允许您从任何电子邮件地址(即任何不正确的电子邮件 anyusername@anydomain.com)发送电子邮件,而无需指定正确的密码。只是你应该输入正确的服务器地址(即mail.myserver.com) @braceyourself 您所说的实际上是服务器设置,而不是您发送电子邮件的方式的一些好处。我不确定设置是什么,也许是“匿名中继”。 太棒了!这是有效的,我如何发送使用 CDO 附加的 ms 访问报告?【参考方案2】:这适用于我在 MS Access 2010 / Windows 7 中
sMailServer = "myISPsmtp" 'Not just any old smtp
sMailFromAddress = "me"
sMailToAddress = "me"
Set ObjMessage = CreateObject("CDO.Message")
sToAddress = sMailToAddress
sSubject = "Subject"
sBody = "MailBody"
ObjMessage.Subject = sSubject
ObjMessage.From = sMailFromAddress
ObjMessage.To = sToAddress
'ObjMessage.cc = sCCAddress
ObjMessage.TextBody = sBody
'ObjMessage.AddAttachment sMailAttachment
ObjMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
ObjMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = sMailServer
ObjMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
ObjMessage.Configuration.Fields.Update
ObjMessage.send
更多信息:http://msdn.microsoft.com/en-us/library/ms526318(v=exchg.10).aspx
【讨论】:
那么我只是将 sMailServer 设置为我办公室的电子邮件服务器吗?和 mailFromAddress 成为我创建的虚拟帐户? ('support@company.com') 和 sMailTo 是数据库中用户名的电子邮件地址吗? +1 我太慢了 ^_^ 但这是一个很棒的方法。我将专注于我的一个问题。您不应该在数据库中存储未加密的密码,并且绝对不应该通过电子邮件发送该信息(即使发送给正确的人)。相反,您需要加密您的密码,并为用户提供重置密码的能力,而不仅仅是发送密码。 我不确定哪个邮件服务器适合你,我必须使用我的 ISP 提供的服务器,显然这是阻止垃圾邮件的安全措施。 至于 from,我认为几乎任何事情都可以。 似乎这种方法可以让您欺骗我服务器上的任何内容。刚刚注意到有一个 addAttachment 方法。这是否可以仅使用相对路径,例如 Excel 表格?【参考方案3】:我无法将其添加到 cmets,因为我没有足够的声誉,所以请不要砍我。
“看起来这个方法可以让你欺骗我服务器上的任何东西。刚刚注意到有一个 addAttachment 方法。这可以只使用相对路径,比如 Excel 表吗?”
它适用于我(Access 2010、Exchange 2010):
.AddAttachment ("URL HERE")
https://msdn.microsoft.com/en-us/library/ms526453(v=exchg.10).aspx https://msdn.microsoft.com/en-us/library/ms526983(v=exchg.10).aspx
【讨论】:
【参考方案4】:以下 MS-Access VBA 代码适用于 smtp.office365.com。您确实指示 smtpusessl=true,但您没有指定端口,否则您会收到错误 5.7.57。
Sub SMPTTest2()
Set emailObj = CreateObject("CDO.Message")
emailObj.From = "name@myaddress.com"
emailObj.To = "name@youraddress.com"
emailObj.Subject = "Test CDO"
emailObj.TextBody = "Test CDO"
'emailObj.AddAttachment "c:\windows\win.ini"
Set emailConfig = emailObj.Configuration
emailConfig.Fields("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
emailConfig.Fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
emailConfig.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.office365.com"
'Exclude the following line
'emailConfig.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 587
emailConfig.Fields("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
emailConfig.Fields("http://schemas.microsoft.com/cdo/configuration/sendusername") = "name@myaddress.com"
emailConfig.Fields("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "mypassword"
emailConfig.Fields.Update
emailObj.Send
If Err.Number = 0 Then MsgBox "Done"
End Sub
【讨论】:
【参考方案5】:在我的公司,我使用了另一种解决方案。我创建了一个带有 COM 类/对象的 C# 类库。 COM 类可以在您的 Access 应用程序中实现,这样您就可以使用 C#(例如 Mailing)的所有优点,并且仍然在 Access 中使用它(调用它)。
唯一的缺点是您必须在所有使用您的访问应用程序的计算机上注册您的类库 (DLL)。我已经通过一个在 Access 应用程序启动时执行的简单 power-shell 脚本做到了这一点。
一个基于 COM 的库的良好开端在这里:https://www.codeproject.com/Articles/7859/Building-COM-Objects-in-C
如果您想了解更多有关它的信息,那么我很乐意为您提供帮助。
【讨论】:
以上是关于MS Access 发送电子邮件(不是来自 Outlook 或用户的电子邮件)的主要内容,如果未能解决你的问题,请参考以下文章
MS Access / Outlook 2010 - 如何选择从哪个帐户发送电子邮件?
如何将最近发送的 10 封电子邮件下载到 ms access
如何使用 MS Access 基于变量发送带有附加报告的自定义电子邮件? 2003 年或 2007 年