使用 ruby​​-gmail 读取 Gmail 邮件

2024-02-07

我正在寻找一个实例方法ruby-gmailgem 可以让我阅读:

  • 身体 或者

  • subject

Gmail 邮件的。

查看文档后发现here http://www.rubydoc.info/gems/ruby-gmail/0.3.1,我什么也没找到!?

有一个.message实例方法中找到Gmail::Message班级部分;但由于缺乏更好的术语,它只返回电子邮件“mumbo-jumbo”,表示正文。

我的尝试:

#!/usr/local/bin/ruby
require 'gmail'

gmail = Gmail.connect('username', 'password')

emails = gmail.inbox.emails(:from => '[email protected] /cdn-cgi/l/email-protection')

emails.each do |email|
  email.read
  email.message
end

Now:

  1. email.read does not work
  2. email.message返回上面提到的“mumbo-jumbo”

其他人在 SO 上问过这个问题但没有得到答案。


这可能并不完全是您问题的答案,但我会告诉您我过去所做的事情。我尝试使用 ruby​​-gmail gem,但在阅读消息方面它没有达到我想要的效果。或者,至少,我无法让它发挥作用。相反,我使用内置的Net::IMAP类来登录并获取消息。

require 'net/imap'
imap = Net::IMAP.new('imap.gmail.com',993,true)
imap.login('<username>','<password>')
imap.select('INBOX')
subject_id = search_mail(imap, 'SUBJECT', '<mail_subject>')
subject_message = imap.fetch(subject_id,'RFC822')[0].attr['RFC822']
mail = Mail.read_from_string subject_message
body_message = mail.html_part.body

从这里您的消息存储在body_message并且是 HTML。如果您想要整个电子邮件正文,您可能需要学习如何使用 Nokogiri 来解析它。如果您只想要一小部分消息,其中您知道一些周围的字符,您可以使用正则表达式来查找您感兴趣的部分。

我确实找到了one page https://github.com/dcparker/ruby-gmail/issues/36与 ruby​​-gmail gem 相关,该 gem 讨论使用 ruby​​-gmail 读取 Gmail 消息。今晚我粗略地尝试了一下,但显然谷歌提高了我帐户的安全性,如果不修改我的 Gmail 配置,我就无法使用 irb(根据我收到的警告电子邮件)。所以我无法验证该页面上的内容,但正如我提到的,我过去的尝试没有成果,而Net::IMAP对我有用。

编辑: 我发现this https://www.ruby-forum.com/topic/51108,这很酷。您需要添加

require 'cgi'

到你的班级。

我能够以这种方式实现它。当我有了我的body_message,调用html2text该链接页面中的方法(我对其进行了稍微修改并包含在下面,因为您必须将 body_message 转换为字符串):

plain_text = html2text(body_message)
puts plain_text #Prints nicely formatted plain text to the terminal

这是稍微修改的方法:

def html2text(html)
  text = html.to_s.
    gsub(/(&nbsp;|\n|\s)+/im, ' ').squeeze(' ').strip.
    gsub(/<([^\s]+)[^>]*(src|href)=\s*(.?)([^>\s]*)\3[^>]*>\4<\/\1>/i,
'\4')

  links = []
  linkregex = /<[^>]*(src|href)=\s*(.?)([^>\s]*)\2[^>]*>\s*/i
  while linkregex.match(text)
    links << $~[3]
    text.sub!(linkregex, "[#{links.size}]")
  end

  text = CGI.unescapeHTML(
    text.
      gsub(/<(script|style)[^>]*>.*<\/\1>/im, '').
      gsub(/<!--.*-->/m, '').
      gsub(/<hr(| [^>]*)>/i, "___\n").
      gsub(/<li(| [^>]*)>/i, "\n* ").
      gsub(/<blockquote(| [^>]*)>/i, '> ').
      gsub(/<(br)(| [^>]*)>/i, "\n").
      gsub(/<(\/h[\d]+|p)(| [^>]*)>/i, "\n\n").
      gsub(/<[^>]*>/, '')
  ).lstrip.gsub(/\n[ ]+/, "\n") + "\n"

  for i in (0...links.size).to_a
    text = text + "\n  [#{i+1}] <#{CGI.unescapeHTML(links[i])}>" unless
links[i].nil?
  end
  links = nil
  text
end

您在最初的问题中还提到,您在这一步中遇到了胡言乱语:

email.message *returns mumbo-jumbo*

如果 mumbo-jumbo 是 HTML,您可能可以仅将现有代码与此 html2text 方法一起使用,而不是切换到Net::IMAP正如我在发布原始答案时所讨论的那样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ruby​​-gmail 读取 Gmail 邮件 的相关文章

  • Ruby 中的并行赋值运算符

    我正在查看 Ruby 编程 书中的一个示例 def fib up to max i1 i2 1 1 parallel assignment i1 1 and i2 1 while i1 lt max yield i1 i1 i2 i2 i1
  • Rails 注释分段错误

    有一些问题围绕着这个问题 但没有什么真正能满足我的需求 After I bundle install下面列出了我的 Gemfile 我运行annotate并出现以下错误 Users nickcoelius rvm gems ruby 1 8
  • 预期的 ProductField,出现数组问题

    我有一个 Rails 4 应用程序 它有一个如下所示的 params 块 def store params params require store permit name description user id products attr
  • 如何计算带有偏移量的异或?

    我想用不同的偏移量进行异或计算以在计算中列出 例子 key 0 1 0 text 0 1 0 1 0 1 0 1 1 1 异或计算 key 0 text 0 key 1 text 1 key 2 text 2 key 0 text 3 ke
  • 如何使用本地安装的gems执行Ruby程序?

    我已经使用安装了我的依赖项 bundle package 然后将它们传输到离线服务器并运行 gt bundle install local Using mime types 1 19 Using rest client 1 6 7 Usin
  • Heroku 部署错误

    在 Windows 环境中 尝试部署到 Heroku 时出现以下错误 C Ruby lib ruby gems 1 8 gems heroku 1 9 13 lib heroku commands base rb 32 in 没有这样的文件
  • 使用 attr_accessor 动态创建类属性

    在Ruby中 有没有办法动态地将实例变量添加到类中 例如 class MyClass def initialize create attribute name end def create attribute name attr acces
  • 如何从 ruby​​ 中的字符串中删除所有非数字?

    用户输入数字的形式如下 1 800 432 4567 800 432 4567 800 432 4566 800 432 4567 1 800 432 4567 800 432 4567 我希望所有这些都变成没有特殊字符的剥离版本 例如18
  • REXML - 如何提取单个元素

    我正在用 ruby 编写一些验收测试 其中涉及断言响应 XML 中值的存在 我的 XML 是这样的
  • Rails:named_scope、lambda 和块

    我认为以下两个是等效的 named scope admin lambda company id conditions gt company id company id named scope admin lambda do company
  • rvm gem 安装错误?

    我正在摆弄 ruby gems 和 rvm 它工作得很好 但现在当我尝试安装 gem 时出现错误 gem install Rails错误 同时 执行 gem Errno EACCES 权限被拒绝 Users da rvm gems ruby
  • 已定义方法的 Ruby 钩子?

    我一直在谷歌上搜索这个问题 但找不到答案 这让我认为答案是否定的 但我想我会在这里问 以防有人确切知道 Ruby 是否有一个钩子来定义方法 即在模块或类上 如果没有 是否有人足够熟悉该实施的情况main对象以了解它到底如何将方法复制到Obj
  • Bundle 说 gem 丢失了 - 但事实并非如此?

    背景 我正在维护contentRuby On Rails 站点 但我确实没有 Rails 的经验 当尝试运行 Rails 服务器时 rails s我明白了 在任何来源中均找不到 activesupport 3 2 0 Run bundle
  • Ruby require 'file' 不起作用,但 require './file' 可以。为什么?

    我有一个充满 ruby 文件的文件夹 当我尝试使用位于同一目录中的另一个文件中的一个文件时require file 我得到一个LoadError但是当我使用require file 一切正常 有人可以向我解释为什么会发生这种情况吗 如果有什
  • ruby 正则表达式匹配模式的多次出现

    我正在寻找构建一个 ruby 正则表达式来匹配模式的多次出现并将它们返回到数组中 模式很简单 即 两个左括号 一个或多个字符 后跟两个右括号 这就是我所做的 str Some random text lead first name and
  • Ruby/Rails 集合到集合

    我有两个表与一个连接表连接 这只是伪代码 Library Book LibraryBooks 我需要做的是 如果我有一个图书馆的 id 我想获取该图书馆拥有的所有书籍所在的所有图书馆 因此 如果我有图书馆 1 图书馆 1 中有书籍 A 和
  • 如何使用 net/http 验证 ruby​​ 中的 SSL 证书链

    我如何验证网站的证书 例如https processing ukash com https processing ukash com 在 ruby 中使用 net http https Net HTTP new processing uka
  • 使用rSpec 测试delayed_job 链的最佳方法是什么?

    目前 当我的代码中有一个延迟方法时 如下所示 CommentMailer delay deliver comments comment true 我在规范中写了这样的内容 dj mock DelayProxy CommentMailer s
  • 超类与类SpecificationPolicy不匹配

    我得到了一个superclass mismatch for class SpecificationPolicy尝试安装或升级某些brew 软件包时出错 例如 更新安装 supabase CLI 时 brew install supabase
  • Watir Webdriver 加载 Chrome 扩展

    我正在尝试使用 Watir 加载 chrome 扩展 但遇到了问题 我发现这个相关问题 能够启动带有 watir webdriver 加载扩展的 chrome https stackoverflow com questions 125867

随机推荐

  • 过滤 CollectionViewSource

    我想做一个ComboBox绑定到我的数据 带有filter 为此我创建了一个TextBox and a ComboBox 在后面的代码中 我读取一个文件并生成 Channel 类的对象 这些对象存储为ComboBox 尽管编译器不会抛出任何
  • Javascript 中最快的类/对象访问/实例化是什么

    在探索构建类的几种不同方法时 我很好奇实例化和访问类的最快方法是什么 基于另一个问题的输入 Javascript 作用域和 self this this this that this https stackoverflow com ques
  • 克隆 git 存储库并保留无法访问的提交

    有没有办法克隆远程 git 存储库 同时保留该存储库中可能存在的任何无法访问的提交 场景是这样的 我需要恢复从我维护的服务器上的裸 git 存储库中删除的分支 我有这个分支的最后一次提交的哈希值 但是常规的 git 命令似乎无法在裸存储库上
  • 实体框架数据上下文与数据库不同步?

    所以 情况是这样的 我调用 AddtoObject 在数据库中插入一个项目 然后调用 SaveChanges 然后 我调用存储过程来更新当前插入的记录 然后 我再次调用 Save Changes 当我查询数据库时它具有正确的更新值 但是实体
  • 使用 EGIT 获取时存储凭据失败

    最初我遇到了与中描述的相同的问题egit 未授权 https stackoverflow com questions 14259265 egit not authorized 首先 我成功从 Bitbucket 克隆了存储库 然后 我尝试获
  • 是否可以在 ScrollView 中添加 ViewPager?

    我正在尝试使用ViewPager里面的一个ScrollView 但是ViewPager没有出现 如果我删除ScrollView the ViewPager看起来不错 我创建了一个简单的测试项目 内容如下 main xml布局
  • 将引用类型和值类型作为参数传递给方法之间的区别

    一整天都在我的脑海中萦绕着这种困惑 我对传递给方法的引用类型和值类型感到非常困惑 假设我有 2 节课Class A and Class B分别对应于引用类型和值类型 public Class A public static void mai
  • 通过 websocket 的 SIP 到真正的 SIP

    我正在尝试实现一个 sip 服务器用于从HTMLsip客户端 使用sipml5制作 在我研究这样做的过程中 我遇到了 sip over web sockets 这可能对我有用 但是 我不确定用户代理是否通过 sip over 连接web s
  • 从 FlinkML 多元线性回归中提取权重

    我正在运行 Flink 0 10 SNAPSHOT 的示例多元线性回归 我不知道如何提取权重 例如斜率和截距 beta0 beta1 无论你想怎么称呼它们 我对 Scala 不太熟悉 这可能是我问题的一半 感谢任何人可以提供的任何帮助 ob
  • NSView 中的多线程绘制

    在我的代码中 我子类化了NSView并在其drawRect方法中 我生成三个线程来执行绘图 void drawRect NSRect dirtyRect self window setAllowsConcurrentViewDrawing
  • Firefox 上的 Javascript 浏览器抖动

    是否可以使用Javascript来撼动Firefox浏览器 我找到了一个适用于 Safari 的脚本 但该脚本似乎不适用于 Firefox http www jhuskisson com javascript earthquake effe
  • R ifelse 语句

    我对 R 还很陌生 我有以下由字符组成的数据集 数据框 Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y N N Y Y Y Y Y Y Y Y N Y Y Y Y Y Y
  • 错误:请求对象已被使用

    我不断在控制台日志中收到此错误 未捕获 承诺中 类型错误 无法在 ServiceWorkerGlobalScope 上执行 获取 无法使用已使用的请求对象构造请求 我尝试更改我的 Service Worker 但不起作用 self addE
  • Facebook 在分享我自己的页面时未检测到视频

    我有一个包含许多视频页面的网站 每页只有一个视频 当我在 Facebook 上分享其中一个页面的链接时 它不被视为视频 而只是一篇标准文章 缩略图 标题和描述都显示良好 但我希望 Facebook 显示视频 而不是显示缩略图 我在用着vid
  • 如何从 xcode 显示 xcodebuild 命令行?

    我正在尝试从 xcodebuild 构建一个工作模拟器版本 编译可以工作 但通过 WaxSim 安装时 最终产品将无法在模拟器上运行 如果我通过 Xcode GUI 构建 那么最终产品安装时不会出现 WaxSim 的问题 我的问题是 我怎样
  • Qt 检测标题栏上的鼠标单击(Windows)

    event 或 mousePressEvent 函数适用于小部件内部 但我想在单击标题栏 菜单栏的上部 包含关闭按钮等 时捕获 我怎样才能做到这一点 您可以重写nativeEvent 然后获取鼠标位置与geometry 不包括窗口框架 和f
  • 组名称变量在天蓝色管道中可以是动态的吗?

    我在 azure 上有两个环境 它们之间的区别之一只是来自变量组的环境变量 是否可以为一个管道动态设置组名称 而不是设置两个可以映射自己的组变量的管道 这是我的构建管道的示例 trigger master develop jobs job
  • jquery 无法在 Rails 中运行

    我已经阅读了很多关于在 Rails 中使用 jquery 的页面 但似乎仍然无法让它工作 我有 jquery rails gem 并且安装了 我在 application js 文件中有 require 语句 这是我一直运行的测试页面
  • Commission Junction 直接链接

    有谁知道是否有办法通过跟踪直接链接到 Commission Junction 上的广告商 我们不想依赖提要中发送的链接 因为其中很多都是垃圾链接 我想要的是一个仅转到广告商主页并且仍然允许我们接收佣金的链接 就像是 如果它必须通过 CJ 的
  • 使用 ruby​​-gmail 读取 Gmail 邮件

    我正在寻找一个实例方法ruby gmailgem 可以让我阅读 身体 或者 subject Gmail 邮件的 查看文档后发现here http www rubydoc info gems ruby gmail 0 3 1 我什么也没找到