2010-04-03 3 views
1

Я пытаюсь отправить простую электронную почту через Ruby (без рельсов) на OS X, с XCode (который устанавливает Ruby.) Но у меня проблема с моим smtp-сервером, который требует по электронной почте клиент для проверки почты перед отправкой в ​​качестве формы проверки подлинности.Ruby отправить почту с smtp

Как я могу получить Ruby для аутентификации с SMTP-сервером в режиме «POP», прежде чем я могу отправить почту? Не загружать почту; Я только хочу отправить html-форматированную электронную почту (в конечном счете через Applescript, вызывая Ruby, потому что Applescript не поддерживает smtp), но сервер требует, чтобы я проверял почту до отправки.

Редактировать 4/05/10:

Ну, это неловко. Оказалось, что это проще; Я пытался сделать его более сложным, чем нужно. Даже если мой почтовый сервер требует POP перед SMTP, это посылает OK:

require 'net/smtp' 

message = <<MESSAGE_END 
    From: Private Person <[email protected]> 
    To: A Test User <[email protected]> 
    Subject: SMTP e-mail test 

    This is a test e-mail message. 
    MESSAGE_END 

Net::SMTP.start('mail.mydomain.com', 25) do |smtp| 
smtp.send_message message, 
      '[email protected]', 
      '[email protected]' 
end 

Редактировать 4/04/10:

С этим я получаю неопознанная ошибка команды 500; тем не менее, поп-сервер отвечает.

require 'net/smtp' 
require 'net/pop' 

message = <<MESSAGE_END 
From: Private Person <[email protected]> 
To: A Test User <[email protected]> 
Subject: SMTP e-mail test 

This is a test e-mail message. 
MESSAGE_END 

Net::POP3.start('mail.mydomain.com', 110, '[email protected]', 'password') do |pop| 

// If this line is included, 
// I get a printout of the number 
// of emails on the server 
// right before the error: 
// 
// puts pop.n_mails end 

Net::SMTP.start('mail.markratledge.com', 
       25, 
       'localhost', 
       '[email protected]', 'password', :plain) do |smtp| 
    smtp.send_message message, '[email protected]mydomain.com', 
          '[email protected]' 
end 
end 
+0

Зачем вам нужен поп-чек, если pop на сервере smtp недоступен? –

+0

Моя ошибка; Я хотел сказать, что это безопасный поп .... – markratledge

+0

Я подозреваю, что причина ошибки 500 при выполнении 'pop.finish' заключается в том, что если вы передадите блок в' POP3.start', как вы делаете выше, то соединение будет автоматически закрывается для вас в конце блока, поэтому, добавив 'pop.close', вы пытаетесь закрыть соединение дважды. – mikej

ответ

2

POP before SMTP не один из типов аутентификации, поддерживаемых Net::SMTP, так что я думаю, что вы будете иметь, чтобы использовать Net::POP3 сделать свой логин POP3, например,

require 'net/pop' 
pop = Net::POP3.start(addr, port, account, password) 
pop.finish 

Net::POP3 находится в стандартной библиотеке, так должны быть доступны в любом месте, что Net::SMTP есть.

+0

Подойдя ближе. С кодом выше я получаю код ответа 200, который поп-сервер готов. (Очевидно, я просто изучаю Ruby ...) – markratledge

+0

«start» должен подключиться к серверу и войти в систему. Попробуйте вставить «puts pop.n_mails» после 'POP3.start' - это должно печатать количество сообщения в почтовом ящике в качестве диагностического устройства, которое вы определенно говорите с сервером POP. Также попробуйте выполнить 'pop.finish' перед тем, как создать SMTP-соединение. Что происходит сейчас, если вы на самом деле пытаетесь ** отправить ** сообщение через SMTP? – mikej

+0

Не повезло с путешествием pop.finish; еще 500 ошибок. И по-прежнему не удается отправить через SMTP без предварительной проверки на электронную почту. Но я могу войти на поп-сервер с надписью кода выше. – markratledge

1

Если это не делает ваш сервер счастливым, тогда Net :: Telnet позволит вам отправлять исходные команды самостоятельно.

+0

У меня нет telnet-доступа к моему серверу; только ssh. – markratledge

+0

Если вы открываете соединение telnet с соответствующими номерами портов (110 для POP и 25 для SMTP), вы можете отправлять необработанные команды. – mikej

+0

Я снова проверил, и вы оба правы; У меня есть доступ к telent. Я думал, из прошлого telnet был отключен на этом общем хосте. В конце концов, скрипт Ruby будет вызван из Applescript, чтобы отправить html-форматированный адрес электронной почты, поэтому telnet удобен для проверки поп-сервера, но может ли telnet получить html-форматированную электронную почту? – markratledge

Смежные вопросы