الحصول على "أن قضية STARTTLS الأمر الأول" عند محاولة إرسال البريد الإلكتروني

StackOverflow https://stackoverflow.com/questions/1641354

  •  08-07-2019
  •  | 
  •  

سؤال

أتلقى رسالة خطأ أثناء محاولة استخدام action_mailer_tls المساعد للتواصل مع Gmail في القضبان التطبيق:

Must issue a STARTTLS command first

والبعض الآخر يبدو لي أن واجهت نفس هذه المشكلة:

المشكلة هي أن جوجل يتطلب TLS المصادقة ولكن المعيار روبي net/smtp المكتبة لا تدعم TLS.

المادة توصي باتباع هذه الخطوات التي فعلت:

بالطبع هناك ما هو مفيد المساعد تم إنشاؤها من قبل مارك تشونغ للتغلب على هذه الحاجز.يمكنك أن تجد هنا ، يدويا إضافة إلى المشروع الخاص بك أو كنت يمكن تصديره إلى البرنامج المساعد الخاص بك الدليل.

  1. $ cd vendor/plugins
  2. $ svn export http://code.openrain.com/rails/action_mailer_tls/

وفي كلتا الحالتين تأكد تتطلب 'smtp_tls'

الآن كل ما عليك هو تحديث smtp_settings إذا كنت لم تكن قد فعلت ذلك بالفعل.

  1. ActionMailer::قاعدة.smtp_settings = {
  2. :عنوان => "smtp.gmail.com",
  3. :port => 587,
  4. :المجال => "domain.com",
  5. :user_name => "user@domain.com",
  6. :كلمة المرور => "كلمة السر" ،
  7. :المصادقة => :عادي
  8. }

أي اقتراحات الحل الأفضل التحدث إلى Gmail سيكون موضع تقدير.

هل كانت مفيدة؟

المحلول

اعتدت الكسندر Pomozov حل التحدث إلى Gmail من القضبان التطبيق.أعتقد أن المادة الأصلية ذهب ولكن شخص ما قد استنسخ جوجل ذاكرة التخزين المؤقت هنا.

lib/smtp_tls.rb

require "openssl"
require "net/smtp"

Net::SMTP.class_eval do
  private
  def do_start(helodomain, user, secret, authtype)
    raise IOError, 'SMTP session already started' if @started
    check_auth_args user, secret, authtype if user or secret

    sock = timeout(@open_timeout) { TCPSocket.open(@address, @port) }
    @socket = Net::InternetMessageIO.new(sock)
    @socket.read_timeout = 60 #@read_timeout
    #@socket.debug_output = STDERR #@debug_output

    check_response(critical { recv_response() })
    do_helo(helodomain)

    if starttls
      raise 'openssl library not installed' unless defined?(OpenSSL)
      ssl = OpenSSL::SSL::SSLSocket.new(sock)
      ssl.sync_close = true
      ssl.connect
      @socket = Net::InternetMessageIO.new(ssl)
      @socket.read_timeout = 60 #@read_timeout
      #@socket.debug_output = STDERR #@debug_output
      do_helo(helodomain)
    end

    authenticate user, secret, authtype if user
    @started = true
  ensure
    unless @started
      # authentication failed, cancel connection.
      @socket.close if not @started and @socket and not @socket.closed?
      @socket = nil
    end
  end

  def do_helo(helodomain)
    begin
      if @esmtp
        ehlo helodomain
      else
        helo helodomain
      end
    rescue Net::ProtocolError
      if @esmtp
        @esmtp = false
        @error_occured = false
        retry
      end
      raise
    end
  end

  def starttls
    getok('STARTTLS') rescue return false
    return true
  end

  def quit
    begin
      getok('QUIT')
    rescue EOFError, OpenSSL::SSL::SSLError
    end
  end
end

config/البيئة.rb

(إضافة بعد كل شيء آخر)

    require “smtp_tls”

    ActionMailer::Base.smtp_settings = {
    :address => “smtp.gmail.com”,
    :port => 587,
    :authentication => :plain,
    :user_name => “someone@openrain.com”,
    :password => ’someonesPassword’
    } 

استخدام ActionMailer كالمعتاد.

نصائح أخرى

مع روبي 1.8.7 والقضبان 2.3.4 (على الرغم من أنه كان هناك منذ عدة إصدارات) لقد كان النجاح من دون الحاجة إلى TLS محددة ActionMailer الإضافات باستخدام :enable_starttls_auto خيار.عينة التكوين (من إنتاج البيئة) يبدو مثل هذا:

ActionMailer::Base.smtp_settings = {
  :enable_starttls_auto => true,
  :address => "smtp.gmail.com",
  :port => 587,
  :domain => "domain.com",
  :authentication => :plain,
  :user_name => "username@domain",
  :password => "secret"
}

لقد مكنت starttls باستخدام :enable_starttls_auto => true ولكن لا يزال حصلت على نفس الخطأ.لقد تمكنت أخيرا من حل لها دون إجراء تغيير واحد في التعليمات البرمجية.إذا كنت تستخدم smtp.gmail.com لإرسال البريد, يجب عليك أولا تسمح أقل أمنا تطبيقات استخدام البريد الإلكتروني الخاص بك لإرسال الرسائل.من أجل ذلك تسجيل الدخول باستخدام حسابك الذي تريد إرسال البريد والذهاب إلى هذا الرابط و بدوره على الوصول إلى التطبيقات الأقل أمانا.
تحرير:إذا كنت لا يسمح بتغيير الإعدادات على أقل أمنا تطبيقات, ثم يجب عليك الاتصال المشرف صاحب الحساب هذا المجال لتغيير الإعدادات للسماح للمستخدمين أقل أمنا التطبيقات.
إذا كان لديك حقوق المسؤول يمكنك السماح للمستخدمين بتغيير أقل أمنا إعدادات التطبيق يمكنك تغييره من https://admin.google.com/domainname.com/AdminHome#ServiceSettings/notab=1&service=securitysetting&subtab=lesssecureappsaccess
PS:لا تنسى أن تغيير domainname في الرابط أعلاه.

نأمل أن يكون هذا heps!!

أنا على التوالي القضبان 2.3.4 و على الرغم من أنني أعتقد (من غوغلينغ حول) لم يتطلب أي الإضافات المطلوبة فقط الخط

:enable_starttls_auto => صحيح ،

في الواقع أنا فقط حصلت على هذا العمل عندما تستخدم الكسندر Pomozov الحل أرسلت بواسطة التزلج فوق (كبيرة شكرا لكم).أي التعليقات على لماذا ؟ من شأنها أن تكون كبيرة ولكن أنا سعيد فقط يعمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top