Class: DocomoWebMailer

Inherits:
Object
  • Object
show all
Defined in:
lib/docomo_web_mailer.rb,
lib/docomo_web_mailer/convert_mail.rb

Defined Under Namespace

Classes: AllMailHeaders, Builder, MailLabel, MailLabelList, MailListItem, Mailheaders, Maillist, Mailparts, Mailsummary, Mimepart, Mimepartspec, Parser, RHash, TArray

Constant Summary collapse

MAX_SIZE =

メールボックスの最大値?

10000

Instance Method Summary collapse

Constructor Details

#initializeDocomoWebMailer

コンストラクタ



29
30
31
32
33
# File 'lib/docomo_web_mailer.rb', line 29

def initialize()
  @agent = Mechanize.new
  @id = 0
  @agent.user_agent_alias = 'Mac Safari'
end

Instance Method Details

#A(str) ⇒ Object

:nodoc:



119
120
121
# File 'lib/docomo_web_mailer.rb', line 119

def A(str) # :nodoc:
  {'$A'=>str.to_s}
end

#append_client_flag(uid, flag = "flagged") ⇒ Object

uid で指定したメールにclient_flagをたてる。 uid は to_uid によって変換される



104
105
106
# File 'lib/docomo_web_mailer.rb', line 104

def append_client_flag(uid,flag="flagged")
  rcp( "mail_label", [ [ T( A(:append), T( A(:client_flag), A(flag) ), null, [ to_uid(uid) ] ) ], 10000 ] )
end

#attachment(mimepart) ⇒ Object

そのパートの添付ファイルを得る。String型のバイナリデータ。 mimepart は Mimepart型



79
80
81
82
83
# File 'lib/docomo_web_mailer.rb', line 79

def attachment(mimepart)
  url = "/pc/attachment.php?url=#{u(mimepart.attache_info)}"
  url += "&df=#{u(mimepart.filename.to_s)}" if mimepart.filename
  @agent.get_file(url)
end

#convert_mail(header) ⇒ Object



2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/docomo_web_mailer/convert_mail.rb', line 2

def convert_mail(header)
  text = headers.to_s
  text += "\n\n"
  if parts.parts.size == 1
    data = mail_get_attache( parts.parts[0] )
    text +="#{data}"
  else
    h = nil
    raise "unknown type header #{text}" unless headers.find{|k,v| k == "content-type" and v =~ /boundary=(.*)$/}
    boundary = $1.dup.strip.gsub(/^"(.*)"$/,'\1').gsub(/^'(.*)'$/,'\1')
    for part in parts.parts
      body = mail_get_attache( part )
      header = []
      header << "--#{boundary}"
      content_type = part.content_type
      if part.inline_head and part.inline_head.find{|n,v| n == 'content-type'}
        content_type = part.inline_head.find{|n,v| n == 'content-type'}[1]
      end
      puts "content_type=#{content_type}"
      header << "Content-Type: #{content_type}"
      is_text = content_type =~ /^text\//
      if is_text
        header << "Content-Transfer-Encoding: 8bit"
      else
        header << "Content-Transfer-Encoding: base64"
      end
      header << "Content-ID: #{part.contentid}" if part.contentid
      if part.disposition
        if part.filename
          header << "Content-Disposition: #{part.disposition}; filename=#{part.filename}"
        else
          header << "Content-Disposition: #{part.disposition}"
        end
      end
      header << ""
      if is_text
        header << body
      else
        header << Base64.encode64(body)
      end
      header << ""
      text += header.join("\n")
    end
    text +="--#{boundary}--\n"
  end
  text
end

#login(id, password) ⇒ Object

ログインする。失敗するとexception



35
36
37
38
39
40
41
42
43
# File 'lib/docomo_web_mailer.rb', line 35

def (id,password)
  page = @agent.get("http://dwmail.jp/")
  form = page.form_with(:name => "f1")
  raise "login error: cant find login form" unless form
  form.field_with(:name => "uname").value = id
  form.field_with(:name => "pass").value = password
  res = @agent.submit(form)
  raise "login error (id/pass illegal) " if res.form_with(:name => "f1")
end

#mail_get_headers(maillistitem) ⇒ Object

uid で指定したメールのヘッダ(AllMailHeaders)を得る。 uid は to_uid によって変換される



94
95
96
# File 'lib/docomo_web_mailer.rb', line 94

def mail_get_headers(maillistitem)
  AllMailHeaders.new *rcp( "mail_get_headers", [ to_uid(maillistitem), A(:infinity) ] )
end

#mail_get_parts(uid) ⇒ Object

uid で指定したメールの全パート情報を得る。Mailpartsを返す。 uid は to_uid によって変換される



74
75
76
# File 'lib/docomo_web_mailer.rb', line 74

def mail_get_parts(uid)
  Mailparts.new *rcp("mail_get_parts", [ to_uid(uid), [ T( A(:bodypref), [ "*/*" ] ), T( A(:bodyparse), A(:off) ) ], MAX_SIZE ])
end

#mail_label_listObject

ラベル(フォルダ)の一覧 MailLabelList を得る。



85
86
87
88
89
90
91
# File 'lib/docomo_web_mailer.rb', line 85

def mail_label_list
  MailLabelList.new( *rcp( "mail_label", [ [
    T( A(:list), [ A(:server_folder) ], A(:ascending) ),
    T( A(:list), [ A(:user_folder) ], A(:ascending) ),
    T( A(:list), [ A(:user_flag) ], A(:ascending) )
  ], 10000 ] ) )
end

#mail_list_get(maillist, start, limit) ⇒ Object

Maillistの続きのメールを得る。uid順。startからlimit個。新しいMaillistを返す。



69
70
71
# File 'lib/docomo_web_mailer.rb', line 69

def mail_list_get(maillist, start,limit )
  Maillist.new( *rcp( "mail_list_get", [ maillist.sign, T( T( A(:plain), A(:uid) ), A(:descending), start, limit ), MAX_SIZE ] ) )
end

#mail_list_start(maillabel, limit) ⇒ Object

MailLabel のメールを得る。uid順。limit個。Maillistを返す。 maillabel の値がSymbolならサーバフォルダ、文字列ならユーザフォルダ。



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/docomo_web_mailer.rb', line 46

def mail_list_start(maillabel,limit)
  place = [ A(:server_folder), A(maillabel) ]
  if maillabel.is_a? MailLabel
    place = [ A(maillabel.place), A(maillabel.index) ]
  elsif maillabel.is_a? String
    place[0]['$A']="user_folder"
  end
  Maillist.new( *rcp("mail_list_start",[ 1, T( nil, T(
      # 得たいフォルダの場所
      [ T(*place) ],
      # 不明
      [ ],
      # 不明
      [ T( A(:client_flag), A(:recent) ) ],
      # 得たい付加情報?
      [ A(:server_flag), A(:client_flag), A(:server_folder), A(:user_folder), A(:user_flag) ]
      ) ),
    # 並び順と数?
    T( T( A(:plain), A(:uid) ), A(:descending), nil, limit ),
    # 不明
    nil, MAX_SIZE, MAX_SIZE ]) )
end

#make_mail_to_smtp(uid) ⇒ Object

uid で指定したメールのSMTP送信用テキストを作る uid は to_uid によって変換される



99
100
101
# File 'lib/docomo_web_mailer.rb', line 99

def make_mail_to_smtp(uid)
  Builder.new(self).build( uid )
end

#rcp(method, params) ⇒ Object

rcp 1.0 にパラメータを投げる



173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
# File 'lib/docomo_web_mailer.rb', line 173

def rcp( method,params )
  @id += 1
  result = Parser.rcp_to_ruby(JSON.parse(@agent.post("http://pc.dwmail.jp/api/base/rpc/1.0", {
    :id => @id.to_s,
    :method => method.to_s,
    :params => params,
    :version=>"1.1"
  }.to_json ).body))
  unless result["error"]
    return result["result"]
  else
    require 'pp'
    pp result['error']
    pp params
    raise "error ! #{result['error']}"
  end
end

#remove_client_flag(uid, flag = "flagged") ⇒ Object

uid で指定したメールからclient_flagを外す。 uid は to_uid によって変換される



109
110
111
# File 'lib/docomo_web_mailer.rb', line 109

def remove_client_flag(uid,flag="flagged")
  rcp( "mail_label", [ [ T( A(:remove), T( A(:client_flag), A(flag) ), null, [ to_uid(uid) ] ) ], 10000 ] )
end

#T(*array) ⇒ Object

:nodoc:



122
123
124
# File 'lib/docomo_web_mailer.rb', line 122

def T(*array) # :nodoc:
  {'$T'=>array}
end

#to_uid(maillistitem) ⇒ Object

maillistitem を uid にする。文字列なら数値化、数値以外ならuidプロパティーの値を返す



113
114
115
116
117
# File 'lib/docomo_web_mailer.rb', line 113

def to_uid( maillistitem )
  maillistitem = maillistitem.to_i if maillistitem.is_a? String
  maillistitem = maillistitem.uid unless maillistitem.is_a? Numeric
  maillistitem
end