ab.com コミュニティ https://www.activebasic.com/forum/ |
|
サーバーの仕様?プログラムミス? https://www.activebasic.com/forum/viewtopic.php?t=2487 |
ページ 1 / 1 |
作成者: | 雷電 [ 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 |
作成者: | yama [ 2008年10月17日(金) 11:57 ] |
記事の件名: | RE:サーバーの仕様?プログラムミス? |
コード見ないでのコメントで的外れかもしれません。 メール送信が成功していて ヘッダーが意図したようにならないのであれば encodeあたりが怪しいのでは?ないでしょうか |
作成者: | Tako [ 2008年10月17日(金) 13:35 ] |
記事の件名: | |
わたしもコードを見ないでの返答ですが、下記ではないでしょうか? ttp://support.microsoft.com/kb/182987/ja |
作成者: | 雷電 [ 2008年10月18日(土) 23:30 ] |
記事の件名: | |
早速の返信ありがとうございます。 ページのほう見てみましたが、 察するにあて先に設定されず、 BCCに設定されて送信されていると言うことでしょうか? 無理矢理、Funtionに値を入れていたのがまずかったのでしょうか・・・ 参考になりました。 また組みなおしてみます。 新たな情報の提供を今後もよろしくお願いします。 |
作成者: | 雷電 [ 2008年11月13日(木) 15:46 ] |
記事の件名: | |
いろいろ探してみましたが、結局わかりませんでした。 コード見ていただけないでしょうか? よろしくお願いします。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |