メール送信用EXCELマクロなり

ありがちだけどメールのテンプレートをEXCELに作って
そいつを送信するとか言うCDOのメール送信用マクロ作成しました。

まぁ、決してやってはいけない用途で作ったんですが・・・・。
だいたい1つずつ手でメールを打つのもなぁ。
かといってBccで全員に送るのもなぁ。というので
けど本当は手書きでやるべきですがね。


・EXCELを処理する本体。
' AdressListにある区分、会社名、氏名を引いてきて
' 区分に応じたテンプレートのメールを送信する
' 区分に応じてメール件名、テンプレート、署名が可変となる
'
'
Sub ボタン1_Click()

    Const Replaceword = "●●"                              'メールで埋め込みしたい場合の置換前文字列

    Dim rtn As String
    Dim selectFlg As String                                 '送信テンプレート判定用フラグ
    Dim Category As String                                  '送信属性(本文判定用)
    Dim toMailaddr As String                                '宛先メールアドレス
    Dim toCompany As String                                 '会社
    Dim toName As String                                    '名前
    Dim toHeader As String                                  '宛名
    Dim messagetxt As String                                '本文
    Dim signature As String                                 'メール署名
    Dim messageBody As String                               'メールBody
    
    Dim AddrSheet As Worksheet                              'アドレスリストシート
    Dim TemplateSheet As Worksheet                          'メールテンプレート用シート
    Dim FromAddrSheet As Worksheet                          'FROM用設定シート
    Dim addrloopCnt As Long                                 'メールアドレス行数
    Dim temploopCnt As Long                                 'テンプレート行数
    Dim i As Long                                           'メールアドレスループカウンター
    Dim j As Long                                           'メールテンプレートループカウンター
    Dim k As Long                                           '送信件数用
    
    Dim subject As String                                   '件名
    Dim FromMailAddr As String                              'Fromアドレス
    Dim bccMailAddr As String                               'BCC
        
    'シート定義(ここをもう少し綺麗に書ける方法はないか?)
    '送信先アドレスシート設定
    Set AddrSheet = ThisWorkbook.Worksheets("AdressList")
    addrloopCnt = AddrSheet.Cells(Rows.Count, 1).End(xlUp).Row
    'テンプレートシート設定
    Set TemplateSheet = ThisWorkbook.Worksheets("template")
    temploopCnt = TemplateSheet.Cells(Rows.Count, 1).End(xlUp).Row
    '送信元アドレスシート
    Set FromAddrSheet = ThisWorkbook.Worksheets("FromAddr")
    FromMailAddr = FromAddrSheet.Cells(2, 1).Value          'A列(送信元アドレス)
    bccMailAddr = FromAddrSheet.Cells(2, 2).Value           'B列(BCCアドレス)
    
    '送信対象件数が0件、テンプレートが存在しないなら処理しない
    If addrloopCnt = 1 Or temploopCnt = 1 Then
        MsgBox ("アドレスリストに処理対象がないか、メールテンプレートの登録漏れです。")
        Exit Sub
    End If
    
    'メイン処理
    k = 0
    For i = 2 To addrloopCnt
        
Mailaddr:
            Category = AddrSheet.Cells(i, 1).Value          'A列(区分)
            toCompany = AddrSheet.Cells(i, 2).Value         'B列(会社名)
            toName = AddrSheet.Cells(i, 4).Value            'D列(氏名)
            toMailaddr = AddrSheet.Cells(i, 5).Value        'E列(メールアドレス)
        
        If toMailaddr = "" Then                             '送信先メールが空欄だと処理しない
            i = i + 1
            GoTo Mailaddr
        Else
            'メールテンプレート取得
            j = 2
            For j = 2 To temploopCnt
            
MailTemplate:
                
                If Category = TemplateSheet.Cells(j, 1).Value Then
                    subject = TemplateSheet.Cells(j, 2).Value          'B列(件名)
                    messagetxt = TemplateSheet.Cells(j, 3).Value       'C列(本文)
                    signature = TemplateSheet.Cells(j, 4).Value        'D列(署名)
                    Exit For
                Else
                    j = j + 1
                    GoTo MailTemplate:
                End If
            Next j
            
            '改行コードをLFからCR+LFに置き換えと名前の埋込
            messagetxt = Replace(messagetxt, vbLf, vbCrLf)
            signature = Replace(signature, vbLf, vbCrLf)
            messagetxt = Replace(messagetxt, Replaceword, toName)
            
            '社名があれば社名と氏名、氏名のみの場合は氏名のみに
            If toCompany <> "" Or IsEmpty(toCompany) Then
                toHeader = toCompany & vbCrLf & toName & vbCrLf
            Else
                toHeader = toName & vbCrLf
            End If
            'メール本文組立
            messageBody = toHeader & vbCrLf & messagetxt & vbCrLf & signature
            'メール送信
            rtn = SendMail(toMailaddr, FromMailAddr, bccMailAddr, subject, messageBody)
            'エラー制御
            If rtn = "True" Then
               k = k + 1
            Else
               MsgBox (i & "行目の処理でエラーが発生しました。詳細メッセージは以下を確認してください。" & vbCrLf & rtn)
            End If
        End If
    
    Next i
    
    MsgBox (k & "件のメール送信が完了しました。")
    
End Sub

・メール処理部分

'  メール送信用マクロ
' 参照:http://excel-ubara.com/excelvba4/EXCEL233.html
'        https://www.ka-net.org/blog/?p=4730
'        http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_800_080.html
'        http://serialty.blog117.fc2.com/blog-entry-10.html
'        http://no-idea.doorblog.jp/archives/44367271.html
'        http://excelfactory.net/excelboard/excelvba/cfs.cgi?logs=.%2Fvbadat%2Fexcelqa.dat&word=%82%ED%82%EA
'
'
Function SendMail(toMailaddr, FromMailAddr, bccMailAddr, subject, toBody) As String

    Const cdoBasic = 1
    Const cdoSendUsingPort = 2
    Const cdoSendPassword = "http://schemas.microsoft.com/cdo/configuration/sendpassword"
    Const cdoSendUserName = "http://schemas.microsoft.com/cdo/configuration/sendusername"
    Const cdoSendUsingMethod = "http://schemas.microsoft.com/cdo/configuration/sendusing"
    Const cdoSMTPConnectionTimeout = "http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout"
    Const cdoSMTPServer = "http://schemas.microsoft.com/cdo/configuration/smtpserver"
    Const cdoSMTPServerPort = "http://schemas.microsoft.com/cdo/configuration/smtpserverport"
    Const cdoSMTPUseSSL = "http://schemas.microsoft.com/cdo/configuration/smtpusessl"
    Const cdoSMTPAuthenticate = "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"
    
    Dim strErr As String
    Dim objCDO As New CDO.Message
    SendMail = "True"
    
    'メール関連定義
    With objCDO
        .MDNRequested = False                       '開封確認
        .MimeFormatted = True                       'MIMEを使って書式設定
        .From = FromMailAddr                        'From
        .To = toMailaddr                            'To
        .BCC = bccMailAddr                          'BCC
        .subject = subject                          '件名
        .TextBody = toBody                          '本文
       
       'メールサーバ設定
       With .Configuration.Fields '設定項目
            .Item(cdoSendUsingMethod).Value = cdoSendUsingPort                  '
            .Item(cdoSendPassword).Value = "mypass"                        'パスワード
            .Item(cdoSendUserName).Value = "myaddr@gmail.com"            'メールアカウント
            .Item(cdoSMTPAuthenticate).Value = cdoBasic
            .Item(cdoSMTPServer).Value = "smtp.gmail.com"                       'SMTPサーバ
            .Item(cdoSMTPServerPort).Value = 465                                'ポート番号
            .Item(cdoSMTPUseSSL).Value = True                                   'SSL使用
            .Item(cdoSMTPConnectionTimeout).Value = 100                         'タイムアウト
            
            .Item(CdoConfiguration.cdoLanguageCode) = CdoCharset.cdoShift_JIS   '文字セット指定
            .Update                                                             '設定を更新
        End With
        
        With .Fields
            .Item("urn:schemas:mailheader:X-Priority") = 1                      '重要度、通常は以下のどちらかで良い
            .Item("urn:schemas:mailheader:X-MsMail-Priority") = "High"
            .Update                                                             '設定を更新
        End With
        On Error Resume Next
        .Send                                                                   '送信
                
        If Err.Number <> 0 Then
          strErr = "エラーが発生しました。" & vbCrLf & _
                   "エラー番号:" & Err.Number & vbCrLf & _
                   "エラー内容:" & Err.Description
          SendMail = strErr
        End If
        On Error GoTo 0
    End With
    
    Set objCDO = Nothing
End Function

注意点
templateシート
区分 件名 本文 署名

FromAddrシート
送信元メールアドレスBCCアドレス(複数の場合は「;」で区切ってください。)

AdressListシート
区分 会社名 部署名 氏名 メールアドレス


上記シートは指定の形式で準備する必要があります。
あと会社のメールサーバでは検証しましたがGmailはポート閉じられてて検証できませんでした。
例のごとく本ソースは無保証なので、使用した結果生じたトラブルに関しては
責任は持てませんのであしからず。

コメント

このブログの人気の投稿

証券外務員1種勉強(計算式暗記用メモ)

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

マクロ経済学(IS-LM分析)