在 rails ruby 中使用 gmail api 检查用户电子邮件中的某些关键字是否可用

Check if certain keywords available in users email using gmail api in ruby on rails

我正在尝试 check/filter 通过用户收件箱电子邮件并检查关键字 "offer" 和 "letter"

通过调用 gmail 上的消息 api 它 returns 消息 ID 和线程,您可以使用它们来获取我从下面的示例添加到数组中的消息内容

def keyword_check
  client = Signet::OAuth2::Client.new(access_token: session[:access_token])
  service = Google::Apis::GmailV1::GmailService.new
  service.authorization = client
  messages = service.list_user_messages('me')
  @messages_json = []
  messages.messages.each do |m|
    response = HTTParty.get("https://www.googleapis.com/gmail/v1/users/me/messages/#{m.id}?access_token=#{session[:access_token]}")
    res = JSON.parse(response.body)
    @messages_json << res
  end 

  filter = HTTParty.get("https://www.googleapis.com/gmail/v1/users/me/messages?q=offer?access_token=#{session[:access_token]}")
  mes = JSON.parse(filter.body)

  render json: @messages_json.to_json
end

这个 returns 数组中的所有消息,但我发现很难过滤数组并检查特定关键字并返回 true 或 false 的布尔值以及数组中单独的消息本身?

我认为您应该在将关键字添加到数组之前检查 response.body 中是否存在这些关键字:

def keyword_check
  client = Signet::OAuth2::Client.new(access_token: session[:access_token])
  service = Google::Apis::GmailV1::GmailService.new
  service.authorization = client
  messages = service.list_user_messages('me')
  @messages_json = []
  messages.messages.each do |m|
    response = HTTParty.get("https://www.googleapis.com/gmail/v1/users/me/messages/#{m.id}?access_token=#{session[:access_token]}")
    res = JSON.parse(response.body)
    @messages_json << res if matches_keywords(response.body)
  end 

  filter = HTTParty.get("https://www.googleapis.com/gmail/v1/users/me/messages?q=offer?access_token=#{session[:access_token]}")
  mes = JSON.parse(filter.body)

  render json: @messages_json.to_json
end

def matches_keywords content
   return true if content.include?('offer')
   return true if content.include?('letter')
   return false
end

编辑:请注意正文可能包含所有 HTML 格式、css 代码等等...假设有一个 CSS 规则 'letter-spacing', 新功能总是return true,所以请检查您是否能够获取TEXT 内容。为此,请查看 Gmail API 的文档。

另一种方法可能是使用 Kaminara(或等同物)真正深入 HTML 结构,并且只检查包含实际文本(或某些特定内容或其他内容)的部分