Accessでデータを表示して、その内容をそのままメール送信できたらいいのにな。と思うことはありませんか?
これまで様々なツールを開発してきましたが、Accessデータベースの情報を元にメール送信したいというニーズはかなり多いです。
AccessではVBAで簡単なプログラムを書くだけでメール送信できる方法が2つあります。
ニーズに合う方法で実装してください。
Microsoft Outlookを使って送信する
Access単体での実装ではなく、別ソフトウェア(Microsoft Outlook)を経由してメールを送信する方法です。
Outlookで送信するメリットとデメリット
メリットはプログラミングが簡単であること、Outlookに送信履歴が残ることが上げられます。
デメリットとしては他のメーラーを使っている場合、わざわざOutlookにメール設定をしなければならないという点です。
通常Outlookを使われている場合はメリットしかないということになりますね。
Outlookに複数アカウントが設定されていた場合は、既定のアカウントにて送信されます。既定以外のアカウントを指定する方法はありません。
前提条件(準備)
Outlookでメールが送受信できる状態であること
常時Outlookを使われている場合は問題ありませんが、インストールされているけど使っていない場合などは、メールが送受信できるようにアカウントを設定しておく必要があります。
「ファイル」→「アカウント情報」→「アカウントの追加」で設定します。
Outlookのライブラリの参照設定をONにする
VBAからOutlookを利用できるように、参照設定を追加する必要があります。
VisualBasic画面の上部メニューのツール → 参照設定 の順で選択します。
「Microsft Outlook xx.x Object Library」 (xxはバージョン)にチェックを入れます。

実装方法
以下のプログラムを標準モジュールに追加します。
Option Compare Database
Option Explicit
'------------------------------------------------------------
'   処理内容:アウトルックを起動
'   引数:なし
'   戻り値:なし
'  更新:
'------------------------------------------------------------
'アウトルックを起動
Public Sub MailOpen()
  Dim ret   As Long
  
  'Outlookの起動
  ret = Shell("outlook", vbNormalFocus)
  If ret = 0 Then MsgBox "起動に失敗しました", vbOKOnly + vbCritical, "MailOpen()"
End Sub
'------------------------------------------------------------
'   処理内容:outlookでメール送信
'   引数:strTo(宛先),strTitle(件名),strDetail(本文)
'   戻り値:なし
'  更新:
'------------------------------------------------------------
Public Sub MailSend(strTo, strTitle, strDetail)
    Dim myApp   As Outlook.Application
    Dim myMail  As Outlook.MailItem
    
    'outlookのオブジェクト作成
    Set myApp = CreateObject("Outlook.Application")
    Set myMail = myApp.CreateItem(ItemType:=olMailItem)
    '引数の宛先・件名・本文セット
    With myMail
        .To = strTo
        .subject = strTitle
        .Body = strDetail
        '重要度設定をノーマルにする
        .Importance = olImportanceNormal
    End With
        
    'エラー時続行
    On Error Resume Next
    myMail.send
    On Error GoTo 0
    'オブジェクトクリア
    Set myMail = Nothing
    Set myApp = Nothing
End Sub作成したフォームの「メール送信ボタン」のクリックイベントにて先のプロシージャを順番に起動するだけです。

‘メールを送信する
Private Sub cmb送信_Click()
Call MailOpen
Call MailSend(Me.txt宛先, Me.txt件名, Me.txt本文) ’フォーム上の値を引数渡し
End Sub今回はメールを送信するモジュールを標準モジュールに、呼び出し側は宛先・件名・本文を引数渡しする方法となっていますが、このあたりの作り方は臨機応変にお願いします。
CDOを使って送信する
CDOを使って送信するメリットとデメリット
CDOを使って送信するメリットは、ACCESS内で処理が完結する点です。他のソフトを使わないので利用しているメーラーに依存しません。
デメリットはプログラムが少々分かりづらい点と、送信履歴が残らない点です。
送信履歴については、CCやBCCで自身にもメールを送れば特に問題にはなりませんが・・・。
CDOとはMicrosoft Collaboration Data Objectsの略称で、Microsoftが提供するメッセージング アプリケーションやコラボレーション アプリケーションを構築するためのテクノロジーです
準備
CDOのライブラリの参照設定をONにする

実装方法
以下のコードをメール送信フォームのモジュールに追加します。
※標準モジュールにする方がすっきりしますが、今回は簡易的に1つのフォームで完了するようにしています。
'------------------------------------------------------------
'   処理内容:CDOメール送信
'   引数:なし
'   戻り値:True/False
'------------------------------------------------------------
Public Function cdoSendMail() As Boolean
    Dim objCDO
    Dim MSgw
    
    On Error GoTo Err_Exit
    
    '戻り値の初期化
    cdoSendMail = False
      
    Set objCDO = CreateObject("CDO.Message")
    
    'CDOのスキーマを定義
    MSgw = "http://schemas.microsoft.com/cdo/configuration/"
    
    With objCDO.Configuration.Fields
        'メール送信方法
        .Item(MSgw & "sendusing") = 2
        'SMTPサーバーのアドレス
        .Item(MSgw & "smtpserver") = "xxxx.xxxxx.jp"
        'SMTPサーバーのポート
        .Item(MSgw & "smtpserverport") = 465
        '差出人ユーザー名
        .Item(MSgw & "sendusername") = "xxx@xxx.com"
        '認証コード
        .Item(MSgw & "sendpassword") = "xxxxx"
        'SSL認証要
        .Item(MSgw & "smtpusessl") = True
        '認証方式(1)
        .Item(MSgw & "smtpauthenticate") = cdoBasic
        'タイムアウト
        .Item(MSgw & "smtpconnectiontimeout") = 60
        .Update
    End With
     
    '差出人メールアドレス
    objCDO.From = Me.txt差出人
    
    'あて先メールアドレス
    objCDO.To = Me.txt宛先
    
    'CCメールアドレス
    objCDO.CC = Me.txtCC
    
    '件名
    objCDO.subject = Me.txt件名
    '本文
    objCDO.textBody = Me.txt本文
    
    '文字化け対応のため追加
    objCDO.TextBodyPart.Charset = "ISO-2022-JP"
     
    objCDO.send
    
    MsgBox "メールを送信しました。", vbOKOnly + vbInformation, "送信完了"
    
    '正常終了
    cdoSendMail = True
    
    Exit Function
    
Err_Exit:
    MsgBox Err.Number & ":" & Err.Description, vbOKOnly + vbCritical, "cdoSendMail()"
       
End Function作成したフォームの「メール送信ボタン」のクリックイベントにて先のプロシージャを起動します。画面で指定された差出人・宛先・CC宛先・件名・本文を参照してメール送信されます。

ファイルを添付することも可能です。
その際は、以下の記述を追加します。
objCDO.AddAttachment 添付ファイル名
AddAttachmentはCDOオブジェクトのプロパティではなくファイルを添付するというメソッドですので、【=】で代入ではなく、AddAttachmentの引数渡し【スペース】である点に注意してください。
SMTPのポートやSSL認証などは利用されるメールサーバーに依存します。
一部の宛先に文字化けが発生したためTextBodyPart.Charsetを設定しています。
こちらはメールを送信するモジュールをメール送信フォームに直接記述する方法をとっていますが、このあたりの作り方も臨機応変にお願いします。
宛先アドレス・差出人アドレスに表示名を設定するには?
上記のサンプルでobjCDO.To, objCDO.Fromへのアドレス代入の際、以下のように表示名を足した文字列を代入することで、表示名をコントロールすることが可能です。
objCDO.To = “表示名 <touseraddress@xxx.yy.zz>”
objCDO.From = ” 表示名 <username@xxx.yy.zz>”
具体的には、以下のように表示名の変数と宛先の変数、”<>”記号を&を使って結合しましょう!
objCDO.To = 表示名変数 & “<” & 宛先アドレス変数 & “>”
まとめ
今日はAccessからoutlookを使ってメールを送る方法と、CDOを使ってメールを送る方法をご紹介しました。
どちらも簡単にメールを送ることができて便利ではありますが、メール到達率や送信結果の取得などに課題があるため、現在はスパイラルのAPIを使ってメールを送ることが多くなりました。
詳しくはこちらをご確認ください。

💡 Accessでここまでやるのは大変…
そう感じたら、次の選択肢を知るチャンスです。
👉 Accessの限界を超える方法はこちら

		
		
			
			
			
			
			
			
			
			
コメント