2009-07-26 19 views
22

Có ai có bất kỳ thông tin nào về chất lượng (và cập nhật) liên quan đến việc gửi thư qua Gmail bằng cách sử dụng Net :: SMTP của Ruby không? Tôi đã nhìn thấy một số ví dụ - hầu hết có niên đại từ năm 2007 đến giữa năm 2008 và không ai trong số họ làm việc cho tôi. Tôi cần thêm các ví dụ hiện tại sử dụng bản phát hành 1.8.7 gần đây nhất. Tôi cũng đánh giá cao nếu tài liệu không chỉ bao gồm các ví dụ đơn giản mà không ai thực sự sử dụng.(Ruby) Bắt Net :: SMTP làm việc với Gmail ...?

Hiện nay tôi đang nhận một lỗi:

SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: unknown protocol 

Tôi không khủng khiếp quen thuộc với SSL liên quan đến giao thức SMTP, vì vậy đây là tất cả mất vào tôi. Thật không may Net :: SMTP tài liệu chỉ bao gồm các cơ sở và không cung cấp một danh sách đầy đủ các tiềm năng khác nhau OpenSSL :: SSL bối cảnh hoặc vì vậy tôi không thể thử những người khác nhau.

Dù sao, nếu có ai có bất kỳ thông tin chất lượng nào về việc làm việc này với Gmail, nó sẽ được đánh giá cao nhất.

Tốt nhất.

Trả lời

10

Tôi thực sự chỉ có làm việc này. Đã viết một kịch bản nhanh để kiểm tra nó.

Tôi đã nhận được một lỗi khác nhau hơn bạn được (đòi hỏi STARTTLS), tôi cũng thấy tôi đã phải sử dụng cổng 587 thay vì 465.

tôi thấy các trick để làm cho nó làm việc trong một plugin Rails Tôi tìm thấy. (Agilewebdevelopment.com/plugins/net_smtp_tls_support)

nếu bạn eval 'tập tin này (nó sẽ thêm tls hỗ trợ cho Net chuẩn :: thư viện SMTP):

http://happiness-is-slavery.net/wp-content/rails-plugins/smtp_add_tls_support/lib/smtp_add_tls_support.rb

sau đó chạy 'Net :: SMTP. enable_tls() '

mọi thứ có vẻ hoạt động tốt.

Dưới đây là mã của tôi:

require 'rubygems' 
require 'net/smtp' 

eval File.read("smtp_tls.rb") 
Net::SMTP.enable_tls() 
FROM_EMAIL = "REMOVED" 
PASSWORD = "REMOVED" 
TO_EMAIL = "REMOVED" 

msgstr = <<END_OF_MESSAGE 
From: Your Name <#{FROM_EMAIL}> 
To: my phone <#{TO_EMAIL}> 
Subject: text message 
Date: Sat, 23 Jun 2001 16:26:43 +0900 
Message-Id: <[email protected]> 

This is a test message. 
END_OF_MESSAGE 

Net::SMTP.start('smtp.gmail.com', 587, 'gmail.com', 
         FROM_EMAIL, PASSWORD, :plain) do |smtp| 
    smtp.send_message msgstr, FROM_EMAIL, TO_EMAIL 

end 

rõ ràng, tôi tải về các tập tin nói trên vào cùng thư mục và đặt tên nó là 'smtp_tls.rb'

Hope this helps!

+0

có vẻ như có đá quý smtp_tls có thể hoạt động quá ... – Jerceratops

+0

URL "Tệp được đề cập ở trên" bị hỏng. Bất kỳ ý tưởng mà nó đi đến? Hey! Tìm thấy nó: https://github.com/andreashappe/smtp_add_tls_support – JDS

2

Bạn có đang kết nối với cổng smtp.gmail.com 465 tôi giả định không? .

openssl s_client -connect smtp.gmail.com:587 

LIÊN QUAN (00.000.003) 8298: lỗi: 140770FC: SSL thói quen: SSL23_GET_SERVER_HELLO: unknown giao thức: s23_clnt.c: 601:

Các lỗi trông rất giống như của bạn. Lệnh sau không hoạt động:

openssl s_client -starttls smtp -connect smtp.gmail.com:587 

Vì vậy, tôi nghĩ điều gì đang xảy ra là bạn chưa bật hỗ trợ STARTTLS. Tôi không chắc chắn làm thế nào để làm điều đó trong ruby ​​mua những gì tôi đã tìm ra là plugin action_mailer_tls cho phép điều này bằng cách vá Net :: SMTP. Kể từ Ruby 1.8.7, Net :: SMTP có hỗ trợ này được tích hợp sẵn.

Nếu bạn đang sử dụng Ruby < 1.8.7 here là bản vá.

+0

Thực ra Gmail dường như là một con quái vật kỳ quặc. Cổng 465 hoạt động tốt, nhưng cần phải làm việc trên cổng 587 * và * sử dụng STARTTLS gây ra vấn đề. Sau đó là sự kết hợp tôi cần phải làm việc. Bất kỳ ý tưởng? –

+0

Vì vậy, bạn đang nói rằng SSL/STARTTLS thậm chí không thể trên 587? –

+0

Tôi đã chỉnh sửa bài đăng của mình. Lệnh STARTTLS sau HELO mà không có SSL để yêu cầu máy chủ bắt đầu có vẻ như đang hoạt động. Tôi không chắc chắn. –

46

Trên thực tế những tác phẩm dưới đây để biết gmail mà không cần plugin hoặc một viên ngọc, ít nhất là với Ruby 1.9.1p376, nhưng may mắn tài liệu thấy rằng sẽ cho bạn biết vậy:

require 'net/smtp' 

    msg = "Subject: Hi There!\n\nThis works, and this part is in the body." 
    smtp = Net::SMTP.new 'smtp.gmail.com', 587 
    smtp.enable_starttls 
    smtp.start(YourDomain, YourAccountName, YourPassword, :login) do 
     smtp.send_message(msg, FromAddress, ToAddress) 
    end 

YourAccountName trông giống như 'bạn @ domain.com '& YourDomain có thể là bất cứ thứ gì bạn thích, nhưng tôi sử dụng tên miền thực.

+0

Nó hoạt động rất tốt, cảm ơn rất nhiều ... – jasoares

+1

Ôi trời ơi, cảm ơn. Các tài liệu về điều này là khủng khiếp. Nice ví dụ! :) –

+0

tôi đang nhận được lỗi "stack level too deep" với điều này. email đầu tiên được gửi đi "ok", sau đó khi cố gắng gửi một email khác, tôi đã nhận được lỗi đó. Điều gì có thể là vấn đề? cảm ơn. –

1

Bạn cũng cần phải có hai ký tự dòng mới giữa chủ thể và phần thân của thư. Nếu không, chỉ chủ đề sẽ được truyền và nội dung thư sẽ được để trống.

msg = "Subject: My Subject Goes Here\n\nMy message goes here"