web-dev-qa-db-ja.com

MS Accessは電子メールを送信します(Outlookまたはユーザーの電子メールからではありません)

この質問がさまざまな状況で何度か尋ねられたことは知っていますが、明確な答えは見つかりませんでした。 Outlookを使用してアクセスアプリケーション用に電子メールを実装しましたが、これから離れたいのですが。電子メールの目的の1つは、ユーザーがパスワードを忘れた場合にパスワードを電子メールで送信することです。ユーザーはログイン画面でユーザー名を選択でき、「パスワードを忘れた」をクリックすると、ログイン情報を含むメールが(ユーザー名に関連付けられたメールアドレスに)送信されます。

これの問題は、メール機能がそのままユーザーのマシンからOutlookでメールを送信することです。したがって、ユーザーは他のユーザー名を「パスワードを忘れた」場合があり、自分のOutlook送信トレイ(送信済みアイテム)を表示して機密情報を確認できます。

PHPのメール機能のように、サーバーからメールを送信する方法はありますか?セキュリティプロンプトの後にユーザーのOutlookアドレスからではなく、同じメールアドレス(つまり、support @ company.com)からメールを送信したいのですが。これが不可能な場合は、他の回避策のアイデアを受け入れます。

また、すべての潜在的なユーザーのマシンにインストールする必要があるソフトウェアをインストールすることは現実的ではないことも付け加えます。

これは可能ですか?

9
Scotch

Windowsには、Collaborative Data Objects(CDO)と呼ばれるオブジェクトが含まれています。このオブジェクトを使用すると、他の前提条件(ファイアウォールが開いている、ISPがポートをブロックしていない、SMTPサーバーでアカウントが構成されている、SMTPサーバーが中継を許可しているなど)が満たされていると想定して、任意のSMTPサーバーを使用して電子メールを送信できます。

私が見つけたほとんどの例では、遅延バインディングが使用されています。 XPでの私のテストでは、事前バインディングを使用したい場合、正しいライブラリ参照は「Microsoft CDO for Windows 2000 Library」であるように見えました。

電子メールを送信するときは常に、ある種の電子メールサーバーを介して(または電子メールサーバーから)電子メールを送信する必要があることを知っておくことが重要です。これは、そのメールサーバーで認証する必要があることを意味し、通常は、そのメールサーバーに存在する「From」メールアドレスを使用してメールを送信する必要があることも意味します。

レイトバインディングを使用したコードを次に示します。

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 protected]"
    flds.Item(schema & "sendpassword") = "password"
    flds.Item(schema & "smtpusessl") = False
    flds.Update

    With imsg
        .To = "[email protected]"
        .From = "[email protected]"
        .Subject = "Test Send"
        .HTMLBody = "Test"
        '.Sender = "Sender"
        '.Organization = "My Company"
        '.ReplyTo = "[email protected]"
        Set .Configuration = iconf
        .Send
    End With

    Set iconf = Nothing
    Set imsg = Nothing
    Set flds = Nothing
End Sub
12
HK1

これは、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

12
Fionnuala

評判が足りないのでコメントに付けられませんのでご安心ください。

「このメソッドのように見えるので、サーバー上のあらゆるものを偽装できます。addAttachmentメソッドがあることに気づきました。これは、Excelシートなどの相対パスだけで機能しますか?」

私にとってはうまくいきます(Access 2010、Exchange 2010):

.AddAttachment( "ここにURL")

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

2
UpTide

次のMS-Access VBAコードは、smtp.office365.comで機能します。 smtpusessl = trueを指定することはできますが、ポートを指定しないと、エラー5.7.57が発生します。

Sub SMPTTest2()
Set emailObj = CreateObject("CDO.Message")

emailObj.From = "[email protected]"
emailObj.To = "[email protected]"
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") = "[email protected]"
emailConfig.Fields("http://schemas.Microsoft.com/cdo/configuration/sendpassword") = "mypassword"
emailConfig.Fields.Update

emailObj.Send

If Err.Number = 0 Then MsgBox "Done"
End Sub
1
pghcpa

私の会社では、他のソリューションを使用しました。 COMクラス/オブジェクトを含むC#クラスライブラリを作成しました。 COMクラスはAccessアプリケーションに実装できます。これにより、C#のすべての利点(メールなど)を利用しながら、Accessでそれを使用(呼び出す)できます。

唯一の欠点は、アクセスアプリケーションを使用するすべてのコンピューターでクラスライブラリ(DLL)を登録する必要があることです。 Accessアプリケーションの起動時に実行される単純なpower-Shellスクリプトを使用してそれを実行しました。

COMベースのライブラリの良いスタートはここにあります: https://www.codeproject.com/Articles/7859/Building-COM-Objects-in-C

それについてさらに詳しい情報が必要な場合は、いつでもお手伝いさせていただきます。

0
Nicolas