9

我知道这个问题已经在各种情况下被问过几次,但我还没有找到一个明确的答案。我已经使用 Outlook 为访问应用程序实施了电子邮件,但我想摆脱这种情况。电子邮件的目的之一是在用户忘记密码时将其/或密码通过电子邮件发送给用户。他们可以选择登录屏幕的用户名,如果他们单击“忘记密码”,则会发送包含其登录信息的电子邮件(发送到与用户名关联的电子邮件地址)。

这样做的问题是电子邮件功能按原样从用户的机器发送一封带有 Outlook 的电子邮件。因此,用户将能够“忘记密码”其他用户名并查看自己的 Outlook 发件箱(已发送项目)以查看敏感信息。

有没有办法像php的邮件功能一样,从服务器发送邮件?我希望从同一电子邮件地址(即(support@company.com))发送电子邮件,而不是在安全提示后从用户的 Outlook 地址发送。如果这是不可能的,我对任何其他解决方法的想法持开放态度。

我还要补充一点,安装任何必须安装在每个潜在用户机器上的软件都是不可行的。

这可能吗?

4

5 回答 5

13

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
于 2012-07-20T13:58:22.693 回答
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

于 2012-07-20T13:43:25.023 回答
2

我无法将此添加到评论中,因为我没有足够的声誉,所以请不要砍我。

“似乎这种方法可以让你欺骗我服务器上的任何东西。刚刚注意到有一个 addAttachment 方法。它可以只使用相对路径,比如 Excel 表吗?”

它对我有用(Access 2010、Exchange 2010):

.AddAttachment(“这里的网址”)

https://msdn.microsoft.com/en-us/library/ms526453(v=exchg.10).aspx https://msdn.microsoft.com/en-us/library/ms526983(v=exchg.10) .aspx

于 2015-06-10T18:27:51.747 回答
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
于 2016-02-13T22:27:20.760 回答
0

在我的公司,我使用了另一种解决方案。我创建了一个带有 COM 类/对象的 C# 类库。COM 类可以在您的 Access 应用程序中实现,这样您就可以使用 C#(例如 Mailing)的所有优点,并且仍然在 Access 中使用它(调用它)。

唯一的缺点是您必须在所有使用您的访问应用程序的计算机上注册您的类库 (DLL)。我已经通过一个在 Access 应用程序启动时执行的简单 power-shell 脚本完成了这项工作。

一个基于 COM 的库的良好开端在这里:https ://www.codeproject.com/Articles/7859/Building-COM-Objects-in-C

如果您想了解更多有关它的信息,那么我很乐意为您提供帮助。

于 2018-01-05T09:00:38.167 回答