الحصول على "أن قضية STARTTLS الأمر الأول" عند محاولة إرسال البريد الإلكتروني
-
08-07-2019 - |
سؤال
أتلقى رسالة خطأ أثناء محاولة استخدام action_mailer_tls
المساعد للتواصل مع Gmail في القضبان التطبيق:
Must issue a STARTTLS command first
والبعض الآخر يبدو لي أن واجهت نفس هذه المشكلة:
المشكلة هي أن جوجل يتطلب TLS المصادقة ولكن المعيار روبي net/smtp المكتبة لا تدعم TLS.
المادة توصي باتباع هذه الخطوات التي فعلت:
بالطبع هناك ما هو مفيد المساعد تم إنشاؤها من قبل مارك تشونغ للتغلب على هذه الحاجز.يمكنك أن تجد هنا ، يدويا إضافة إلى المشروع الخاص بك أو كنت يمكن تصديره إلى البرنامج المساعد الخاص بك الدليل.
$ cd vendor/plugins
$ svn export http://code.openrain.com/rails/action_mailer_tls/
وفي كلتا الحالتين تأكد تتطلب 'smtp_tls'
الآن كل ما عليك هو تحديث smtp_settings إذا كنت لم تكن قد فعلت ذلك بالفعل.
- ActionMailer::قاعدة.smtp_settings = {
- :عنوان => "smtp.gmail.com",
- :port => 587,
- :المجال => "domain.com",
- :user_name => "user@domain.com",
- :كلمة المرور => "كلمة السر" ،
- :المصادقة => :عادي
- }
أي اقتراحات الحل الأفضل التحدث إلى 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 الحل أرسلت بواسطة التزلج فوق (كبيرة شكرا لكم).أي التعليقات على لماذا ؟ من شأنها أن تكون كبيرة ولكن أنا سعيد فقط يعمل.