E-Mail(メッセージ)の作成          <TOP>


E-Mail(メッセージ)の作成の下準備をします。

ShellExecute 拡張子に関連付けられたプログラムを実行

UrlEscape %ASCIIに変換可能な安全ではない文字をエスケープシーケンスに変換

UrlUnescape エスケープシーケンスを普通の文字に変換

 

メーラーの「メッセージの作成」にデータを送ります。改行コードなど、そのまま送ることのできない文字をエスケープシーケンスに変換します。

「エンコード」クリックで変換された文字列の確認を、「デコード」クリックで元に戻ることの確認をしています。

文字数は、どの程度の文字数が送れるかをテストするためのものです。

フォームサイズの変更も可能です。

UrlEscapeは、1行998文字の制限がありました。1行998文字の処理を繰り返し、それらを加えていったらどうなるのかをテストしてみました。

区切る際、最後尾全角文字を分解してしまうようなことには対処していません。

「Mail起動」クリックでOutLookのメール作成を呼び出し、データをセットします。

※電子メールの仕様
1行の文字数は改行を含まないで
78文字以下であるべきで、998文字を超えないこと。
改行は「
復帰(CR)+改行(LF)
」というシーケンスであること。 

 

'================================================================
'= E-Mail(メッセージ)の作成U
'=---------------------------------------------------------------
'= 1行998文字に分割
'= 入力(コピー&ペーストを含む)文字数を監視しながらテストをしています。
'=    (SendMail2.bas)
'================================================================
#include "Windows.bi"

' 拡張子に関連付けられたプログラムを実行
Declare Function Api_ShellExecute& Lib "shell32" Alias "ShellExecuteA" (ByVal hWnd&, ByVal lpOperation$, ByVal lpFile$, ByVal lpParameters$, ByVal lpDirectory$, ByVal nShowCmd&)

#define OUT_OF_MEMORY_OR_RESOURCES 0    'メモリまたはリソースが足りない
#define ERROR_FILE_NOT_FOUND 2          'ファイルが見つからない
#define ERROR_PATH_NOT_FOUND 3          'パスが見つからない
#define ERROR_BAD_FORMAT 11             '不正な形式の実行ファイル

#define SE_ERR_ACCESSDENIED 5           'OSが指定したファイルへのアクセスを拒否
#define SE_ERR_ASSOCINCOMPLETE 27       'ファイルに関連づけられた物が不完全かまたは無効
#define SE_ERR_DDEBUSY 30               '他のDDEプロセスが通信中だったので、DDE通信が完了できなかった
#define SE_ERR_DDEFAIL 29               'DDE通信が失敗
#define SE_ERR_DDETIMEOUT 28            'DDE通信でタイムアウトが発生
#define SE_ERR_DLLNOTFOUND 32           '指定したDLLファイルが見つからなかった
#define SE_ERR_FNF 2                    'ファイルが見つからなかった
#define SE_ERR_NOASSOC 31               '指定したファイルに関連づけられたアプリケーションが見つからなかった
#define SE_ERR_OOM 8                    '処理を完了するのに十分なメモリがなかった
#define SE_ERR_PNF 3                    '指定したパスが見つからなかった
#define SE_ERR_SHARE 26                 '共有違反が発生

#define SW_SHOWNORMAL 1                 'SW_RESTOREと同じ
#define c_CRLF "%0D%0A"
#define vbCrLf Chr$(13, 10)

' %ASCIIに変換可能な安全ではない文字をエスケープシーケンスに変換
Declare Function Api_UrlEscape& Lib "shlwapi" Alias "UrlEscapeA" (ByVal pszURL$, ByVal pszEscaped$, pcchEscaped&, ByVal dwFlags&)

' エスケープシーケンスを普通の文字に変換
Declare Function Api_UrlUnescape& Lib "shlwapi" Alias "UrlUnescapeA" (ByVal pszURL$, ByVal pszUnescaped$, pcchUnescaped&, ByVal dwFlags&)

#define MAX_PATH 5000                        '
#define ERROR_SUCCESS 0
#define URL_ESCAPE_SEGMENT_ONLY &H2000       'Indicates that pszURL contains only that section of the URL 
#define URL_ESCAPE_PERCENT &H1000            'Convert any % character found in the segment section of the URL 
#define URL_UNESCAPE_INPLACE &H100000        '
#define URL_INTERNAL_PATH &H800000
#define URL_DONT_ESCAPE_EXTRA_INFO &H2000000 'Used only in conjunction with URL_ESCAPE_SPACES_ONLY to prevent the conversion of characters in the query.
#define URL_ESCAPE_SPACES_ONLY &H4000000     'Convert only space characters to their escape sequences, including those space characters in the query portion of the URL.
#define URL_DONT_SIMPLIFY &H8000000

Var Shared Text(3) As Object
Var Shared Edit(2) As Object
Var Shared Button(2) As Object

For i = 0 To 3
    Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i + 1))) : Text(i).SetFontSize 14
    If i < 3 Then
        Edit(i).Attach GetDlgItem("Edit" & Trim$(Str$(i + 1))) : Edit(i).SetFontSize 14
        Button(i).Attach GetDlgItem("Button" & Trim$(Str$(i + 1))) : Button(i).SetFontSize 14
    End If
Next

Var Shared EMail As String

'================================================================
'=
'================================================================
Declare Sub Length_DSP edecl ()
Sub Length_DSP()
    Var Temp As String

    Temp = Edit(2).GetWindowText
    Text(3).SetWindowText "文字数:" & Str$(Len(Temp))
End Sub

'================================================================
'=
'================================================================
Declare Function Encode(sUrl As String) As String
Function Encode(sUrl As String) As String
    Var buff As String
    Var dwSize As Long
    Var dwFlags As Long

    If Len(sUrl) > 0 Then
        buff = Space$(MAX_PATH)
        dwSize = Len(buff)
        dwFlags = URL_DONT_SIMPLIFY

        If Api_UrlEscape(sUrl, buff, dwSize, dwFlags) = ERROR_SUCCESS Then
            Encode = Left$(buff, dwSize)
            Button(2).EnableWindow -1
        Else
            A% = MessageBox("", "制限文字数を越えています!", 0, 2)
        End If
    End If
End Function

'================================================================
'=
'================================================================
Declare Function Decode(sUrl As String) As String
Function Decode(sUrl As String) As String
    Var buff As String
    Var dwSize As Long
    Var dwFlags As Long

    If Len(sUrl) > 0 Then
        buff = Space$(MAX_PATH)
        dwSize = Len(buff)
        dwFlags = URL_DONT_SIMPLIFY

        If Api_UrlUnescape(sUrl, buff, dwSize, dwFlags) = ERROR_SUCCESS Then
            Decode = Left$(buff, dwSize)
            Button(2).EnableWindow 0
        Else
            A% = MessageBox("", "制限文字数を越えています!", 0, 2)
        End If
    End If
End Function

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Button(2).EnableWindow 0
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var Temp As String
    Var Body As String
    Var i As Integer
    Var OneLine As Integer

    EMail = ""
    Body = ""
    OneLine = 998

    'E-Mail アドレス
    Temp = Trim$(Edit(0).GetWindowText)
    If Len(Temp) = 0 Then
        A% = MessageBox("Attention!", "E-Mail アドレスを入力してください!", 0, 2)
        Edit(0).SetFocus
        Exit Sub
    Else
        EMail = EMail & "mailto:" & Temp
    End If

    '件名
    Temp = Trim$(Edit(1).GetWindowText)
    If Len(Temp) <> 0 Then
        EMail = EMail & "?Subject=" & Temp
    End If

    '本文
    Temp = rTrim$(Edit(2).GetWindowText)
    If Len(Temp) <> 0 Then
        For i = 1 To (Len(Temp) \ OneLine) + 1
            Body = Body & Encode(Mid$(Temp, (i - 1) * OneLine + 1, OneLine))
            Edit(2).SetWindowText Body
        Next

        EMail = EMail & "&body=" & Body
    End If

    Length_DSP
End Sub

'================================================================
'=
'================================================================
Declare Sub Button2_on edecl ()
Sub Button2_on()
    Var Temp As String

    Temp = rTrim$(Edit(2).GetWindowText)

    If Len(Temp) <> 0 Then
        Temp = Decode(Temp)
        Edit(2).SetWindowText Temp
    End If
    Length_DSP
End Sub

'================================================================
'=
'================================================================
Declare Sub Button3_on edecl ()
Sub Button3_on()
    Var Ret As Long

    Ret = Api_ShellExecute(GethWnd, "Open", EMail, ByVal 0, ByVal 0, SW_SHOWNORMAL)

    If Ret <= 32 Then
        Select Case Ret
            Case OUT_OF_MEMORY_OR_RESOURCES
                A% = MessageBox("", "メモリまたはリソースが足りません。", 0, 2)
            Case ERROR_FILE_NOT_FOUND
                A% = MessageBox("", "ファイルが見つかりません。", 0, 2)
            Case ERROR_PATH_NOT_FOUND
                A% = MessageBox("", "パスが見つかりません。", 0, 2)
            Case ERROR_BAD_FORMAT
                A% = MessageBox("", "不正な形式の実行ファイルです。", 0, 2)
            Case SE_ERR_ACCESSDENIED
                A% = MessageBox("", "アクセスは拒否されました。", 0, 2)
            Case SE_ERR_ASSOCINCOMPLETE
                A% = MessageBox("", "関連付けが不完全です。", 0, 2)
            Case SE_ERR_NOASSOC
                A% = MessageBox("", "関連付けが指定されていません。", 0, 2)
            Case Else
                A% = MessageBox("", "ファイルを開けません。", 0, 2)
        End Select
    End If
End Sub

'================================================================
'=
'================================================================
Declare Sub Edit3_Change edecl ()
Sub Edit3_Change()
    Length_DSP
End Sub

'================================================================
'=
'================================================================
Declare Sub MainForm_Resize edecl ()
Sub MainForm_Resize()
    If GetWidth < 600 Or GetHeight < 350 Then
        SetWindowSize 600, 350
    End If

    Edit(2).SetWindowSize GetWidth - 74, GetHeight - 138
    Text(3).MoveWindow 14, GetHeight - 68
    Button(0).MoveWindow GetWidth - 244, GetHeight - 66
    Button(1).MoveWindow GetWidth - 166, GetHeight - 66
    Button(2).MoveWindow GetWidth - 90, GetHeight - 66
End Sub


'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End