-
11. Data: 2014-08-24 15:59:29
Temat: Re: Raspberry Pi - wysyłanie maila z notyfikacją
Od: Atlantis <m...@w...pl>
Hmm... Doczytałem trochę i udało mi się napisać prostą funkcję.
Najpierw w taki sposób przesyłam kolejne polecenia:
rc = send(sd, "AUTH LOGIN\n", strlen("AUTH LOGIN\n"), MSG_WAITALL);
rc = recv(sd, ans, sizeof(ans), 0);
if (rc > 0) {
ans[rc] = '\0';
puts(ans);
}
Udało mi się w ten sposób przejść całą procedurę uwierzytelniania oraz
ustawiania adresów nadawcy i odbiorcy. Potem przechodzę do "DATA".
sprintf(buffer, "DATA\nFROM: <a...@h...pl>\nTO: <%s>\nSUBJECT: TO JEST
TEMAT TEGO MAILA\nA TO JEST JEGO TRESC\r\n.\r\n", to);
rc = send(sd, buffer, strlen(buffer), MSG_WAITALL);
rc = recv(sd, ans, sizeof(ans), 0);
if (rc > 0) {
ans[rc] = '\0';
puts(ans);
}
Niestety taka konstrukcja działa tylko połowicznie. To znaczy dochodzi
mail z określonym tematem, ale bez treści.
Błąd zapewne jest banalny, ale ja nie mogę go dostrzec. O co może chodzić?
-
12. Data: 2014-08-24 17:09:35
Temat: Re: Raspberry Pi - wysyłanie maila z notyfikacją
Od: A <a...@g...pl>
Atlantis wrote:
> Hmm... Doczytałem trochę i udało mi się napisać prostą funkcję.
>
> Najpierw w taki sposób przesyłam kolejne polecenia:
>
> rc = send(sd, "AUTH LOGIN\n", strlen("AUTH LOGIN\n"), MSG_WAITALL);
> rc = recv(sd, ans, sizeof(ans), 0);
> if (rc > 0) {
> ans[rc] = '\0';
> puts(ans);
> }
>
> Udało mi się w ten sposób przejść całą procedurę uwierzytelniania oraz
> ustawiania adresów nadawcy i odbiorcy. Potem przechodzę do "DATA".
>
> sprintf(buffer, "DATA\nFROM: <a...@h...pl>\nTO: <%s>\nSUBJECT: TO JEST
> TEMAT TEGO MAILA\n
tu dodaj jeszcze jedno \n - ma być pusta linia pomiędzy nagłówkami, a
treścią
> A TO JEST JEGO TRESC\r\n.\r\n", to);
>
> rc = send(sd, buffer, strlen(buffer), MSG_WAITALL);
> rc = recv(sd, ans, sizeof(ans), 0);
> if (rc > 0) {
> ans[rc] = '\0';
> puts(ans);
> }
>
> Niestety taka konstrukcja działa tylko połowicznie. To znaczy dochodzi
> mail z określonym tematem, ale bez treści.
> Błąd zapewne jest banalny, ale ja nie mogę go dostrzec. O co może chodzić?
--
A.
-
13. Data: 2014-08-24 17:23:20
Temat: Re: Raspberry Pi - wysyłanie maila z notyfikacją
Od: Borys Pogoreło <b...@p...edu.leszno>
Dnia Sun, 24 Aug 2014 15:59:29 +0200, Atlantis napisał(a):
> Niestety taka konstrukcja działa tylko połowicznie. To znaczy dochodzi
> mail z określonym tematem, ale bez treści.
> Błąd zapewne jest banalny, ale ja nie mogę go dostrzec. O co może chodzić?
\n\n przed treścią.
--
Borys Pogoreło
borys(#)leszno,edu,pl
-
14. Data: 2014-08-26 00:01:21
Temat: Re: Raspberry Pi - wysyłanie maila z notyfikacją
Od: Marek Wodzinski <m...@O...mamy.to>
On 08/24/2014 03:59 PM, Atlantis wrote:
> Hmm... Doczytałem trochę i udało mi się napisać prostą funkcję.
>
> sprintf(buffer, "DATA\nFROM: <a...@h...pl>\nTO: <%s>\nSUBJECT: TO JEST
> TEMAT TEGO MAILA\nA TO JEST JEGO TRESC\r\n.\r\n", to);
1. Serwer czy net może być niedostępny (timeout czy connection refused)
2. Serwer może mieć trudne chwile i odpowie Ci 450
3. Filtr antyspamowy nie polubi Ci 'SUBJECT' zamiast 'Subject', braku
nagłówków czy np. złego kodowania.
Wyślij to normalnie przez system() i niech demon poczowy na Linuksie się
tym martwi. Chyba nie będziesz pisał demona na nowo? Co z chwilowymi
problemami (1.,2.)? Skolejkujesz sam gdzieś tego maila czy stracisz?
Na Linuxie naprawdę nie ma sensu wynajdować koła od nowa, bo szkoda
czasu i zawsze się okaże, że jakiś serwer odpowie Ci trochę inaczej, ale
zgodnie z RFC i program się wyłoży. Albo przytrzyma Ci połączenie (czy
sieć padnie w tym momencie) i program się powiesi do wytimeoutowania
sesji tcp. No chyba, że wysyłasz asynchronicznie w osobnym wątku czy
podprocesie, ale wtedy jak poforkujesz się dla każdego maila znowu
musisz kontrolować pamięć/zasoby i ilość procesów itd...
Rozumiem, żebyś rzeżbił na Arduino, ale tu masz wszystko gotowe,
przetestowane i działające.
Pozdrawiam
Marek
--
"If you want something done...do yourself!"
Jean-Baptiste Emmanuel Zorg
-
15. Data: 2014-08-26 08:45:04
Temat: Re: Raspberry Pi - wysyłanie maila z notyfikacją
Od: Atlantis <m...@w...pl>
W dniu 2014-08-26 00:01, Marek Wodzinski pisze:
> Wyślij to normalnie przez system() i niech demon poczowy na Linuksie się
> tym martwi. Chyba nie będziesz pisał demona na nowo? Co z chwilowymi
> problemami (1.,2.)? Skolejkujesz sam gdzieś tego maila czy stracisz?
Hmm... W tej chwili funkcja załatwia tylko podstawową komunikację z
serwerem przy przesyłaniu i zwraca 1 w przypadku sukcesu albo kod błędu,
gdy coś poszło niezgodnie z planem. W tej chwili kody błędu opierają się
tylko na niepowodzeniu wywołań kolejnych send() i recv(). Planowałem
jednak dodać jeszcze parsowanie odpowiedzi serwera.
Jednak chyba masz rację...
Jaki daemon pocztowy mógłbyś polecić? I jak wygląda obsługa
odpowiedniego konta? Wywołuje się je z linii poleceń, czy tożsamość jest
odgórnie skonfigurowana i zależy od użytkownika, który uruchomi program
wywołujący daemona?
> Na Linuxie naprawdę nie ma sensu wynajdować koła od nowa, bo szkoda
> czasu i zawsze się okaże, że jakiś serwer odpowie Ci trochę inaczej, ale
Kod pisałem pod konkretny serwer, nawet dane uwierzytelniające są
hardkodowane z źródle. Chodziło mi też eksperyment mający na celu
przybliżenie zasady działania poczty e-mail.
> Rozumiem, żebyś rzeżbił na Arduino, ale tu masz wszystko gotowe,
> przetestowane i działające.
Przyzwyczajenia... Programowania uczyłem się na AVR-ach. ;)
-
16. Data: 2014-08-26 16:22:55
Temat: Re: Raspberry Pi - wysyłanie maila z notyfikacją
Od: Marek Wodzinski <m...@O...mamy.to>
On Tue, 26 Aug 2014, Atlantis wrote:
> Jaki daemon pocztowy mógłbyś polecić?
Zależy do czego potrzebujesz i jak bardzo szanujesz zasoby:-)
I czy w przyszłości maszynka sama ma wysyłać maile od razu na świat czy
zawsze tylko przez jakiś serwer.
Podobno msmtp jest prosty, mały i dobry, ale jakoś zawsze używałem
'pełnych' demonów - zaleta jest taka, że łatwiej jest poznać i znaleźć
pomoc do jednego popularnego programu niż fajnego, małego, ale
egzotycznego. Jak nie liczysz każdego bajtu czy mikrosekundy na obsługę
maila, to zazwyczaj wystarcza to co dostajesz w dystrybucji.
> I jak wygląda obsługa
> odpowiedniego konta?
Jeżeli chcesz słać wszystko przez zewnętrzny serwer, to w konfiguracji
demona. Zależy jaki masz lub zainstalujesz. Podobno w Raspbianie jest exim
defaultowo, więc może już coś masz nawet zainstalowane albo i uruchomione
:-)
> Wywołuje się je z linii poleceń
Wysyłanie wywołujesz z linii poleceń, treść maila zazwyczaj wrzucasz na
stdin.
>, czy tożsamość jest
> odgórnie skonfigurowana i zależy od użytkownika, który uruchomi program
> wywołujący daemona?
To trochę inaczej się odbywa.
Zazwyczaj masz demona do poczty (mta), który działa cały czas lub
uruchamiany jest czasem z crona (rzadziej). On sprawdza czy coś ma w
kolejce do wysłania i to ewentualnie wysyła.
Natomiast jak chcesz wysłać maila, to wywołujesz inny program (czasem ten
sam, ale z innymi opcjami), który weźmie tego maila, wstępnie sprawdzi co
próbujesz wysłać i wrzuci do kolejki demonowi.
Tożsamość (w sensie ustawienia autoryzacji i serwera) konfigurujesz
demonowi o ile nie wysyłasz sam od razu na świat. Wtedy on może wysłać
maila dalej używając tej konfiguracji. Mta to taki router - sam podejmuje
decyzje co zrobić z dostanym mailem. Czasem możesz mu wymusić, żeby słał
wszystko lub część poczty (np. w zależności od nadawcy czy odbiorcy) przez
określonego relaya. Dlatego też raczej nie ma szans, że określisz
dodatkowe parametry relaya w czasie wrzucania maila do kolejki.
Taki hint już do wysyłania: możesz wywołać 'mail' używając jego switchy,
żeby dodać dodatkowe nagłowki. Ale ponieważ praktycznie każdy mta ma tryb
udawania sendmaila (jednego z najstarszych demonów), to niezależnie czy
będziesz miał exima, postfixa, sendmaila czy coś tam jeszcze, to zawsze
powinno się dać wywołać 'sendmail -t' i wrzucić na stdin całego maila z
nagłówkami.
Wtedy 'sendmail' sam sobie znajdzie From:, To:, Cc, Bcc (to ostatnie
też grzecznie usunie) i zrobi z tym co trzeba.
Osobiście używam opcji z sendmail -t :-)
>> Na Linuxie naprawdę nie ma sensu wynajdować koła od nowa, bo
szkoda
>> czasu i zawsze się okaże, że jakiś serwer odpowie Ci trochę inaczej, ale
>
> Kod pisałem pod konkretny serwer, nawet dane uwierzytelniające są
> hardkodowane z źródle.
Czasem serwer się zmienia, czasem chcesz udostępnić program komuś. W
Linuksie najlepiej jak system tym się zajmie, a nie sama aplikacja.
Czasem robi to aplikacja, ale często są to już potworki w językach
skryptowych z opasłymi i sprawdzonymi bibliotekami. A i tak często taka
biblioteka ma jako fallback wysłanie 'normalnie'.
> Chodziło mi też eksperyment mający na celu
> przybliżenie zasady działania poczty e-mail.
Przydaje się też czasem wiedzieć jak wysłać maila telnetem czy netcatem
:-)
Pozdrawiam
Marek
--
"If you want something done...do yourself!"
Jean-Baptiste Emmanuel Zorg
-
17. Data: 2014-08-26 20:50:23
Temat: Re: Raspberry Pi - wysyłanie maila z notyfikacją
Od: Atlantis <m...@w...pl>
W dniu 2014-08-26 16:22, Marek Wodzinski pisze:
> Jeżeli chcesz słać wszystko przez zewnętrzny serwer, to w konfiguracji
> demona. Zależy jaki masz lub zainstalujesz. Podobno w Raspbianie jest
> exim defaultowo, więc może już coś masz nawet zainstalowane albo i
> uruchomione :-)
Exim4 musiałem zainstalować, ale nie mogę sobie poradzić z konfiguracją.
Co jest z nim nie tak, że z uporem maniaka w miejscu FROM: wstawia adres
utworzony z LOKALNEJ nazwy użytkownika i hosta, przez co mail jest
odrzucany przez serwer.
Tak samo przy EHLO podaje nazwę maszyny (raspberrypi) zamiast tpnet.pl.
Można go jakoś nauczyć prawidłowego wysyłania maili?
SSMTP zachowuje się dokładnie tak samo...
-
18. Data: 2014-08-26 22:53:09
Temat: Re: Raspberry Pi - wysyłanie maila z notyfikacją
Od: Marek Wodzinski <m...@O...mamy.to>
On 08/26/2014 08:50 PM, Atlantis wrote:
> W dniu 2014-08-26 16:22, Marek Wodzinski pisze:
>
>> Jeżeli chcesz słać wszystko przez zewnętrzny serwer, to w konfiguracji
>> demona. Zależy jaki masz lub zainstalujesz. Podobno w Raspbianie jest
>> exim defaultowo, więc może już coś masz nawet zainstalowane albo i
>> uruchomione :-)
>
> Exim4 musiałem zainstalować, ale nie mogę sobie poradzić z konfiguracją.
> Co jest z nim nie tak, że z uporem maniaka w miejscu FROM: wstawia adres
> utworzony z LOKALNEJ nazwy użytkownika i hosta, przez co mail jest
> odrzucany przez serwer.
Zapomniałem o jednej opcji :-)
sendmail -...@d...com -t
Inaczej w 'kopercie' użyje właśnie danych z systemu.
Dobrze jeszcze dopisać do trusted_users użytkownika, który będzie
wysyłał tego maila - sendmail dodaje dodatkowy nagłówek, że user coś
kombinuje, nie wiem jak exim.
> Tak samo przy EHLO podaje nazwę maszyny (raspberrypi) zamiast tpnet.pl.
> Można go jakoś nauczyć prawidłowego wysyłania maili?
W EHLO serwer przedstawia się swoją nazwą. W zasadzie serwery są
przyzwyczajone, że klient bzdurnie się przedstawia. Jeżeli dalej
autoryzujesz się, to nie ma to znaczenia.
Jeżeli wysyłasz bezpośrednio, to niektóre sprawdzają czy hostname jest
prawidłowy (istnieje). Częściej sprawdza się czy jednak nie ustawiasz
takiego EHLO jak nazwa/ip serwera z którym się łączysz - to akurat
często jest w spamie.
Czyli tym bym się nie przejmował tak długo jak maile będą dochodzić.
Sam często testuję przez 'EHLO dupa' :-)
Pozdrawiam
Marek
--
"If you want something done...do yourself!"
Jean-Baptiste Emmanuel Zorg
-
19. Data: 2014-08-26 23:57:18
Temat: Re: Raspberry Pi - wysyłanie maila z notyfikacją
Od: Atlantis <m...@w...pl>
W dniu 2014-08-26 22:53, Marek Wodzinski pisze:
> W EHLO serwer przedstawia się swoją nazwą. W zasadzie serwery są
> przyzwyczajone, że klient bzdurnie się przedstawia. Jeżeli dalej
> autoryzujesz się, to nie ma to znaczenia.
Wydaje mi się, że to ma znaczenie, przynajmniej w przypadku Interii. Gdy
próbowałem wysyłać maile przez telnet, serwer nie przyjmował innego EHLO
jak tylko tpnet.pl. W przeciwnym razie w pewnym momencie wywalał
komunikat błędu...
> Czyli tym bym się nie przejmował tak długo jak maile będą dochodzić.
> Sam często testuję przez 'EHLO dupa' :-)
Właśnie nie dochodzi. Nie mogę tego normalnie skonfigurować...
Udało mi się już ustawić alias - tak więc mam prawdziwy e-mail
przypisany do nazwy użytkownika w systemie. Ciągle jednak nie jestem w
stanie wysłać wiadomości...
mail -s "Test" m...@g...pl -v
Wśród zwróconych treści znajduje się:
SMTP>> EHLO raspberrypi
oraz
SMTP<< 554 5.7.1 <******.*******.****.tpnet.pl[***.***.***.***]>: Client
host rejected: Access denied
-
20. Data: 2014-08-27 00:35:42
Temat: Re: Raspberry Pi - wysyłanie maila z notyfikacją
Od: "Grzegorz Niemirowski" <g...@p...onet.pl>
Atlantis <m...@w...pl> napisał(a):
> Właśnie nie dochodzi. Nie mogę tego normalnie skonfigurować...
> Udało mi się już ustawić alias - tak więc mam prawdziwy e-mail
> przypisany do nazwy użytkownika w systemie. Ciągle jednak nie jestem w
> stanie wysłać wiadomości...
> mail -s "Test" m...@g...pl -v
> Wśród zwróconych treści znajduje się:
> SMTP>> EHLO raspberrypi
> oraz
> SMTP<< 554 5.7.1 <******.*******.****.tpnet.pl[***.***.***.***]>: Client
> host rejected: Access denied
To jest cała komunikacja? 554 to odpowiedź na EHLO? Jeśli nie, to wklej
całość. Gwiazdkować nie musisz, bo i tak widać Twój adres w nagłówkach. Z
jakim serwerem się łączysz i na jakim porcie? Ja ostatnio zrobiłem
wysyłanie na socketach w C i nie było problemu na WP. EHLO podawałem
wymyślone. Skoro wysyłasz do gwp.pl, to serwerem SMTP jest smtp1.apnet.pl.
No chyba, że to pomyłka i wysyłasz do wp.pl. Mi się to gwp to EHLO nie
przyczepia:
grzegorz@jabber:~$ telnet smtp1.apnet.pl 587
Trying 213.76.170.4...
Connected to smtp1.apnet.pl.
Escape character is '^]'.
220 apnet.pl ESMTP
EHLO elektronika
250-apnet.pl
250-STARTTLS
250-PIPELINING
250-8BITMIME
250-SIZE 0
250 AUTH LOGIN PLAIN
QUIT
221 apnet.pl
Connection closed by foreign host.
--
Grzegorz Niemirowski
http://www.grzegorz.net/
OE PowerTool i Outlook Express: http://www.grzegorz.net/oe/
Uptime: 65 days, 9 hours, 46 minutes and 28 seconds