Class: Gmail::Message

Inherits:
Object
  • Object
show all
Defined in:
lib/gmail/message.rb

Defined Under Namespace

Classes: NoLabelError

Constant Summary collapse

PREFETCH_ATTRS =
["UID", "ENVELOPE", "BODY.PEEK[]", "FLAGS", "X-GM-LABELS", "X-GM-MSGID", "X-GM-THRID"].freeze

Instance Method Summary collapse

Constructor Details

#initialize(mailbox, uid, _attrs = nil) ⇒ Message

Returns a new instance of Message.


8
9
10
11
12
13
# File 'lib/gmail/message.rb', line 8

def initialize(mailbox, uid, _attrs = nil)
  @uid     = uid
  @mailbox = mailbox
  @gmail   = mailbox.instance_variable_get("@gmail") if mailbox # UGLY
  @_attrs  = _attrs
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(meth, *args, &block) ⇒ Object


171
172
173
174
175
176
177
178
179
180
# File 'lib/gmail/message.rb', line 171

def method_missing(meth, *args, &block)
  # Delegate rest directly to the message.
  if envelope.respond_to?(meth)
    envelope.send(meth, *args, &block)
  elsif message.respond_to?(meth)
    message.send(meth, *args, &block)
  else
    super
  end
end

Instance Method Details

#add_label(name) ⇒ Object Also known as: label, label!, add_label!

Use Gmail IMAP Extensions to add a Label to an email


144
145
146
147
148
149
# File 'lib/gmail/message.rb', line 144

def add_label(name)
  @gmail.mailbox(@mailbox.name) do
    @gmail.conn.uid_store(uid, "+X-GM-LABELS", [Net::IMAP.encode_utf7(name.to_s)])
    clear_cached_attributes
  end
end

#archive!Object

Archiving is done by adding the `All Mail` label. To undo this, you just re-apply the `Inbox` label (see `#unarchive!`)

IMAP's fetch('1:100', (X-GM-LABELS)) function does not fetch inbox, just emails labeled important? stackoverflow.com/a/28973760 In my testing the currently selected mailbox is always excluded from the X-GM-LABELS results. When you called conn.select() it implicitly selected 'INBOX', therefore excluding 'Inbox' from the list of labels. If you selected a different mailbox then you would see '\\Inbox' in your results:


125
126
127
# File 'lib/gmail/message.rb', line 125

def archive!
  @gmail.find(message.message_id).remove_label('\Inbox')
end

#as_jsonObject


167
168
169
# File 'lib/gmail/message.rb', line 167

def as_json
  super(except: ["gmail"])
end

#delete!Object

Deleting is done by adding the `Trash` label. To undo this, you just re-apply the `Inbox` label (see `#undelete!`)


112
113
114
# File 'lib/gmail/message.rb', line 112

def delete!
  add_label("\\Trash")
end

#envelopeObject


29
30
31
# File 'lib/gmail/message.rb', line 29

def envelope
  @envelope ||= fetch("ENVELOPE")
end

#flag(name) ⇒ Object

Mark message with given flag.


47
48
49
50
51
52
# File 'lib/gmail/message.rb', line 47

def flag(name)
  !!@gmail.mailbox(@mailbox.name) do
    @gmail.conn.uid_store(uid, "+FLAGS", [name])
    clear_cached_attributes
  end
end

#flagsObject


38
39
40
# File 'lib/gmail/message.rb', line 38

def flags
  @flags ||= fetch("FLAGS")
end

#inspectObject


163
164
165
# File 'lib/gmail/message.rb', line 163

def inspect
  "#<Gmail::Message#{'0x%04x' % (object_id << 1)} mailbox=#{@mailbox.name}#{' uid=' + @uid.to_s if @uid}#{' message_id=' + @msg_id.to_s if @msg_id}>"
end

#labelsObject


42
43
44
# File 'lib/gmail/message.rb', line 42

def labels
  @labels ||= fetch("X-GM-LABELS")
end

#mark(flag) ⇒ Object

Do commonly used operations on message.


63
64
65
66
67
68
69
70
71
72
# File 'lib/gmail/message.rb', line 63

def mark(flag)
  case flag
  when :read    then read!
  when :unread  then unread!
  when :deleted then delete!
  when :spam    then spam!
  else
    flag(flag)
  end
end

#messageObject Also known as: raw_message


33
34
35
# File 'lib/gmail/message.rb', line 33

def message
  @message ||= Mail.new(fetch("BODY[]"))
end

#move_to(name, from = nil) ⇒ Object Also known as: move, move!, move_to!


135
136
137
138
# File 'lib/gmail/message.rb', line 135

def move_to(name, from = nil)
  add_label(name)
  @gmail.find(message.message_id).remove_label(from) if from
end

#msg_idObject Also known as: message_id


19
20
21
# File 'lib/gmail/message.rb', line 19

def msg_id
  @msg_id ||= fetch("X-GM-MSGID")
end

#read!Object

Mark as read.


80
81
82
# File 'lib/gmail/message.rb', line 80

def read!
  flag(:Seen)
end

#read?Boolean

Check whether message is read

Returns:

  • (Boolean)

75
76
77
# File 'lib/gmail/message.rb', line 75

def read?
  flags.include?(:Seen)
end

#remove_label(name) ⇒ Object Also known as: remove_label!

Use Gmail IMAP Extensions to remove a Label from an email


155
156
157
158
159
160
# File 'lib/gmail/message.rb', line 155

def remove_label(name)
  @gmail.mailbox(@mailbox.name) do
    @gmail.conn.uid_store(uid, "-X-GM-LABELS", [Net::IMAP.encode_utf7(name.to_s)])
    clear_cached_attributes
  end
end

#respond_to?(meth, *args, &block) ⇒ Boolean

Returns:

  • (Boolean)

182
183
184
185
# File 'lib/gmail/message.rb', line 182

def respond_to?(meth, *args, &block)
  return true if envelope.respond_to?(meth) || message.respond_to?(meth)
  super(meth, *args, &block)
end

#respond_to_missing?(meth, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)

187
188
189
# File 'lib/gmail/message.rb', line 187

def respond_to_missing?(meth, include_private = false)
  envelope.respond_to?(meth) || message.respond_to?(meth) || super
end

#spam!Object

Marking as spam is done by adding the `Spam` label. To undo this, you just re-apply the `Inbox` label (see `#unspam!`)


106
107
108
# File 'lib/gmail/message.rb', line 106

def spam!
  add_label("\\Spam")
end

#star!Object

Mark message with star.


95
96
97
# File 'lib/gmail/message.rb', line 95

def star!
  flag(:Flagged)
end

#starred?Boolean

Check whether message is starred

Returns:

  • (Boolean)

90
91
92
# File 'lib/gmail/message.rb', line 90

def starred?
  flags.include?(:Flagged)
end

#thr_idObject Also known as: thread_id


24
25
26
# File 'lib/gmail/message.rb', line 24

def thr_id
  @thr_id ||= fetch("X-GM-THRID")
end

#uidObject


15
16
17
# File 'lib/gmail/message.rb', line 15

def uid
  @uid ||= fetch("UID")
end

#unarchive!Object Also known as: unspam!, undelete!


129
130
131
# File 'lib/gmail/message.rb', line 129

def unarchive!
  @gmail.find(message.message_id).add_label('\Inbox')
end

#unflag(name) ⇒ Object

Unmark message.


55
56
57
58
59
60
# File 'lib/gmail/message.rb', line 55

def unflag(name)
  !!@gmail.mailbox(@mailbox.name) do
    @gmail.conn.uid_store(uid, "-FLAGS", [name])
    clear_cached_attributes
  end
end

#unread!Object

Mark as unread.


85
86
87
# File 'lib/gmail/message.rb', line 85

def unread!
  unflag(:Seen)
end

#unstar!Object

Remove message from list of starred.


100
101
102
# File 'lib/gmail/message.rb', line 100

def unstar!
  unflag(:Flagged)
end