Прошу, у кого есть возможность, проверить код на своей дуине...
- Войдите на сайт для отправки комментариев
Втр, 12/02/2013 - 15:45
#include <Dhcp.h> #include <Dns.h> #include <Ethernet.h> #include <EthernetClient.h> #include <EthernetServer.h> #include <EthernetUdp.h> #include <util.h> #include <SPI.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; byte ip[] = { 192,168,0,167 }; // IP address you wish to assign to Arduino char server[] = "www.yandex.ru"; // IP address of your POP3 server char inString[165]; // Number of characters to be collected int i = 0; int mailNum1 = 0; // First digit of the email number int mailNum2 = 0; // Second digit int mailTotal = 0; // Total # of messsage char d; int ledPin = 9; EthernetClient client; long updateTimer; boolean clientConnected = false; //================================================================================================ void setup() { // Serial.begin(9600); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); } //================================================================================================== void loop() { updateClient(); d = checkAvail(); if (d >= 10){ getMailNum(); } } /*======================================== Functions =========================================*/ //================================================================================================== void updateClient() //This function contacts the POP3 server { if ((millis() - updateTimer) > 5000) { Ethernet.begin(mac, ip); // Serial.println("connecting..."); delay(1000); if (client.connect(server, 110)) { // Serial.println("connected"); client.println("user Your.Name"); //Insert your usual email login name client.println("pass PassWord"); //And your password here client.println("quit"); client.println(); clientConnected = true; } else { // Serial.println("connection failed"); } updateTimer = millis(); } } //================================================================================================== char checkAvail() //This checks if there is data available and returns a char { if (clientConnected) { if (client.available()) { char c = client.read(); return(c); } if (!client.connected()) { // Serial.println(); // Serial.println("disconnecting."); client.stop(); clientConnected = false; } } } //================================================================================================ int getMailNum() //This actually loads the char returned by checkAvail() and puts in into an array { inString[i] = d; i++; if (i == 165){ i = 0; client.flush(); mailNum1 = inString[106] - 48; //Array position 106 contains the first digit mailNum2 = inString[107] - 48; //Array position 107 contains the 2nd digit if it is available if ((mailNum2 >= 0) && (mailNum2 <= 9)){ //If mailNum2 is present, then it is a two digit mail count mailTotal = (mailNum1 * 10) + mailNum2; //when 2 digits are present, multiply the 1st by 10 then add to mailTotal // Serial.print("Total emails: "); // Serial.println(mailTotal); blinkLED(); //Run the blink function as many times as there are emails } else { if ((mailNum1 >= 0) && (mailNum1 <= 9)){//if there is only one digit, then that is mailTotal mailTotal = mailNum1; // Serial.print("Total emails: "); // Serial.println(mailTotal); blinkLED(); //Blink the LED } } } } //================================================================================================= void blinkLED(){ //Blinks the LED for as many times as indicated by mailTotal for(int x = mailTotal; x >= 1; x--){ digitalWrite(ledPin, HIGH); delay(200); digitalWrite(ledPin, LOW); delay(200); } } //==================================================================================================
Код не мой, но немного переработанный и измененный согластно текущей версии IDE.
Данный скеч должен проверить почту и сигнализировать об этом.
Зарание спасибо.
P.S.
Прошу прощение за "корявость" пишу с планшета.
mega2560+W5100 пойдёт?
Опиши что за скетч?
Скетч залил
Раскоментировал данные в порт
не конектится
с компа пингуется
С браузера ничего не грузится
Немного подправил код.
до сервервера "конектица" количество писем получает. Но вот как заставить выполнять действие пока немогу разобратся. :(
в качестве адреса сервера указываем pop.ya.ru - для яндекса (87.250.250.37)
pop.mail.ru - для mail.ru (94.100.180.74)
ИТД.
PS
Незабываем указыват свои логин и пароль в строках 60 и 62
mega2560+W5100 пойдёт?
Опиши что за скетч?
Уменя такой же набор :)
Задача: Проверять почтовый ящик на наличие новых писем, и при обнаружении оных сигнализировать ("махать" "лапкой" (Хочу серво вшить в мягкую игрушку)). Все это хочу собрать и подарить девушке :)
Основной код нашел на просторах глобальной сети, немного изменил его для работы с pop3 сервером, но некак не могу разобратся в фунциях автора :(
1) почему в функции
изначального варианта он коннектится к серверу но нечего там не делает!
2) очень хочется понять что должна делать эта функция
Надеюсь кто нибудь сможет мне помочь :)
2) очень хочется понять что должна делать эта функция
При коннекте телнетом по pop3 протоколу (110-й порт) после предъявления правильной пары пароль/логин сервер выдает число - количество почтовых сообщений, лежащих в ящике. Вот это количество и призвана интерпретировать данная функция. Правда что она покажет, если число будет из трех знаков - это вопрос. :) Подробнее - надо читать хаутушки http://www.winsov.ru/net063.php и проверять - что реально Вам возвращает сервер.
При коннекте к серверу pop.mail.ru не сообщяет нечего кроме
+OK
в последней версии своего кода по команде STAT получаю количество писем
но пока не понял как это можно использовать.
Интересно есть команда для POP сервера которая выведет только количество непрочитанных или новых писем?
разобрались, работает?
Спасибо, налаживаем...
к серверу коннектится, но тут теперь проблема с определением новых писем.
Интересно есть команда для POP сервера которая выведет только количество непрочитанных или новых писем?
Как Вы думаете - откуда сервер знает: новые письма они для Вас или старые? :)
Как это делают большие MUA: сервер выдает количество писем, затем клиент запрашивает UID-ы писем с сервера, они идут списком с номерами. Клиент сравнивает с тем, что есть у него в базе и запрашивает новые к загрузке... Вот только тут появляется "новые". А флаг "прочитано" на сервере - можно ставить в imap протоколе, но, боюсь, мощности ардуины не хватит на такую реализацию...
Спасибо!
Как я понял мне необходи мледующий алгоритм работы моего устройства:
1) конектимся к серверу
2) с помощью команды STAT получаем количество писем в ящике
3) сравниваем текущее количество писем с количеством ранее сохраненным
4) если количество отличается в большую сторону сигнализируем о новом письм(е/ах), запоминаем текущее количество писем
4.1) если пользователь заметил сигнал о новых письмах, пользователь нажимает кнопку ("я вижу...")
4.2) отключаем сигнализацию о новых письмах
5) если количество отличается в меньшую сторону запоминаем текущее количество писем, отключаем сигнализацию о новых письмах.
6)дисконектимся
7) ждем 90 секунд
8) go to 1:
Ну, можно и так... Хотя у протокола pop3 есть еще одна грабля: если два разных клиента, а ардуино и пользователь - это два разных клиента, коннектятся к одному и тому же ящику, то сервер может одному из клиентов ответить "mailbox is locked". Так что смысла в таком опросе pop3 ящика лично я не вижу никакого: вот если бы запрашивать From и слать его по xmpp на телефон...
Моя цель именно указывать что есть новое письмо.
В последствии в мягую игрушку будет вшит сервопривод (медвеженок будет махать лапками)
Поэтму мне достаточно того чтобы програма видела наличие новых писем.
Спасибо всем.
Пойду учится парсить текст в arduino.