メールを送信する-上級者のためのExcel エクセルマクロVBA
え?エクセルからメールも送れるの?
今回は上級者用です。少なくともメールが送られるざっくりとした仕組みくらいは理解している前提でブログを進めます。っていうかここでSMTPとかPOP3とかメールヘッダがどうだのメールサーバがどうだのいうと、エクセルとは全く違ったお話になりますので、今回はこのあたりの仕組みもちゃんと理解しているという前提。初心者置き去りですが、そんな回もまぁ、あるさね。
メールを送るためのVBA側の処理
今回はメーラーが立ち上がってメールが送れるではなく、エクセルそのものがメールを送ります。エクセルでメールを送るにはいくつか方法があるのですが、今回はCDOを使ってメールを送る方法を紹介します。実はもう1つBASP21というDLLがありそれを使ってもメール送信は可能ですが、それはまたの機会に。
CDO(Microsoft Collaboration Data Objects)
参考となるMicrosoftのページです。
http://msdn.microsoft.com/ja-jp/library/cc420644.aspx
http://msdn.microsoft.com/ja-jp/library/ms978698.aspx
このページのCDOの概要にはこうあります。
CDOの概要
Collaboration Data Objectsは、Microsoft Windows(r)製品群に組み込まれている電子メール システムに簡単にアクセスできるようにする上位レベルのCOMオブジェクトのセットです。
まぁ、要するにメール送信するためのメソッドやプロパティを持ったオブジェクトのセットですよ。ってことです。このオブジェクトのセットっというのは、いくつかのオブジェクトをまとめたもの。という意味です。どんなオブジェクトが入っているかというと。。
- Session
- MessageCollection
- Message
- InboxFolder
- OutBoxFolder
などがあるようです。
CDOオブジェクトセットのインストール
は、特に説明しません。なぜなら、大体最初から入っているからです。よっぽどのことがない限り手動でインストールすることはないと思ってください。
CDOの使い方
では、いよいよ使い方です。使い方は2通りあります。参照設定を行う方法とオブジェクトを直接バインディングする方法です。今回はオブジェクトをバインディングする方法を紹介します。
上級編なのでいきなりコード。
Public Type MailSendingConfig SMTPServer As String SMTPPort As Integer End Type Public Type MailSendInfo From As String ToCSV As String subject As String text As String End Type Public Function SendMail(ByRef shcemaInfo As MailSchemaInfo, _ ByRef sendInfo As MailSendInfo) Dim objMail As Object Set objMaii = CreateObject("CDO.Message") Dim cdoConfigPrefix As String cdoConfigPrefix = "http://schemas.microsoft.com/cdo/configuration/" // メール送信設定を行う。 With objMail .From = sendInfo.From .To = sendInfo.ToCSV .Cc = "" .Bcc = "" .subject = sendInfo.subject .TextBody = Replace(sendInfo.text, vbLf, vbCrLf) .TextBody = Replace(.TextBody, vbCr, vbCrLf) .TextBodyPart.Charset = "ISO-2022-JP" .Configuration.Fields.Item(cdoConfigPrefix & "sendusing") = 2 .Configuration.Fields.Item(cdoConfigPrefix & "smtpconnectiontimeout") = 30 .Configuration.Fields.Item(cdoConfigPrefix & "smtpserver") = shcemaInfo.SMTPServer .Configuration.Fields.Item(cdoConfigPrefix & "smtpserverport") = shcemaInfo.SMTPPort End With // 設定をバインド Call objMail.Configuration.Fields.Update // メール送信 Call objMail.Send End Function
これで送信メソッドは完成です。With Mailの中で送信に必要なプロパティを設定しています。後はバインドして、Sendメソッドを実行するだけです。このメソッドを呼ぶ側で、MailSendingConfigとMailSendInfoの変数を宣言し、必要な情報を入れて、SendMailメソッドを実行するだけです。
簡単ですね。エクセル内のセルの内容を送るので、LF改行コードをCRLF改行コードに変換したりもしています。CCやBCCが必要な場合もここに値を入れるだけです。
CDOのMessageオブジェクト
CDOのMessageオブジェクトはメールを送信や受信するためのオブジェクトです。各種プロパティとメソッドについては、マニュアルとか見てもらえればいいですが、smtp系のサーバー名やポート番号、タイムアウトの秒数、sendusingなどは知っておくといいと思います。ちなみにsendusingについては英語ですが、
http://msdn.microsoft.com/en-us/library/ms873037(v=exchg.65).aspx
に説明があり、参照設定をしていると、このページにある定数が使えます。まぁSMTPでポート指定で送るので通常は2です。
今日はここまで!
かしこ