【问题标题】:postfix pipe mail to ruby script: 'require GEM_NAME' does not load gems后缀管道邮件到 ruby​​ 脚本:“需要 GEM_NAME”不加载宝石
【发布时间】:2020-11-01 22:08:23
【问题描述】:

我正在尝试设置后缀,将收到的邮件通过管道传输到 ruby​​ 脚本。我创建了一个用户deploy,它从postfix/master.cf 运行脚本文件。当邮件收到 postfix 调用并执行 ruby​​ 脚本但 require 'resque' 不会在该脚本中加载 resque gem。 这是来自/var/log/mail.log 的错误日志。

Jul 12 15:45:42 ubuntu-s-1vcpu-1gb-sfo2-01 postfix/pipe[3652]: 94ECE82A15: to=<deploy@mailet.in>, relay=myservice, delay=0.15, delays=0.05/0/0/0.1, dsn=5.3.0, status=bounced (Command died with status 1: 
"/var/www/mail_getter/email_receiver.rb". Command output: /home/deploy/.rvm/rubies/ruby-2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/core_ext/kernel_require.rb:54:in
 `require':cannot load such file -- resque (LoadError)  from /home/deploy/.rvm/rubies/ruby-2.5.1/lib/ruby/site_ruby/2.5.0/rubygems/core_ext/kernel_require.rb:54:in `require' 
 from /var/www/mail_getter/email_receiver.rb:4:in `<main>' email receiver...... )

/etc/postfix/master.cf:

myservice       unix  -         n       n       -       2       pipe   flags=XhqFBR user=deploy:deploy argv=/var/www/mail_getter/email_receiver.rb

这里是/var/www/mail_getter/email_receiver.rb

#!/home/deploy/.rvm/rubies/ruby-2.5.1/bin/ruby
puts 'email receiver......'
require 'rubygems'
require 'resque'
require 'redis'

class EmailReceive
  @queue = :incoming_email_queue

  def initialize(content)
    Resque.enqueue(EmailReceive, content)
  end
end
EmailReceive.new($stdin.read)

注意:我也尝试过使用#!/usr/bin/env ruby

这里是/etc/postfix/aliases

myservice:      deploy

这里是/etc/postfix/main.cf

myhostname = mail.mailet.in
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydomain = mailet.in
mydestination = $myhostname, $mydomain, ubuntu-s-1vcpu-1gb-sfo2-01, localhost.localdomain, localhost
relayhost = 
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all

header_checks = regexp:/etc/postfix/header_checks

这里是/etc/postfix/header_checks

/To:.*@mailet.in.*/ FILTER myservice:

这是rvm list 的输出:

 =* ruby-2.5.1 [ x86_64 ]
   ruby-2.7.0 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

注意:我也尝试过要求绝对路径中的宝石。

【问题讨论】:

  • 我会更改电子邮件脚本以将一些信息转储到控制台以确认它以用户 deploy 而不是您的 Postfix 用户身份运行,然后确认其 $PATH 设置正确,然后确认其gem environment 设置正确。
  • 我检查了它,发现用户是deploy,gem 路径是/.gem/ruby/2.5.0 /home/deploy/.rvm/rubies/ruby-2.5.1/lib/ruby/gems/2.5.0。此外,我在 gem 路径中解压了需要的 gem
  • RVM 并不是像这样为生产代码管理 Ruby 的最佳方式,通常我所看到的是系统安装或手动编译的东西。 RVM 面向交互式用户,而不是无头系统用户。您可以在此处阅读更多内容:stackoverflow.com/q/5905704/3784008(但这是相当旧的信息)我的建议是使用 Ruby 的系统版本,或者如果您的系统没有正确的版本,请自行编译。

标签: ruby-on-rails ruby ubuntu postfix-mta


【解决方案1】:

我通过使用来自wrappers 目录的红宝石解决了这个问题,同时从后缀调用脚本。

/etc/postfix/master.cf 的有效配置:

 myservice unix    -       n       n       -       2       pipe
  flags=XhqFBR user=deploy argv=/home/deploy/.rvm/wrappers/ruby-2.5.1/ruby /var/www/mail_getter/email_receiver.rb

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多