動画添付されたメールのDB登録、動画変換

前提条件

  1. IIS + ASP + BASP21
  2. BASP21 は http://www.hi-ho.ne.jp/babaq/index.html を参照してください。
  3. メールサーバは 「NeonメールサーバーAdvance Ver3.09」を使用
  4. ブラウザを利用した手動でのチェックと変換
  5. WSH 版は作成中(メール着信をトリガーとして自動変換)
  6. 3gp → flv、swf 変換は ffmpeg を使用
  7. Linux + qmail + PHP 版はこちら

ffmpeg のダウンロードと設定

  1. ・http://arrozcru.no-ip.org/ffmpeg_builds/
    から
  2. ・Win32 Binaries: ffmpeg-r9017-win32.tar.bz2  をダウンロード
  3. ・Lhaplus で解凍 (Lhaplus がインストールされていれば、ダブルクリック2回で解凍)
    そのまま設定なしで、パスを通して使用可能
  4. \ffmpeg-r9017-win32\bin の中 ffmpeg.exe、ffplay.exe、pthreadGC2.dll、SDL.dll
  5. ・ffmpeg.exe、ffplay.exe などがコマンドラインで使用可能

メールサーバの受信リスト表示

  1. ・RcvMail の list 命令で Subject、From、Dateヘッダーの内容のみ取得。

  2. mServer = "メールサーバ名"
    mUser = "ユーザ名"
    mPass = "パスワード"

    mDir = Server.MapPath("./mail_tmp")
    aDir = Server.MapPath("./attached") : ' 添付データの保存フォルダー
    dougaDir = Server.MapPath("./movies") : ' 動画データの保存フォルダー

    set Basp = Server.CreateObject( "Basp21" )
    mails = Basp.RcvMail(mServer, mUser, mPass, "list", mDir)
    if IsArray(mails) then
    response.write "<table>"
    cnt=1
    for each strInf in mails
    aryInf=Split(strInf,Chr(9))
    response.write "<tr><td align=right>" & cnt & ".</td>"
    response.write "<td>" & Basp.RepTagChar(Replace(aryInf(0),"Subject:","")) & "</td>"
    response.write "<td & Basp.RepTagChar(Replace(aryInf(1),"From:","")) & "</td>"
    response.write "<td>" & Basp.RepTagChar(Replace(aryInf(2),"Date:","")) & "</td>"
    response.write "</tr>"
    cnt=cnt+1
    next
    response.write "</table>"
    else
    response.write "No Mail"
    end if

  3. ・動画が添付されていてもいなくても、受信メールの一覧を表示
  4. ・list では本文および添付ファイルの取得はできないので、save で取得

受信メールリストから不要メールの削除 DELE

  1. ・上記リストにチェックボックスをつけておき、その番号で削除を行う。
  2. ・チェックボックスの番号を最後から取得しないと、削除されたメールの次のメールの番号が 繰り上がるため、必要なメールも削除されるので、注意。
  3. for jk=request("cnt") to 1 step -1
    if (request("del"&jk)="on") then
    mails = Basp.RcvMail(mServer, mUser, mPass, "DELE "&n, tmpDir)
    end if
    next
  4. ・SAVEALL の替わりに SAVEALLD を使用すると、受信後全てのメールを削除

メールと添付ファイルの取得 SAVEALL で一括保存

  1. mails = Basp.RcvMail(mServer, mUser, mPass, "SAVEALL", mDir)
  2. ・mDir に テキストファイルで保存
  3. ・YYYYMMDD-nnnnnnnn.txt というファイル名でメールがテキストファイルで保存される
  4. ・添付ファイルも上記テキストファイル内に書き込まれるので、これを ReadMail で取り出す。
  5. ・SAVEALL の替わりに SAVEALLD を使用すると、受信後全てのメールを削除

保存されたテキストファイルから添付ファイルの取り出し

  1. ・mDir に テキストファイルで保存されたファイルを読み込み添付ファイルをaDirに保存
  2. set fs = Server.CreateObject("Scripting.FileSystemObject")
    set fd = fs.GetFolder(mDir)
    set fc = fd.Files
    para = "" : ' とりあえず全てのヘッダーを読み込み
    for each fl in fc
    txt_fl = mDir & "\" & fl.name
    mItems = Basp.ReadMail(txt_fl,para,aDir)
    for each item_str in mItems
    response.write Server.HTMLEncode(item_str)"<br>" : ' ヘッダーとその内容を全て表示
    next
    response.write "<br>"
    next
    set fs = nothing

  3. ・aDir に添付ファイルが保存される。htmlメールや GIF や JPG などの添付ファイルも保存されてしまう。
  4. ・ヘッダーは、Received: Date: From: To: Subject: In-Reply-To: References: ...など。
  5. ・メーラーによっては、ヘッダーの順番や種類が異なる場合があり、複数の添付ファイルがある場合もあるので、
     一度全てを取り出して、内容をチェックしてから次の処理
  6. ・添付ファイルの拡張子を、3gp または 3g2 に限定したい場合は、mItems のヘッダーが File でその文字列の
     最後が3gpまたは3g2を選択

  7. mItems_c = left(Server.HTMLEncode(mItems),4)
    if (mItems_c="File") then
    m_file = trim(replace(data_str,"File:","") )
    if (LCase(right(data_str,3))="3gp") or (LCase(right(data_str,3))="3g2") then
    fs.movefile aDir&"\"&m_file , dougaDir
    else
    fs.deletefile aDir&"\"&m_file
    end if
    end if

  8. ・サーバの負荷状態によっては、添付ファイルの取り出しが間に合わないで移動や削除が実行される可能性が
     あるため、とりあえず一度取り出して、後から削除なり移動する方法がお勧め。

保存されたテキストファイルからタイトル、日付、送信者、本文の取り出し

  1. ・単純に添付ファイルを取り出した場合、どのメールに添付されていたものかわからなくなるので、
     Date、Subject、From、Body を取り出して、テキストファイルに書き出し。
  2. if (data_c="Date") then
    d_str = data_str
    end if
  3. ・同様にSubject、From、Body もとりだして、
    mail_str=d_str & s_str & fr_str & b_str & "File:" & m_file
    lst.WriteLine mail_str
  4. ・lst.WriteLine でテキストに書き出しているが、ここで insert を行えば、DBへ書き込みとなる
  5. ・事前に
    fl_list = Server.MapPath("./") & "\" & "ffmpeg.lst"
    Set lst = fs.OpenTextFile(fl_list,8,True)
      fl_list を書き出しファイルとして指定しておく
  6. ・サンプルでは、Body な長い場合があるので、先頭の200文字までを書き出し。
  7. ・複数の添付ファイルがある場合は、別の行で書き出し

ffmpeg による 3gpまたは3g2 から flvまたはswfへの変換

  1. ・ffmpeg へパスが通っているとして、以下の操作で変換が可能
  2.   コマンドラインでのflvへ変換例
    c:\>ffmpeg -y -i in_file -ar 11025 -sameq -b 81 out_file.flv
  3.   コマンドラインでのswfへ変換例
    c:\>ffmpeg -y -i in_file -ar 11025 -sameq -b 81 out_file.swf
  4.   コマンドラインでのJPGサムネールの作成例
    c:\>ffmpeg -y -i in_file -f image2 -ss 00:00:00 -vframes 1 out_file.jpg
  5.   コマンドラインでのPNGサムネールの作成例
    c:\>ffmpeg -y -i in_file -f image2 -ss 00:00:00 -vframes 1 out_file.png
  6. ・この操作をバッチファイルに書き出して、実行させる。
  7. ・rc = Basp.Execute("cmd.exe /c バッチファイル名",1,stdout)

ffmpeg 変換時に flvファイルの再生時間の取得

  1. ・ffmpeg をコマンドラインで操作すると、DOS画面に処理状況が表示される。
  2. ・この処理状況をリダイレクトでテキストファイルに保存
    c:\>ffmpeg -y -i in_file -ar 11025 -sameq -b 81 out_file.flv > tr_log.txt 2>1
  3. ・tr_log.txt に変換状況と結果が保存される。
  4. ・保存された tr_log.txt の time= に再生時間が記録されている。

flv ファイルの再生方法

デモサイト(現在停止中です)

  1. 送信先メールアドレスを複数作成 :
  2. 閲覧サイトのアドレスを複数作成固定 :
  3. 送信者または、管理者が登録内容の修正更新可能
2007年7月19日