by 雷電 » 2008年10月16日(木) 13:51
			
			
			お久しぶりです。
自作メーラーを作ってるんですが、
リストビューに表示させているアドレス取得
↓
メール送信
でいいんですが、
ためしに自分に送ってみると、
送信先のアドレスがおかしいことに気がつきました。
OutlookExpressでいうあて先部分に
"
undisclosed-recipients:" 
という意味不明な文字が・・・
これってプログラムミスなのかサーバー仕様なのかわかりません。
サーバーのほうはとりあえず調べてみたのですが
特に何の変哲もないサーバーでした・・・
追記:サーバーはビッグローブです
ということで、プログラムミスだと思うんですが、
どこが違うのか・・・
教えてください・・・
ぁ若干メーラーの部分はいってるので
気にしないでください笑
メール送信部分 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Function SendMailThread(szTo As BytePtr) As DWord
    Dim TextBuffer As String    'テキストバッファの格納用
    Dim length As Long          'テキストの長さ
    Dim temporary As String     '送信時のテキスト一時保存用
    Dim buffer[255] As Byte
    Dim i As Long, i2 As Long
    '「送信」「閉じる」ボタンを無効にする
    EnableWindow(GetDlgItem(hSend,CommandButton1),FALSE)
    EnableWindow(GetDlgItem(hSend,CommandButton2),FALSE)
	
    '各エディットボックスの内容を取得する
    Dim szServerName[255] As Byte      'サーバー名
    Dim szFrom[255] As Byte            '送信元アドレス
    Dim szSubject[255] As Byte         '件名
    Dim q As Long
	Dim buf[MAX_PATH-1] As Byte
	Dim buf1 As String
	Dim buf2 As String
	Dim i3 As Long
	GetModuleFileName(0,buf,256)
	i3=lstrlen(buf)-1
    Do
        If buf[i3]=Asc("\") Then
            buf[i3]=0
            Exit Do
        End If
        i3=i3-1
        If i3<0 Then Exit Do
    Loop
	buf1=MakeStr(buf)
	buf2=buf1+"\Option\opt.ini"
	GetPrivateProfileString("User","SMTP",0,szServerName,256,buf2)
	GetPrivateProfileString("User","Address",0,szFrom,256,buf2)
	If szServerName(0)=0 or szFrom(0)=0 Then
		MessageBox(hSend,"設定が不十分です。設定しなおしてください。","警告",MB_OK or MB_ICONWARNING)
		error=1
		EnableWindow(GetDlgItem(hSend,CommandButton1),TRUE)
		EnableWindow(GetDlgItem(hSend,CommandButton2),TRUE)
		ExitFunction
	End If
	GetWindowText(GetDlgItem(hSend,EditBox3),szSubject,256)
	If szSubject(0)=0 Then
		q=MessageBox(hSend,Ex"タイトルを入力してください。\r\n設定しない場合は、\qNoTitle\qで送信されます。\r\nよろしいですか?",_
		"確認",MB_YESNO or MB_ICONQUESTION)
		If  q = IDYES Then
			SetDlgItemText(hSend,EditBox3,"NoTitle")
			GetWindowText(GetDlgItem(hSend,EditBox3),szSubject,256)
		ElseIf q = IDNO Then
			error=1
			EnableWindow(GetDlgItem(hSend,CommandButton1),TRUE)
			EnableWindow(GetDlgItem(hSend,CommandButton2),TRUE)
			ExitFunction
		End If
	End If
    'テキスト データを格納するためのバッファ領域を確保
    Dim hEdit As DWord
    hEdit=GetDlgItem(hMainWnd,EditBox1)
    length=GetWindowTextLength(hEdit)
    TextBuffer=ZeroString(length+1)
    temporary=ZeroString(length+3)
    'テキスト バッファを取得
    GetWindowText(hEdit, TextBuffer, length+1)
    'WinSock Ver1.1の初期化
    Dim wsaData As WSADATA          'ソケットの初期化情報
    WSAStartup(MAKEWORD(1,1),wsaData)
    'サーバーを探す
    Dim lpHost As *HOSTENT          'ホスト情報
    lpHost=gethostbyname(szServerName)
    If lpHost=0 Then
        wsprintf(buffer,"%sが見つかりません",szServerName)
        AddEditBoxText(hSend,EditBox4,Ex"\r\n")
		AddEditBoxText(hSend,EditBox4,buffer)
		MessageBox(hSend,buffer,"警告",MB_OK)
		error=1
        '「送信」「閉じる」ボタンを有効にする
        EnableWindow(GetDlgItem(hSend,CommandButton1),TRUE)
        EnableWindow(GetDlgItem(hSend,CommandButton2),TRUE)
        Exit Function
    End If
    'ソケットをオープン
    Dim s As DWord                  'ソケット
    s=socket(AF_INET, SOCK_STREAM, 0)
    If s=0 Then
		AddEditBoxText(hSend,EditBox4,Ex"\r\n")
		AddEditBoxText(hSend,EditBox4,"ソケットのオープンに失敗")
        MessageBox(hSend,"ソケットのオープンに失敗","警告",MB_OK or MB_ICONWARNING)
		error=1
        '「送信」「閉じる」ボタンを有効にする
        EnableWindow(GetDlgItem(hSend,CommandButton1),TRUE)
        EnableWindow(GetDlgItem(hSend,CommandButton2),TRUE)
        Exit Function
    End If
    'メール用のポート番号を取得
    Dim lpServ As *SERVENT          'サービス情報
    Dim sockaddress As SOCKADDR_IN  'アドレス情報
    lpServ = getservbyname("mail", NULL)
    If lpServ=0 Then
        'デフォルトのポート番号を使用
        sockaddress.sin_port=htons(IPPORT_SMTP)
    Else
        sockaddress.sin_port=lpServ->s_port
    End If
    sockaddress.sin_family=AF_INET
    sockaddress.sin_addr=GetDWord(GetDWord(lpHost->h_addr_list))
    'サーバーに接続
    If connect(s,sockaddress,Len(sockaddress)) Then
		AddEditBoxText(hSend,EditBox4,Ex"\r\n")
		AddEditBoxText(hSend,EditBox4,"サーバーへの接続に失敗")
        MessageBox(hSend,"サーバーへの接続に失敗","警告",MB_OK or MB_ICONWARNING)
		error=1
	    '「送信」「閉じる」ボタンを有効にする
        EnableWindow(GetDlgItem(hSend,CommandButton1),TRUE)
        EnableWindow(GetDlgItem(hSend,CommandButton2),TRUE)
        Exit Function
    End If
    FillMemory(buffer,256,0)
    recv(s, buffer, 256, 0)
    wsprintf(buffer,Ex"HELO %s\r\n",szServerName)        'HELOコマンドを送信
    send(s, buffer, lstrlen(buffer), 0)
    FillMemory(buffer,256,0)
    recv(s, buffer, 256, 0)
	AddEditBoxText(hSend,EditBox4,Ex"\r\n")
	AddEditBoxText(hSend,EditBox4,buffer)
    wsprintf(buffer, Ex"MAIL FROM : <%s>\r\n", szFrom)   'MAIL FROMコマンドを送信
    send(s, buffer, lstrlen(buffer), 0)
    FillMemory(buffer,256,0)
    recv(s, buffer, 256, 0)
	AddEditBoxText(hSend,EditBox4,Ex"\r\n")
	AddEditBoxText(hSend,EditBox4,buffer)
    wsprintf(buffer, Ex"RCPT TO :<%s>\r\n", szTo)        'RCPT TOコマンドを送信
    send(s, buffer, lstrlen(buffer), 0)
    FillMemory(buffer,256,0)
    recv(s, buffer, 256, 0)
	AddEditBoxText(hSend,EditBox4,Ex"\r\n")
	AddEditBoxText(hSend,EditBox4,buffer)
    lstrcpy(buffer, Ex"DATA\r\n")                        'DATAコマンドを送信
    send(s, buffer, lstrlen(buffer), 0)
    FillMemory(buffer,256,0)
    recv(s, buffer, 256, 0)
	AddEditBoxText(hSend,EditBox4,Ex"\r\n")
	AddEditBoxText(hSend,EditBox4,buffer)
    lstrcpy(buffer, Ex"X-Mailer: Test_Mailer\r\n")       'ヘッダ部分を送信
    send(s, buffer, lstrlen(buffer), 0)
    wsprintf(buffer, Ex"Subject: %s \r\n", szSubject)    '件名を送信
    send(s, buffer, lstrlen(buffer), 0)
    lstrcpy(buffer, Ex"\r\n")
    send(s, buffer, lstrlen(buffer), 0)
    'メール本文を送信
    i=0
    i2=0
    Do
        If (TextBuffer=13 and TextBuffer[i+1]=10) or TextBuffer=0 Then
            '改行
            temporary[i2]=0
            lstrcat(temporary,Ex"\r\n")
            '送信
            send(s, temporary, lstrlen(temporary), 0)
            If TextBuffer=0 Then Exit Do
            i=i+2
            i2=0
            Continue
        End If
        temporary[i2]=TextBuffer
        i=i+1
        i2=i2+1
    Loop
    lstrcpy(buffer, Ex".\r\n")
    send(s, buffer, lstrlen(buffer), 0)
    FillMemory(buffer,256,0)
    recv(s, buffer, 256, 0)
    lstrcpy(buffer, Ex"QUIT\r\n")                        'QUITコマンドを送信
    send(s, buffer, lstrlen(buffer), 0)
    FillMemory(buffer,256,0)
    recv(s, buffer, 256, 0)
    'ソケットへの接続を閉じる
    shutdown(s,SD_BOTH)
    closesocket(s)
    'WinSockが使用したメモリを解放
    WSACleanup()
	AddEditBoxText(hSend,EditBox4,Ex"\r\n")
	AddEditBoxText(hSend,EditBox4,"送信完了!")
    '「送信」「閉じる」ボタンを有効にする
    EnableWindow(GetDlgItem(hSend,CommandButton1),TRUE)
    EnableWindow(GetDlgItem(hSend,CommandButton2),TRUE)
End Function
 ボタンを押したときの操作 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Sub Send_CommandButton1_Click()
	Dim d[255] As Byte
	Dim len As Long
	Dim i As Long
	Dim ad As String
	Dim adB As BytePtr
	Dim buffer[255] As Byte
	error=0
	fk=1
debug
	For i=0 To aNum-1
		If error=1 Then
			Exit For
		End If
		ad=GetListItem(GetDlgItem(hSend,ListView1),i,1)
		adB=StrPtr(ad)
		SendMailThread(adB)
		If error=1 Then
			wsprintf(buffer,"メールの%i通めに送信失敗しました。",fk)
			Exit For
		End If
		wsprintf(buffer,"%i通めのメールを送信しました。",fk)
		fk=fk+1
	Next i
End Sub
 お久しぶりです。
自作メーラーを作ってるんですが、
リストビューに表示させているアドレス取得
↓
メール送信
でいいんですが、
ためしに自分に送ってみると、
送信先のアドレスがおかしいことに気がつきました。
OutlookExpressでいうあて先部分に
"[b]undisclosed-recipients:[/b]" 
という意味不明な文字が・・・
これってプログラムミスなのかサーバー仕様なのかわかりません。
サーバーのほうはとりあえず調べてみたのですが
特に何の変哲もないサーバーでした・・・
[b]追記[/b]:サーバーはビッグローブです
ということで、プログラムミスだと思うんですが、
どこが違うのか・・・
教えてください・・・
ぁ若干メーラーの部分はいってるので
気にしないでください笑
[hide=メール送信部分][code]Function SendMailThread(szTo As BytePtr) As DWord
    Dim TextBuffer As String    'テキストバッファの格納用
    Dim length As Long          'テキストの長さ
    Dim temporary As String     '送信時のテキスト一時保存用
    Dim buffer[255] As Byte
    Dim i As Long, i2 As Long
    '「送信」「閉じる」ボタンを無効にする
    EnableWindow(GetDlgItem(hSend,CommandButton1),FALSE)
    EnableWindow(GetDlgItem(hSend,CommandButton2),FALSE)
	
    '各エディットボックスの内容を取得する
    Dim szServerName[255] As Byte      'サーバー名
    Dim szFrom[255] As Byte            '送信元アドレス
    Dim szSubject[255] As Byte         '件名
    Dim q As Long
	Dim buf[MAX_PATH-1] As Byte
	Dim buf1 As String
	Dim buf2 As String
	Dim i3 As Long
	GetModuleFileName(0,buf,256)
	i3=lstrlen(buf)-1
    Do
        If buf[i3]=Asc("\") Then
            buf[i3]=0
            Exit Do
        End If
        i3=i3-1
        If i3<0 Then Exit Do
    Loop
	buf1=MakeStr(buf)
	buf2=buf1+"\Option\opt.ini"
	GetPrivateProfileString("User","SMTP",0,szServerName,256,buf2)
	GetPrivateProfileString("User","Address",0,szFrom,256,buf2)
	If szServerName(0)=0 or szFrom(0)=0 Then
		MessageBox(hSend,"設定が不十分です。設定しなおしてください。","警告",MB_OK or MB_ICONWARNING)
		error=1
		EnableWindow(GetDlgItem(hSend,CommandButton1),TRUE)
		EnableWindow(GetDlgItem(hSend,CommandButton2),TRUE)
		ExitFunction
	End If
	GetWindowText(GetDlgItem(hSend,EditBox3),szSubject,256)
	If szSubject(0)=0 Then
		q=MessageBox(hSend,Ex"タイトルを入力してください。\r\n設定しない場合は、\qNoTitle\qで送信されます。\r\nよろしいですか?",_
		"確認",MB_YESNO or MB_ICONQUESTION)
		If  q = IDYES Then
			SetDlgItemText(hSend,EditBox3,"NoTitle")
			GetWindowText(GetDlgItem(hSend,EditBox3),szSubject,256)
		ElseIf q = IDNO Then
			error=1
			EnableWindow(GetDlgItem(hSend,CommandButton1),TRUE)
			EnableWindow(GetDlgItem(hSend,CommandButton2),TRUE)
			ExitFunction
		End If
	End If
    'テキスト データを格納するためのバッファ領域を確保
    Dim hEdit As DWord
    hEdit=GetDlgItem(hMainWnd,EditBox1)
    length=GetWindowTextLength(hEdit)
    TextBuffer=ZeroString(length+1)
    temporary=ZeroString(length+3)
    'テキスト バッファを取得
    GetWindowText(hEdit, TextBuffer, length+1)
    'WinSock Ver1.1の初期化
    Dim wsaData As WSADATA          'ソケットの初期化情報
    WSAStartup(MAKEWORD(1,1),wsaData)
    'サーバーを探す
    Dim lpHost As *HOSTENT          'ホスト情報
    lpHost=gethostbyname(szServerName)
    If lpHost=0 Then
        wsprintf(buffer,"%sが見つかりません",szServerName)
        AddEditBoxText(hSend,EditBox4,Ex"\r\n")
		AddEditBoxText(hSend,EditBox4,buffer)
		MessageBox(hSend,buffer,"警告",MB_OK)
		error=1
        '「送信」「閉じる」ボタンを有効にする
        EnableWindow(GetDlgItem(hSend,CommandButton1),TRUE)
        EnableWindow(GetDlgItem(hSend,CommandButton2),TRUE)
        Exit Function
    End If
    'ソケットをオープン
    Dim s As DWord                  'ソケット
    s=socket(AF_INET, SOCK_STREAM, 0)
    If s=0 Then
		AddEditBoxText(hSend,EditBox4,Ex"\r\n")
		AddEditBoxText(hSend,EditBox4,"ソケットのオープンに失敗")
        MessageBox(hSend,"ソケットのオープンに失敗","警告",MB_OK or MB_ICONWARNING)
		error=1
        '「送信」「閉じる」ボタンを有効にする
        EnableWindow(GetDlgItem(hSend,CommandButton1),TRUE)
        EnableWindow(GetDlgItem(hSend,CommandButton2),TRUE)
        Exit Function
    End If
    'メール用のポート番号を取得
    Dim lpServ As *SERVENT          'サービス情報
    Dim sockaddress As SOCKADDR_IN  'アドレス情報
    lpServ = getservbyname("mail", NULL)
    If lpServ=0 Then
        'デフォルトのポート番号を使用
        sockaddress.sin_port=htons(IPPORT_SMTP)
    Else
        sockaddress.sin_port=lpServ->s_port
    End If
    sockaddress.sin_family=AF_INET
    sockaddress.sin_addr=GetDWord(GetDWord(lpHost->h_addr_list))
    'サーバーに接続
    If connect(s,sockaddress,Len(sockaddress)) Then
		AddEditBoxText(hSend,EditBox4,Ex"\r\n")
		AddEditBoxText(hSend,EditBox4,"サーバーへの接続に失敗")
        MessageBox(hSend,"サーバーへの接続に失敗","警告",MB_OK or MB_ICONWARNING)
		error=1
	    '「送信」「閉じる」ボタンを有効にする
        EnableWindow(GetDlgItem(hSend,CommandButton1),TRUE)
        EnableWindow(GetDlgItem(hSend,CommandButton2),TRUE)
        Exit Function
    End If
    FillMemory(buffer,256,0)
    recv(s, buffer, 256, 0)
    wsprintf(buffer,Ex"HELO %s\r\n",szServerName)        'HELOコマンドを送信
    send(s, buffer, lstrlen(buffer), 0)
    FillMemory(buffer,256,0)
    recv(s, buffer, 256, 0)
	AddEditBoxText(hSend,EditBox4,Ex"\r\n")
	AddEditBoxText(hSend,EditBox4,buffer)
    wsprintf(buffer, Ex"MAIL FROM : <%s>\r\n", szFrom)   'MAIL FROMコマンドを送信
    send(s, buffer, lstrlen(buffer), 0)
    FillMemory(buffer,256,0)
    recv(s, buffer, 256, 0)
	AddEditBoxText(hSend,EditBox4,Ex"\r\n")
	AddEditBoxText(hSend,EditBox4,buffer)
    wsprintf(buffer, Ex"RCPT TO :<%s>\r\n", szTo)        'RCPT TOコマンドを送信
    send(s, buffer, lstrlen(buffer), 0)
    FillMemory(buffer,256,0)
    recv(s, buffer, 256, 0)
	AddEditBoxText(hSend,EditBox4,Ex"\r\n")
	AddEditBoxText(hSend,EditBox4,buffer)
    lstrcpy(buffer, Ex"DATA\r\n")                        'DATAコマンドを送信
    send(s, buffer, lstrlen(buffer), 0)
    FillMemory(buffer,256,0)
    recv(s, buffer, 256, 0)
	AddEditBoxText(hSend,EditBox4,Ex"\r\n")
	AddEditBoxText(hSend,EditBox4,buffer)
    lstrcpy(buffer, Ex"X-Mailer: Test_Mailer\r\n")       'ヘッダ部分を送信
    send(s, buffer, lstrlen(buffer), 0)
    wsprintf(buffer, Ex"Subject: %s \r\n", szSubject)    '件名を送信
    send(s, buffer, lstrlen(buffer), 0)
    lstrcpy(buffer, Ex"\r\n")
    send(s, buffer, lstrlen(buffer), 0)
    'メール本文を送信
    i=0
    i2=0
    Do
        If (TextBuffer[i]=13 and TextBuffer[i+1]=10) or TextBuffer[i]=0 Then
            '改行
            temporary[i2]=0
            lstrcat(temporary,Ex"\r\n")
            '送信
            send(s, temporary, lstrlen(temporary), 0)
            If TextBuffer[i]=0 Then Exit Do
            i=i+2
            i2=0
            Continue
        End If
        temporary[i2]=TextBuffer[i]
        i=i+1
        i2=i2+1
    Loop
    lstrcpy(buffer, Ex".\r\n")
    send(s, buffer, lstrlen(buffer), 0)
    FillMemory(buffer,256,0)
    recv(s, buffer, 256, 0)
    lstrcpy(buffer, Ex"QUIT\r\n")                        'QUITコマンドを送信
    send(s, buffer, lstrlen(buffer), 0)
    FillMemory(buffer,256,0)
    recv(s, buffer, 256, 0)
    'ソケットへの接続を閉じる
    shutdown(s,SD_BOTH)
    closesocket(s)
    'WinSockが使用したメモリを解放
    WSACleanup()
	AddEditBoxText(hSend,EditBox4,Ex"\r\n")
	AddEditBoxText(hSend,EditBox4,"送信完了!")
    '「送信」「閉じる」ボタンを有効にする
    EnableWindow(GetDlgItem(hSend,CommandButton1),TRUE)
    EnableWindow(GetDlgItem(hSend,CommandButton2),TRUE)
End Function[/code][/hide][hide=ボタンを押したときの操作][code]Sub Send_CommandButton1_Click()
	Dim d[255] As Byte
	Dim len As Long
	Dim i As Long
	Dim ad As String
	Dim adB As BytePtr
	Dim buffer[255] As Byte
	error=0
	fk=1
debug
	For i=0 To aNum-1
		If error=1 Then
			Exit For
		End If
		ad=GetListItem(GetDlgItem(hSend,ListView1),i,1)
		adB=StrPtr(ad)
		SendMailThread(adB)
		If error=1 Then
			wsprintf(buffer,"メールの%i通めに送信失敗しました。",fk)
			Exit For
		End If
		wsprintf(buffer,"%i通めのメールを送信しました。",fk)
		fk=fk+1
	Next i
End Sub[/code][/hide]