サンプルコード(WEBプログラミング編)


TCP/IPプロトコルプログラミング

簡単なSendMailの作成

SMTPプロトコルをつかった応答プログラミング

package smtp

import(
 os "os"
 fmt "fmt"
 tnet "net/textproto"
 strings "strings"
)

// use this Struct for sending
type MailInfo struct {
   SmtpServer string
   SmtpPort int
   FromAddr string
   ToAddr string
   Subject string
   Body string
}

//Get Responses and Check end of line is "OK" 
func checkResponse(rb *tnet.Reader) (string,bool){
   
   msg, err := rb.ReadLine()
   if err != nil {
      return "",false
   }

   if strings.LastIndex(strings.ToLower(msg),"ok") >= (len(msg) - 3) {
      return msg,true
   }

   return msg,false
}

//Get Responses 
func GetResponse(rb *tnet.Reader) (string,bool){

   msg, err := rb.ReadLine()
   if err != nil {
      return "",false
   }

   return msg,true
}

//Get Response only specific code 
func waitUntilResponseCode(rb *tnet.Reader,code int) (int,string,bool){

   cd, msg, err := rb.ReadCodeLine(code)
   if err != nil {
      return -1,"",false
   }

   return cd,msg,true
}

//send command to server 
func doCommand(wb *tnet.Writer,cmdstr string) os.Error{

   err := wb.PrintfLine(cmdstr)
   if err != nil {
      return err
   }

   return nil
}

//send dotText protocol to server 
func WriteMessage(wb *tnet.Writer,str string) os.Error{

   wwc := wb.DotWriter()

   _,err := wwc.Write([]byte(str))
   if err != nil {
      return err
   }

   err = wwc.Close()
   if err != nil {
      return err
   }

   return nil
}

//sending E-mail 
func ( mainInfo *MailInfo) SendMail() (string, bool){

   var log string

   myConn,err := tnet.Dial("tcp", fmt.Sprintf("%s:%d",mainInfo.SmtpServer,mainInfo.SmtpPort)) 
   if err != nil { 
      log += fmt.Sprintf("%s\n",err.String())
      return log,false
   }

   defer myConn.Close()

   rb := tnet.NewReader(myConn.Reader.R)
   wb := tnet.NewWriter(myConn.Writer.W)

   m,b := GetResponse(rb)
   log = fmt.Sprintf("%s\n",m)
   if b == false {
      return log,false
   }

   err = doCommand(wb,"EHLO")
   if err != nil { 
      log += fmt.Sprintf("%s\n",err.String())
      return log,false
   }

   m,b = GetResponse(rb)
   log = fmt.Sprintf("%s%s\n",log,m)
   if b == false {
      return log,false
   }

   err = doCommand(wb,fmt.Sprintf("MAIL FROM:<%s>",mainInfo.FromAddr))
   if err != nil { 
      log += fmt.Sprintf("%s\n",err.String())
      return log,false
   }

   m,b = checkResponse(rb)
   log = fmt.Sprintf("%s%s\n",log,m)
   if b == false {
      return log,false
   }

   err = doCommand(wb,fmt.Sprintf("RCPT TO:<%s>",mainInfo.ToAddr))
   if err != nil { 
      log += fmt.Sprintf("%s\n",err.String())
      return log,false
   }

   m,b = checkResponse(rb)
   log = fmt.Sprintf("%s%s\n",log,m)
   if b == false {
      return log,false
   }

   err = doCommand(wb,"DATA")
   if err != nil { 
      log += fmt.Sprintf("%s\n",err.String())
      return log,false
   }

   m,b = GetResponse(rb)
   log = fmt.Sprintf("%s%s\n",log,m)
   if b == false {
      return log,false
   }

   err = WriteMessage(wb,fmt.Sprintf("Subject:%s \n\n%s\n",mainInfo.Subject,mainInfo.Body))
   if err != nil { 
      log += fmt.Sprintf("%s\n",err.String())
      return log,false
   }

   m,b = checkResponse(rb)
   log = fmt.Sprintf("%s%s\n",log,m)
   if b == false {
      return log,false
   }

   err = doCommand(wb,"QUIT")
   if err != nil { 
      log += fmt.Sprintf("%s\n",err.String())
      return log,false
   }

   m,b = GetResponse(rb)
   log = fmt.Sprintf("%s%s\n",log,m)
   if b == false {
      return log,false
   }

   return log,true
}
				

パッケージ「smtp.go」は、構造体に設定された情報からSTMPプロトコルを使って、メッセージを送信するプログラム。 コマンドを送ったり、データを送ったり、戻ってきた応答メッセージをチェックしたり、と基本処理がひとそろい。

これはあくまでもサンプルです。SMTPの安易な使用はサーバーに負担をかけますし、中継等は迷惑メールの元です。 また、本格的にSMTP処理プログラムをサーバーに実装する際には、文字コードの7ビット対応やヘッダーの編集など、E-Mailの処理に則った設定が必要なので注意してください

©2010 Tugu Katagiri

WindowsでGo言語
のまとめ

このページはIE8で動作を確認しています。

Internet Explorer 8 をダウンロード
Firefox ブラウザ無料ダウンロード