ab.com コミュニティ https://www.activebasic.com/forum/ |
|
メール送信サンプル https://www.activebasic.com/forum/viewtopic.php?t=222 |
ページ 1 / 1 |
作成者: | situmon [ 2005年7月22日(金) 13:07 ] |
記事の件名: | メール送信サンプル |
以前の掲示板に投稿したメールの送信のサンプルです。 POP before SMTP にも対応しています。 メールの質問が意外と多いようなので投稿しました。 以下のソースをそのままコンパイルすれば動作します。 昔のソースなので読みにくくてすみません。 (ActiveBasic最新版で動くように修正しました 2006/4/15 10:22) コード: '関数の定義ここから Const WSADESCRIPTION_LEN = 256 Const WSASYS_STATUS_LEN = 128 Const SOCKET_ERROR = -1 Const INVALID_SOCKET = -1 ' Winsockの実装の詳細を定義する構造体の宣言 Type WSAData wVersion As Integer wHighVersion As Integer szDescription(WSADESCRIPTION_LEN) As Byte szSystemStatus(WSASYS_STATUS_LEN) As Byte iMaxSockets As Integer iMaxUdpDg As Integer lpVendorInfo As Long End Type ' ソケットのアドレスを保存する構造体 Type in_addr S_addr As Long End Type ' ソケットの情報を保存する構造体 Type sockaddr_in sin_family As Integer sin_port As Word sin_addr As in_addr sin_zero(7) As Byte End Type 'ネットワーク上にある既知の、接続するソケットのアドレスを受け取る構造体 Type sockaddr sa_family As Word sa_data[13] As Byte End Type ' ホストの情報を保存する構造体 Type hostent h_name As Long h_aliases As Long h_addrtype As Integer h_length As Integer h_addr_list As Long End Type ' アドレスファミリーを示す定数の宣言 Const AF_UNSPEC = 0 Const AF_UNIX = 1 Const AF_INET = 2 Const AF_IMPLINK = 3 Const AF_PUP = 4 Const AF_CHAOS = 5 Const AF_NS = 6 Const AF_IPX = AF_NS Const AF_ISO = 7 Const AF_OSI = AF_ISO Const AF_ECMA = 8 Const AF_DATAKIT = 9 Const AF_CCITT = 10 Const AF_SNA = 11 Const AF_DECnet = 12 Const AF_DLI = 13 Const AF_LAT = 14 Const AF_HYLINK = 15 Const AF_APPLETALK = 16 Const AF_NETBIOS = 17 Const AF_VOICEVIEW = 18 Const AF_FIREFOX = 19 Const AF_UNKNOWN1 = 20 Const AF_BAN = 21 Const AF_ATM = 22 Const AF_INET6 = 23 Const AF_CLUSTER = 24 Const AF_12844 = 25 Const AF_MAX = 26 ' ソケットの種類を示す定数の宣言 Const SOCK_STREAM = 1 Const SOCK_DGRAM = 2 Const SOCK_RAW = 3 Const SOCK_RDM = 4 Const SOCK_SEQPACKET = 5 ' ローカルのアドレスのどれかを使用することを示す定数の宣言 Const INADDR_ANY = &H0 'ソケット関数 Declare Function accept Lib "wsock32.dll" (ByVal s As Long,ByRef addr As sockaddr_in,ByVal addrlen As Long) As Long Declare Function WSAAccept Lib "ws2_32.dll" (ByVal s As Long,addr As Long,addrlen As Long,ByVal lpfnCondition As Long,ByVal dwCallbackData As Long) As Long Declare Function bind Lib "wsock32.dll" (ByVal s As Long,ByRef sName As sockaddr_in, ByVal namelen As Long) As Long Declare Function closesocket Lib "wsock32.dll" (ByVal s As Long) As Long Declare Function connect Lib "wsock32.dll" (ByVal s As Long,ByRef sName As sockaddr_in, ByVal namelen As Long) As Long Declare Function ioctlsocket Lib "wsock32.dll" (ByVal s As Long, ByVal cmd As Long, argp As Long) As Long Declare Function listen Lib "wsock32.dll" (ByVal s As Long, ByVal backlog As Long) As Long Declare Function recv Lib "wsock32.dll" (ByVal s As Long, ByVal buf As BytePtr, ByVal lngLen As Long, ByVal flags As Long) As Long Declare Function recvfrom Lib "wsock32.dll" (ByVal s As Long, buf As BytePtr, ByVal lngLen As Long, ByVal flags As Long,ByRef from As sockaddr_in, fromlen As Long) As Long Declare Function send Lib "wsock32.dll" (ByVal s As Long, buf As BytePtr, ByVal lngLenlen As Long, ByVal flags As Long) As Long Declare Function sendto Lib "wsock32.dll" (ByVal s As Long, buf As BytePtr, ByVal lngLen As Long, ByVal flags As Long,ByRef sTo As sockaddr_in, ByVal tolen As Long) As Long Declare Function setsockopt Lib "wsock32.dll" (ByVal s As Long, ByVal level As Long, ByVal optname As Long, optval As String, ByVal optlen As Long) As Long Declare Function shutdown Lib "wsock32.dll" (ByVal s As Long, ByVal how As Long) As Long Declare Function socket Lib "wsock32.dll" (ByVal af As Long, ByVal lngType As Long, ByVal protocol As Long) As Long Declare Function recvb Lib "wsock32.dll" Alias "recv" (ByVal s As Long, buf As VoidPtr, ByVal lngLen As Long, ByVal flags As Long) As Long Declare Function sendb Lib "wsock32.dll" Alias "send" (ByVal s As Long, buf As VoidPtr, ByVal lngLen As Long, ByVal flags As Long) As Long 'バイトオーダー変換 Declare Function htonl Lib "wsock32.dll" (ByVal hostlong As Long) As Long Declare Function htons Lib "wsock32.dll" (ByVal hostshort As Long) As Word Declare Function ntohl Lib "wsock32.dll" (ByVal netlong As Long) As Long Declare Function ntohs Lib "wsock32.dll" (ByVal netshort As Long) As Word 'アドレス変換 Declare Function inet_addr Lib "wsock32.dll" (ByVal cp As String) As Long Declare Function inet_ntoa Lib "wsock32.dll" (ByVal lngIn As Long) As Long 'データベース関数 Declare Function gethostbyaddr Lib "wsock32.dll" (addr As Long, ByVal lngLen As Long, ByVal lngType As Long) As Long Declare Function gethostbyname Lib "wsock32.dll" (ByVal strName As String) As Long Declare Function gethostname Lib "wsock32.dll" (ByVal strName As String, ByVal namelen As Long) As Long Declare Function getpeername Lib "wsock32.dll" (ByVal s As Long,ByRef sName As sockaddr_in, namelen As Long) As Long Declare Function getprotobyname Lib "wsock32.dll" (ByVal strName As String) As Long Declare Function getprotobynumber Lib "wsock32.dll" (ByVal lngNumber As Long) As Long Declare Function getservbyname Lib "wsock32.dll" (ByVal strName As String, ByVal proto As String) As Long Declare Function getservbyport Lib "wsock32.dll" (ByVal Port As Long, ByVal proto As String) As Long Declare Function getsockname Lib "wsock32.dll" (ByVal s As Long,ByRef sName As sockaddr_in, namelen As Long) As Long Declare Function getsockopt Lib "wsock32.dll" (ByVal s As Long, ByVal level As Long, ByVal optname As Long, optval As String, optlen As Long) As Long '拡張機能 Declare Function WSAStartup Lib "wsock32.dll" (ByVal wVersionRequested As Long,ByRef lpWSAData As WSAData) As Long Declare Function WSACleanup Lib "wsock32.dll" () As Long Declare Function WSAAsyncGetServByName Lib "wsock32.dll" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal strName As String, ByVal proto As String, buf As String, ByVal buflen As Long) As Long Declare Function WSAAsyncGetServByPort Lib "wsock32.dll" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal Port As Long, ByVal proto As String, buf As String, ByVal buflen As Long) As Long Declare Function WSAAsyncGetProtoByName Lib "wsock32.dll" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal protoname As String, buf As String, ByVal buflen As Long) As Long Declare Function WSAAsyncGetProtoByNumber Lib "wsock32.dll" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal number As Long, buf As String, ByVal buflen As Long) As Long Declare Function WSAAsyncGetHostByName Lib "wsock32.dll" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal hostname As String, buf As String, ByVal buflen As Long) As Long Declare Function WSAAsyncGetHostByAddr Lib "wsock32.dll" (ByVal hWnd As Long, ByVal wMsg As Long, lngAddr As Long, ByVal lngLen As Long, ByVal lngType As Long, buf As String, ByVal buflen As Long) As Long Declare Function WSAAsyncSelect Lib "wsock32.dll" (ByVal s As Long, ByVal hWnd As Long, ByVal wMsg As Long, ByVal lngEvent As Long) As Long Declare Function WSACancelAsyncRequest Lib "wsock32.dll" (ByVal hAsyncTaskHandle As Long) As Long Declare Function WSACancelBlockingCall Lib "wsock32.dll" () As Long Declare Function WSAGetLastError Lib "wsock32.dll" () As Long Declare Function WSAIsBlocking Lib "wsock32.dll" () As Long Declare Sub WSASetLastError Lib "wsock32.dll" (ByVal lngErr As Long) Declare Function WSASetBlockingHook Lib "wsock32.dll" (ByVal lngFunc As Long) As Long Declare Function WSAUnhookBlockingHook Lib "wsock32.dll" () As Long 'ここまで '自作関数の定義ここから Function GIPADD(ByVal ipstr As String) As Long Dim lhost As Long Dim uhost As hostent Dim lhostbAdd As Long Dim lhostAdd As Long Dim SockAdd As sockaddr_in Dim HADD As Long lhost=gethostbyname(ipstr) If lhost <> 0 Then memcpy(VarPtr(uhost),lhost,Len(uhost)) With uhost memcpy(VarPtr(lhostbAdd),.h_addr_list,Len(lhostbAdd)) memcpy(VarPtr(lhostAdd),lhostbAdd,.h_length) End With GIPADD=lhostAdd Else GIPADD=0 End If End Function 'ここまで 'ここからがプログラム本体です #N88BASIC Dim WDATA As WSAData Dim APILONG As Long Dim Sock As Long Dim BufLen As Long Dim SBUF As String Dim RBUF As String Dim WBUF As String Dim Port As Word Dim HADD As Long Dim SockAdd As sockaddr_in Dim WarkBUF As String Dim HOSTBUF As String Dim SMTPBUF As String Dim POPBUF As String Dim POPUSER As String Dim POPPASS As String Dim Before As String Dim RES As Byte Dim SUBJEBUF As String Dim MAILBUF As String Dim SENDADDBUF As String Dim MYADDBUF As String Dim COMNB As Byte RES=0 COMNB=0 'DLLの起動 APILONG=WSAStartup(MAKEWORD(1,1),WDATA) Input "SMTPサーバのアドレスを入力してください。";SMTPBUF Input "あなたのメールアドレスを入力してください。";MYADDBUF Input "送信先のメールアドレスを入力してください。";SENDADDBUF Input "メールの件名を入力して下さい。";SUBJEBUF Input "メールの本文を入力して下さい。";MAILBUF Print "POP before SMTP のSMTPサーバですか?(y/n)"; Input Before If Before="y" Then Input "POPサーバのアドレスを入力してください。";POPBUF Input "POPサーバのユーサー名を入力してください。";POPUSER Input "POPサーバのパスワードを入力してください。";POPPASS 'ソケットの作成 Sock=socket(AF_INET,SOCK_STREAM,0) HADD=GIPADD(POPBUF) With SockAdd .sin_family=AF_INET .sin_port=htons(110) .sin_addr.S_addr=HADD End With '3ハンドシェイクによるコネクションの確立 APILONG=connect(Sock,SockAdd,Len(SockAdd)) If Not(APILONG=0) Then MsgBox 0,"コネクトに失敗しました。","MAILC",MB_OK+MB_TOPMOST closesocket(Sock) WSACleanup() End End If 'レスポンス受信 RBUF=String$(256,Chr$(0)) APILONG=recv(Sock,StrPtr(RBUF),Len(RBUF),0) If APILONG<1 Then MsgBox 0,"コネクションが切断しました","MAILC",MB_OK+MB_TOPMOST closesocket(Sock) WSACleanup() End End If RES=RES+1 MsgBox 0,RBUF,"レスポンス-"+Str$(RES)+"("+Str$(APILONG)+"Byte)",MB_OK+MB_TOPMOST 'コマンド送信 SBUF="USER "+POPUSER+Ex"\r\n" BufLen=Len(SBUF) COMNB=COMNB+1 MsgBox 0,SBUF,"コマンド -"+Str$(RES),MB_OK+MB_TOPMOST APILONG=send(Sock,StrPtr(SBUF),BufLen,0) 'レスポンス受信 RBUF=String$(256,Chr$(0)) APILONG=recv(Sock,StrPtr(RBUF),Len(RBUF),0) If APILONG<1 Then MsgBox 0,"コネクションが切断しました","MAILC",MB_OK+MB_TOPMOST closesocket(Sock) WSACleanup() End End If RES=RES+1 MsgBox 0,RBUF,"レスポンス-"+Str$(RES)+"("+Str$(APILONG)+"Byte)",MB_OK+MB_TOPMOST 'コマンド送信 SBUF="PASS "+POPPASS+Ex"\r\n" BufLen=Len(SBUF) COMNB=COMNB+1 MsgBox 0,SBUF,"コマンド -"+Str$(RES),MB_OK+MB_TOPMOST APILONG=send(Sock,StrPtr(SBUF),BufLen,0) 'レスポンス受信 RBUF=String$(256,Chr$(0)) APILONG=recv(Sock,StrPtr(RBUF),Len(RBUF),0) If APILONG<1 Then MsgBox 0,"コネクションが切断しました","MAILC",MB_OK+MB_TOPMOST closesocket(Sock) WSACleanup() End End If RES=RES+1 MsgBox 0,RBUF,"レスポンス-"+Str$(RES)+"("+Str$(APILONG)+"Byte)",MB_OK+MB_TOPMOST 'コマンド送信 SBUF="QUIT"+Ex"\r\n" BufLen=Len(SBUF) COMNB=COMNB+1 MsgBox 0,SBUF,"コマンド -"+Str$(RES),MB_OK+MB_TOPMOST APILONG=send(Sock,StrPtr(SBUF),BufLen,0) 'レスポンス受信 RBUF=String$(256,Chr$(0)) APILONG=recv(Sock,StrPtr(RBUF),Len(RBUF),0) If APILONG<1 Then MsgBox 0,"コネクションが切断しました","MAILC",MB_OK+MB_TOPMOST closesocket(Sock) WSACleanup() End End If RES=RES+1 'ソケットのクローズ closesocket(Sock) MsgBox 0,RBUF,"レスポンス-"+Str$(RES)+"("+Str$(APILONG)+"Byte)",MB_OK+MB_TOPMOST End If 'ソケットの作成 Sock=socket(AF_INET,SOCK_STREAM,0) HADD=GIPADD(SMTPBUF) With SockAdd .sin_family=AF_INET .sin_port=htons(25) .sin_addr.S_addr=HADD End With '3ハンドシェイクによるコネクションの確立 APILONG=connect(Sock,SockAdd,Len(SockAdd)) If Not(APILONG=0) Then MsgBox 0,"コネクトに失敗しました。","MAILC",MB_OK+MB_TOPMOST closesocket(Sock) WSACleanup() End End If 'レスポンス受信 RBUF=String$(256,Chr$(0)) APILONG=recv(Sock,StrPtr(RBUF),Len(RBUF),0) If APILONG<1 Then MsgBox 0,"コネクションが切断しました","MAILC",MB_OK+MB_TOPMOST closesocket(Sock) WSACleanup() End End If RES=RES+1 MsgBox 0,RBUF,"レスポンス-"+Str$(RES)+"("+Str$(APILONG)+"Byte)",MB_OK+MB_TOPMOST 'コマンド送信 SBUF="HELO "+SMTPBUF+Ex"\r\n" BufLen=Len(SBUF) COMNB=COMNB+1 MsgBox 0,SBUF,"コマンド -"+Str$(RES),MB_OK+MB_TOPMOST APILONG=send(Sock,StrPtr(SBUF),BufLen,0) 'レスポンス受信 RBUF=String$(256,Chr$(0)) APILONG=recv(Sock,StrPtr(RBUF),Len(RBUF),0) If APILONG<1 Then MsgBox 0,"コネクションが切断しました","MAILC",MB_OK+MB_TOPMOST closesocket(Sock) WSACleanup() End End If RES=RES+1 MsgBox 0,RBUF,"レスポンス-"+Str$(RES)+"("+Str$(APILONG)+"Byte)",MB_OK+MB_TOPMOST 'コマンド送信 SBUF="MAIL FROM: <"+MYADDBUF+Ex">\r\n" BufLen=Len(SBUF) COMNB=COMNB+1 MsgBox 0,SBUF,"コマンド -"+Str$(RES),MB_OK+MB_TOPMOST APILONG=send(Sock,StrPtr(SBUF),BufLen,0) 'レスポンス受信 RBUF=String$(256,Chr$(0)) APILONG=recv(Sock,StrPtr(RBUF),Len(RBUF),0) If APILONG<1 Then MsgBox 0,"コネクションが切断しました","MAILC",MB_OK+MB_TOPMOST closesocket(Sock) WSACleanup() End End If RES=RES+1 MsgBox 0,RBUF,"レスポンス-"+Str$(RES)+"("+Str$(APILONG)+"Byte)",MB_OK+MB_TOPMOST 'コマンド送信 SBUF="RCPT TO: <"+SENDADDBUF+Ex">\r\n" BufLen=Len(SBUF) COMNB=COMNB+1 MsgBox 0,SBUF,"コマンド -"+Str$(RES),MB_OK+MB_TOPMOST APILONG=send(Sock,StrPtr(SBUF),BufLen,0) 'レスポンス受信 RBUF=String$(256,Chr$(0)) APILONG=recv(Sock,StrPtr(RBUF),Len(RBUF),0) If APILONG<1 Then MsgBox 0,"コネクションが切断しました","MAILC",MB_OK+MB_TOPMOST closesocket(Sock) WSACleanup() End End If RES=RES+1 MsgBox 0,RBUF,"レスポンス-"+Str$(RES)+"("+Str$(APILONG)+"Byte)",MB_OK+MB_TOPMOST 'コマンド送信 SBUF="DATA"+Ex"\r\n" BufLen=Len(SBUF) COMNB=COMNB+1 MsgBox 0,SBUF,"コマンド -"+Str$(RES),MB_OK+MB_TOPMOST APILONG=send(Sock,StrPtr(SBUF),BufLen,0) 'レスポンス受信 RBUF=String$(256,Chr$(0)) APILONG=recv(Sock,StrPtr(RBUF),Len(RBUF),0) If APILONG<1 Then MsgBox 0,"コネクションが切断しました","MAILC",MB_OK+MB_TOPMOST closesocket(Sock) WSACleanup() End End If RES=RES+1 MsgBox 0,RBUF,"レスポンス-"+Str$(RES)+"("+Str$(APILONG)+"Byte)",MB_OK+MB_TOPMOST 'コマンド送信 SBUF="Subject:"+SUBJEBUF+Ex"\r\n" BufLen=Len(SBUF) COMNB=COMNB+1 MsgBox 0,SBUF,"コマンド -"+Str$(RES),MB_OK+MB_TOPMOST APILONG=send(Sock,StrPtr(SBUF),BufLen,0) 'コマンド送信 SBUF=MAILBUF+Ex"\r\n" BufLen=Len(SBUF) COMNB=COMNB+1 MsgBox 0,SBUF,"コマンド -"+Str$(RES),MB_OK+MB_TOPMOST APILONG=send(Sock,StrPtr(SBUF),BufLen,0) 'コマンド送信 SBUF="."+Ex"\r\n" BufLen=Len(SBUF) COMNB=COMNB+1 MsgBox 0,SBUF,"コマンド -"+Str$(RES),MB_OK+MB_TOPMOST APILONG=send(Sock,StrPtr(SBUF),BufLen,0) 'レスポンス受信 RBUF=String$(256,Chr$(0)) APILONG=recv(Sock,StrPtr(RBUF),Len(RBUF),0) If APILONG<1 Then MsgBox 0,"コネクションが切断しました","MAILC",MB_OK+MB_TOPMOST closesocket(Sock) WSACleanup() End End If RES=RES+1 MsgBox 0,RBUF,"レスポンス-"+Str$(RES)+"("+Str$(APILONG)+"Byte)",MB_OK+MB_TOPMOST 'コマンド送信 SBUF="QUIT"+Ex"\r\n" BufLen=Len(SBUF) COMNB=COMNB+1 MsgBox 0,SBUF,"コマンド -"+Str$(RES),MB_OK+MB_TOPMOST APILONG=send(Sock,StrPtr(SBUF),BufLen,0) 'レスポンス受信 RBUF=String$(256,Chr$(0)) APILONG=recv(Sock,StrPtr(RBUF),Len(RBUF),0) If APILONG<1 Then MsgBox 0,"コネクションが切断しました","MAILC",MB_OK+MB_TOPMOST closesocket(Sock) WSACleanup() End End If RES=RES+1 MsgBox 0,RBUF,"レスポンス-"+Str$(RES)+"("+Str$(APILONG)+"Byte)",MB_OK+MB_TOPMOST 'ソケットのクローズ closesocket(Sock) WSACleanup() End |
作成者: | yu0627 [ 2005年7月26日(火) 12:40 ] |
記事の件名: | 返信@yu0627 |
プログラミング掲示板で返信を頂いたyu0627です。 あなたのソースをコンパイルし実行してみましたが、 普通の場合は送信できるのですが、POP before SMTPの場合 あのDLLと同じエラーが起きます。 ユーザー名とパスワードはあっているのですが。 以下にPOP beofre SMTPの時の全てのコマンドとレスポンスを載せます。 +OK POP3 * v2003.83rh server ready USER yurail +OK User name accepted, password please PASS * +OK MailBox open, 0 messages QUIT -ERR Null command 220 * ESMTP SendMail 8.12.10/8.12.13; Tue 26 Jul 2005 12:33:24 +0900 HELO * 250 * Hello * [*.*.*.*], pleased to meet you MAIL FROM:* 250 2.1.0 *... Sender ok RCPT TO:* 550 5.7.1 *... Relaying denied. Proper authentication required. DATA 503 5.0.0 Need RCPT (recipient) Subject:test test . 500 5.5.1 Command unrecognized: "Subject:test" 500 5.5.1 Command unrecognized: "test" QUIT 500 5.5.1 Command unrecognized: "." 個人情報は全て*で隠してあります。以上です。 |
作成者: | situmon [ 2005年7月26日(火) 13:56 ] |
記事の件名: | |
RCPT TOではじかれているところをみると、このメールサーバはメールリレーを 拒否しているようです。 一度、このメールサーバの属するドメインのメールアドレス宛にメールを 送信してみてはいかがでしょうか。 なお、これとは別件ですが、このソースを作った当初が学校のサーバで実験していましたが、 先ほど別のサーバで試したところ、一部不具合があったため、改良しました。 |
作成者: | yu0627 [ 2005年7月26日(火) 14:22 ] |
記事の件名: | 返信@yu0627 |
> 一度、このメールサーバの属するドメインのメールアドレス宛にメールを送信してみてはいかがでしょうか。 あなたのプログラムを利用して自分のプロバイダのメールからそのドメインの取得しているメールアドレスにメールを送信してみましたが、 うまくできました。 POP before SMTPのそのサーバーから送信してみたところPOPサーバーの認証は成功しました。しかし、まだはじかれます。 コマンド&レスポンス +OK POP3 * v2003.83rh server ready USER yurail +OK User name accepted, password please PASS * +OK Mailbox open , 0 messages QUIT +OK Sayonara 220 * ESMTP SendMail 8.12.10/8.12.10; Tue 26 Jul 2005 14:16:53 +0900 HELO * 250 * Hello * [*.*.*.*], pleased to meet you MAIL FROM: <*> 250 2.1.0 <*>... Sender ok RCPT TO: <*> 550 5.7.1 <*>... Relaying denied. Proper authentication required. DATA 503 5.0.0 Need RCPT (recipient) Subject:test test . 500 5.5.1 Command unrecognized: "Subject:test" 500 5.5.1 Command unrecognized: "test" QUIT 500 5.5.1 Command unrecognized: "." 以上です。 |
作成者: | situmon [ 2005年7月26日(火) 14:37 ] |
記事の件名: | |
プロバイダメールアドレス SMTP ドメインの取得しているメールアドレス POP before SMTP プロバイダメールアドレス→ドメインの取得しているメールアドレス OK ドメインの取得しているメールアドレス→プロバイダメールアドレス NG ということですか? 私の実験した範囲での経験上、この POP before SMTP のサーバは RCPT TOで指定したアドレスへのリレーを拒否しています。 「ドメインの取得しているメールアドレス」側のメールサーバーはリレーを 許可する設定でしょうか?また、送信元のメールアドレスは正しいですか? 一度確認してみてください。 当然のことですが、受信アドレスへのメールリレーを拒否していた場合、 RCPT TOではじかれます。 |
作成者: | yu0627 [ 2005年7月26日(火) 14:57 ] |
記事の件名: | 返信@yu0627 |
> プロバイダメールアドレス SMTP > ドメインの取得しているメールアドレス POP before SMTP > > プロバイダメールアドレス→ドメインの取得しているメールアドレス OK > ドメインの取得しているメールアドレス→プロバイダメールアドレス NG > > ということですか? はい、そうです。 > 私の実験した範囲での経験上、この POP before SMTP のサーバは > RCPT TOで指定したアドレスへのリレーを拒否しています。 > 「ドメインの取得しているメールアドレス」側のメールサーバーはリレーを > 許可する設定でしょうか?また、送信元のメールアドレスは正しいですか? > 一度確認してみてください。 > 当然のことですが、受信アドレスへのメールリレーを拒否していた場合、 > RCPT TOではじかれます。 すみません。僕がそのサーバーの管理者ではないので問い合わせてみます。 追記です。送信元と送信先のアドレスを同じそのサーバーのアドレスにしたらなぜか送信できました。 ただ、あて先欄が空欄になりました。 また、とりやえずPOP認証機能を組み込みたいので、必要なAPI宣言とソースを教えてくれませんでしょうか。 |
作成者: | situmon [ 2005年7月27日(水) 18:34 ] |
記事の件名: | |
>追記です。送信元と送信先のアドレスを同じそのサーバーのアドレスにしたらなぜか送信できました。 理由としては同サーバ内のアドレスであるため、リレーではないので通ったのでしょう。 >また、とりやえずPOP認証機能を組み込みたいので、必要なAPI宣言とソースを教えてくれませんでしょうか。 API宣言はソースを見たとおり、通常のソケット通信のみです。 また、方法としては、ソースをトレースしていただければわかりますが、 1、POPサーバへコネクションを張る。 2、USERコマンドとPASSコマンドで認証を行う。 3、QUITでコネクション切断 以上です。これでPOP認証が終了します。 その後は通常通り、SMTPプロトコルを利用してメールを送信します。 プロトコルについてはRFCもしくは解説サイトなどを参照してください。 |
作成者: | yu0627 [ 2005年7月27日(水) 21:05 ] |
記事の件名: | 返信@yu0627 |
ありがとうございます。 おかげでうまくできました。 しかし、POPサーバーからのメッセージが取得できません。 以下がその部分のソースです。 コード: 'POPサーバーと通信する 'まず受信 FillMemory(buffer, 256, 0) recv(s, buffer, 256, 0) SetDlgItemText(hMainWnd, Static_Recv, buffer) Recvtemp=buffer 'ユーザー名を送信 wsprintf(buffer, Ex"USER %s\r\n", UserID) send(s, buffer, 256, 0) FillMemory(buffer, 256, 0) recv(s, buffer, 256, 0) Recvtemp=Recvtemp + buffer SetDlgItemText(hMainWnd, Static_Recv, buffer) 'パスワードを送信 wsprintf(buffer, Ex"PASS %s\r\n", PassWord) send(s, buffer, 256, 0) FillMemory(buffer, 256, 0) recv(s, buffer, 256, 0) Recvtemp=Recvtemp + buffer SetDlgItemText(hMainWnd, Static_Recv, buffer) '「QUIT」コマンドを送信 lstrcpy(buffer, Ex"QUIT\r\n") send(s, buffer, 256, 0) FillMemory(buffer, 256, 0) recv(s, buffer, 256, 0) Recvtemp=Recvtemp + buffer SetDlgItemText(hMainWnd, Static_Recv, buffer)送受信はしています。認証もできています。 どこがおかしいか教えてください。お願いいたします。 |
作成者: | yu0627 [ 2005年8月05日(金) 14:51 ] |
記事の件名: | 返信@yu0627 |
だいぶ時間が空きましたがこちらのメールサーバーの仕様が分かりました。 管理者に問い合わせたところPOP before SMTP認証ではなくSMTP認証だそうです。 僕にとっては同じように見えますが。 |
作成者: | situmon [ 2005年8月08日(月) 09:12 ] |
記事の件名: | SMTP認証 |
SMTP認証ということは SMTP AUTH ですね。 POP before SMTP と SMTP AUTH は同じように見えても内部的に違いますし、 後者の方が安全です。 前者はあくまでPOPの認証を利用しているに過ぎないため、たとえばルータを 通した場合などで、内部セグメントの他ホストが送信した場合など送信元の IPが同じ場合、セキュアでなくなる可能性があります。 一方後者ならばSMTPに認証があるため、送信時に認証を行えるのでセキュアです。 ただ、 SMTP AUTH は環境が無かったためやったことがありません。 もし使いたいのであれば、RFC 2554 で規定されているはずなので そちらを参考に実装してください。 |
作成者: | yu0627 [ 2005年8月09日(火) 12:01 ] |
記事の件名: | Re: SMTP認証 |
> SMTP認証ということは SMTP AUTH ですね。 > POP before SMTP と SMTP AUTH は同じように見えても内部的に違いますし、 > 後者の方が安全です。 > > 前者はあくまでPOPの認証を利用しているに過ぎないため、たとえばルータを > 通した場合などで、内部セグメントの他ホストが送信した場合など送信元の > IPが同じ場合、セキュアでなくなる可能性があります。 > 一方後者ならばSMTPに認証があるため、送信時に認証を行えるのでセキュアです。 > > ただ、 SMTP AUTH は環境が無かったためやったことがありません。 > もし使いたいのであれば、RFC 2554 で規定されているはずなので > そちらを参考に実装してください。 そうなんですか。教えてくださりありがとうございます。やってみます。 |
作成者: | yu0627 [ 2005年8月12日(金) 17:50 ] |
記事の件名: | SMTP-AUTH実装できました |
BASE64エンコードにあるDLLを使い、RFC2554の規定に従って送受信するようにしたらうまくいくようになりました。 色々と教えてくださりありがとうございました。 もしかしたらあなたのソースを改良してSMTP-AUTH対応のCUIプログラムのソースをこのフォーラムに投稿するかもしれません。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |