我知道这个问题已在各种背景下被问过几次,但我没有找到明确的答案。我使用outlook为访问应用程序实现了电子邮件,但我想摆脱这一点。电子邮件的目的之一是在忘记密码时向用户发送他/她的密码。他们可以为登录屏幕选择用户名,如果他们点击“忘记密码”,则会发送包含登录信息的电子邮件(发送到与用户名相关联的电子邮件地址)。
问题在于,电子邮件功能就是从用户的计算机发送带有Outlook的电子邮件。因此,用户可以“忘记密码”其他用户名并查看自己的Outlook发件箱(已发送的项目)以查看敏感信息。
有没有办法像php的邮件功能一样发送电子邮件,从服务器发送邮件?我希望电子邮件从同一个电子邮件地址发送,即(support@company.com),而不是在安全提示后从用户的Outlook地址发送。如果无法做到这一点,我愿意接受任何其他解决方法的想法。
我还要补充说,安装任何必须安装在每个潜在用户机器上的软件都是不可行的。
这可能吗?
答案 0 :(得分:12)
这适用于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
答案 1 :(得分:12)
Windows包含一个名为Collaborative Data Objects或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
答案 2 :(得分:2)
我无法在评论中添加此内容,因为我没有足够的声誉,所以请不要吝啬我。
“看起来像这种方法可以让你欺骗我的服务器上的任何东西。只是注意到有一个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
答案 3 :(得分:1)
以下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
答案 4 :(得分:0)
在我公司,我使用了其他解决方案。我用COM类/对象创建了一个C#类库。 COM类可以在Access应用程序中实现,这样您就可以使用C#的所有优点(例如Mailing)并仍在Access中使用它(调用它)。
唯一的缺点是您必须在使用访问应用程序的所有计算机上注册类库(DLL)。我用一个简单的power-shell脚本完成了这个,它在Access应用程序的开头执行。
基于COM的库的良好开端是:https://www.codeproject.com/Articles/7859/Building-COM-Objects-in-C
如果您想了解更多相关信息,我们将竭诚为您服务。