Rails 3 - Devise / ActionMailer / RUBY-SMTP, вызывающий ошибку сегментации - PullRequest
0 голосов
/ 27 января 2012

ОК - я здесь над головой. Я использую:

  - ruby-1.9.3-p0
  - rails-3.1.3
  - mail-2.3.0
  - devise-1.5.3

Попытка включить опцию Devise :confirmable и запустить службы smtp в моем приложении. Как только я добавляю /config/initializers/setup_mail.rb, добавляю необходимые столбцы Devise в мою БД и атрибут :confirmable к моей User модели, я получаю ошибку сегментации. Это происходит сразу после регистрации пользователя. Devise пытается отправить электронное письмо с подтверждением, что приводит к аварийному завершению работы библиотеки ruby ​​smtp:

... lib/ruby/1.9.1/net/smtp.rb:583: [BUG] Segmentation fault

Последняя запись в log/development.log:

Rendered devise/mailer/confirmation_instructions.html.erb (1.2ms)

Мой /config/initializers/setup_mail.rb файл:

ActionMailer::Base.smtp_settings = {
  :address              => "smtp.gmail.com",
  :port                 => 587,
  :domain               => "mydomain.com",
  :user_name            => "support@mydomain.com",
  :password             => "???????",
  :authentication       => "plain",
  :enable_starttls_auto => true
}
ActionMailer::Base.default_url_options[:host] = "localhost:3000"

Мой config/environments/development.rb файл имеет следующее:

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.default_url_options = { :host => 'localhost:3000' }

Вот немецкий код из ruby ​​/ 1.9.1 / net / smtp.rb (строка 583 находится ближе к середине):

def ssl_socket(socket, context)
  OpenSSL::SSL::SSLSocket.new socket, context
end

def tlsconnect(s)
  verified = false
  s = ssl_socket(s, @ssl_context)
  logging "TLS connection started"
  s.sync_close = true
  s.connect  # THIS IS LINE 583
  if @ssl_context.verify_mode != OpenSSL::SSL::VERIFY_NONE
    s.post_connection_check(@address)
  end
  verified = true
  s
ensure
  s.close unless verified
end

Похоже, что ошибка сегментации возникает, когда smtp пытается подключиться через сокет-соединение SSL (s.connect). В setup_mail.rb я пытался установить :enable_starttls_auto на true и false. Я не получаю ошибку сегментации, когда она установлена ​​на false, но электронная почта не отправляется, так что это бесполезно.

Я легко могу подключиться к службе SMTP в Gmail, выполнив эту команду с моего Mac:

$ telnet smtp.gmail.com 587

Не знаете, куда идти отсюда - есть предложения?

Ответы [ 2 ]

1 голос
/ 17 января 2013

Проблема в том, как Rails взаимодействует с OpenSSL.Этот пост подводит итог очень хорошо.http://www.22ideastreet.com/debug/smtp-rb14-bug-segmentation-fault/

Исправление заключается в добавлении этого в ваш .bashrc / .zshrc / .bash_profile

export RUBYOPT="-ropenssl" 
1 голос
/ 23 апреля 2012

У меня была очень похожая ошибка (в net / http).

Это исправлено:

rvm pkg install openssl
rvm pkg install iconv
rvm pkg install readline
rvm reinstall 1.9.3  --with-iconv-dir=$rvm_path/usr  --with-openssl-dir=$rvm_path/usr  --with-readline-dir=$rvm_path/usr
...