byte[] response = new byte[1000];
out.println("HELO" + "\r\n");
out.flush();
// Ответ должен придти
in.read(response);
SMPT - как с ним работать
... отправляю на почтовый сервер простые запросы а он молчит... если кто знает выложите основные концепции работы с почтой и если возможно фрагменты кода...
... само описание протокола есть у меня но что делать с ним дальше... не знаю...
... заранее благодарен
если у вас есть док по протоколу смтп. покажите ссылку на ресурс пожалуйста.
Вы уверены, что подключение УСПЕШНО?
Стукните Телнетом скажем на smtp.mail.ru:2525, сразу после подключения должен бы придти первый ответ сервера - приветствие, подумайте, что сделано не так.
З.Ы. на POP3 легче тренироваться :) Получить почту, получить листинг и.т.д. Да и с авторизацией там попроще, нет необходимости декодировать в base64, если это конечно станет проблемой.
2 Amstell
Вообще-то в идеале не док, а RFC, номер... забыл какой-то там...
А, вот кажется:
http://www.faqs.org/rfcs/rfc821.html
http://www.faqs.org/rfcs/rfc2821.html
Если документация на буржуйском недоступна, поищите переведенные, либо для начала первая ссылка из Яндекса по основным командам СМТП в помощь - http://www.aboutmail.ru/articles/rfc/smtp_3.html
protected void handleConnection(Socket client){
try {
PrintWriter out = SocketUtil.getWriter(client);
// SocketUtil -вспомогательный класс где создаються потоки
InputStream in = client.getInputStream();
byte[] response = new byte[1000];
out.println("HELO");
//После этой команды тишина... ответа от срвера не приходит...
in.read(response);
out.println("EXPN sex");
int numBytes = in.read(response);
System.out.write(response,0,numBytes);
out.println("QUIT");
client.close();
}
catch (IOException ex) {
}
Цитата: sith
Вот фрагмент кода метод который вызываеться после открытия соединения
...
byte[] response = new byte[1000];
out.println("HELO");
//После этой команды тишина... ответа от срвера не приходит...
in.read(response);
...
...
byte[] response = new byte[1000];
out.println("HELO");
//После этой команды тишина... ответа от срвера не приходит...
in.read(response);
...
Попробуй после
out.println("HELO");
добавить
out.flush();
То что ты записал еще не факт что что-то отправилось, у меня при роботе с сокетами обычно все отправляется после флуша либо когда заполнен буффер, поэтому лучше его вызвать принудительно.... надеюсь поможет
все равно не хочет... просто матроская тишина...есть какието методы которые позволяют производить мониторинг подключения... или как сделать такой код что бы можно было смотреть... мол подключился или нет... как идет обмен данными...
Хитрость в том, что надо посылать еще символы 16 и 13 - возврат каретки и перевод строки :)
Пробуй так:
Код:
P.S. сейчас уже точно не помню последовательность символов: или \r\n или \n\r. Одна из них работает.
увы но опять мимо, тишина как в гробу...
... проблема состояла в том что основные смтп сервера которыми я пытался пользоваться сиьно навороченные... только я обратился к серверу своего провайдера сразу все полетело как по маслу...
... единственное что еще бы я хотел узнать в этой тебе это...
... как в смтп протокле проходить авторизацию
... как разделять в письме отдельно заголовок... отдельно подпись и текст самого письма... и можно ли с помощью смтп загружать к письму файлы...
Авторизацию?
Возьмем mail.ru (smtp.mail.ru:2525)
HELO/EHLO (любвоь-морковь, тут и так все ясно), далее
AUTH LOGIN [your_login]
логин отсылается в base64
сервер ответит с виду абра-кадаброй, но на самом деле это уже кодированная в base64 строка, гласящая что-то вроде "введите пароль" (если конечно логин принят, т.е. это корректные base64 данные), отсылаем пароль, также в base64. Если все ОК, авторизация успешна, если нет, возможно "invalid base64 data" или ещё чего.
Как кодировать в base64? Сам хотел бы знать, чтобы ручками все не делать :) Встроенных ф-й в Джава для этого вроде нет, хотя где-то в сети видел соотв. класс.
через тел нет не получаеться отправить логид... говорит что "invalid base64 data" ... что делать..?
Телнет - не господь бог, на него действуют те же законы, что и на создаваемое тобой приложение, а в данном случае - ЛОГИН И ПАРОЛЬ ДОЛЖНЫ БЫТЬ КОРРЕКТНЫМИ base64 ДАННЫМИ ;)
Дерзай.
Можешь перекинуть ПХПшной base64_encode(string str); свой логин в подобающий вид и пробовать дальше.
Повторюсь - без понятия, как (де)кодировать средствами Java.
А как (де)кодировать средствами Java в соседнем топике про pop3 ;)
незнаете какие команды нужно использовать что бы отделить заголовок письма от текста... и можно ли прикреплять файлы и как...???
ПХП фрагмент:
$headers = "MIME-Version: 1.0\r\n";
$headers.= "Content-type: text/html; charset=Windows-1251\r\n";
$headers.= "Subject: Hello world...\r\n";
$headers.= "\r\n";
при дальнейшем добавлении строки пойдет уже собственно ТЕКСТ сообщения.
Кстати, если ты внимательно читал спецификацию, то наверняка заметил, закончить письмо (в случае ручного ввода по Телнету это буде именно сигнал об окончании ввода) необходимо ТОЧКОЙ на отдельной строке, т.е. что-то вроде:
"\r\n.\r\n"
спасибо... с заголовком я уже разобрался... внимательно прочитал...
Цитата: InterWen
Говорил же, по Телнету пробивай для начала
Как кодировать в base64? Сам хотел бы знать, чтобы ручками все не делать :) Встроенных ф-й в Джава для этого вроде нет, хотя где-то в сети видел соотв. класс.
Как кодировать в base64? Сам хотел бы знать, чтобы ручками все не делать :) Встроенных ф-й в Джава для этого вроде нет, хотя где-то в сети видел соотв. класс.
вечный вопрос.. как же кодировать в base64!!!
уря пхпшная ф-ция помогла=) спасибо.
Amstell а можно мне как не грамотному разтолковать про эти пхпшные функции... фрагмент кода если можно.. .как пользоваться...
String passwd = "passwd"
String input = username + ":" + passwd;
String encoding = new sun.misc.BASE64Encoder().encode(input.getBytes());
connection.setRequestProperty("Authorization","Basic " + encoding);
connection.connect();