RTV forum PL | NewsGroups PL

Jak wysłać e-mail z Raspberry Pi przy użyciu C? Proste metody i biblioteki

Raspberry Pi - wysyłanie maila z notyfikacją

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak wysłać e-mail z Raspberry Pi przy użyciu C? Proste metody i biblioteki

Goto page 1, 2  Next

Atlantis
Guest

Sat Aug 23, 2014 9:30 am   



Przepraszam za pytanie na granicy OT, ale zastanawia mnie pewna kwestia:

Jak w najprostszy sposób wysłać maila z jakaś informacją z poziomu
programu napisanego w C, działającego pod Raspberry Pi? W internecie
znajduję mnóstwo przykładów dotyczyących Pythona albo PHP, pod C już
trochę trudniej.

Do głowy przychodzi mi kilka rozwiązań, m.in.:
1) Napisanie własnej procedury, implementującej protokół SMTP i
wykorzystującej socket TCP.
2) Skorzystanie z jakiegoś klienta e-mail obsługiwanego z poziomu
konsoli i wywoływanie go przez system().

A może dałoby się to zrobić bardziej elegancko? Jakaś gotowa biblioteka,
udostępniająca odpowiednią funkcję? Albo program, który udostępniałby w
systemie odpowiedni plik, do którego mógłbym pisać wysyłając wiadomość?

AlexY
Guest

Sat Aug 23, 2014 10:00 am   



Użytkownik Atlantis napisał:
Quote:
Przepraszam za pytanie na granicy OT, ale zastanawia mnie pewna kwestia:

Jak w najprostszy sposób wysłać maila z jakaś informacją z poziomu
programu napisanego w C, działającego pod Raspberry Pi? W internecie
znajduję mnóstwo przykładów dotyczyących Pythona albo PHP, pod C już
trochę trudniej.

Do głowy przychodzi mi kilka rozwiązań, m.in.:
1) Napisanie własnej procedury, implementującej protokół SMTP i
wykorzystującej socket TCP.
2) Skorzystanie z jakiegoś klienta e-mail obsługiwanego z poziomu
konsoli i wywoływanie go przez system().

A może dałoby się to zrobić bardziej elegancko? Jakaś gotowa biblioteka,
udostępniająca odpowiednią funkcję? Albo program, który udostępniałby w
systemie odpowiedni plik, do którego mógłbym pisać wysyłając wiadomość?

Nie znam C, czy w tym języku nie da się wywołać programu z niezbędnymi
parametrami?


--
AlexY
http://faq.enter.net.pl/simple-polish.html
http://www.pg.gda.pl/~agatek/netq.html

Michał Lankosz
Guest

Sat Aug 23, 2014 11:26 am   



W dniu 2014-08-23 12:00, AlexY pisze:
Quote:
Użytkownik Atlantis napisał:
Przepraszam za pytanie na granicy OT, ale zastanawia mnie pewna kwestia:

Jak w najprostszy sposób wysłać maila z jakaś informacją z poziomu
programu napisanego w C, działającego pod Raspberry Pi? W internecie
znajduję mnóstwo przykładów dotyczyących Pythona albo PHP, pod C już
trochę trudniej.

Do głowy przychodzi mi kilka rozwiązań, m.in.:
1) Napisanie własnej procedury, implementującej protokół SMTP i
wykorzystującej socket TCP.
2) Skorzystanie z jakiegoś klienta e-mail obsługiwanego z poziomu
konsoli i wywoływanie go przez system().

A może dałoby się to zrobić bardziej elegancko? Jakaś gotowa biblioteka,
udostępniająca odpowiednią funkcję? Albo program, który udostępniałby w
systemie odpowiedni plik, do którego mógłbym pisać wysyłając wiadomość?

Nie znam C, czy w tym języku nie da się wywołać programu z niezbędnymi
parametrami?


Właśnie podał sposób - przez system(). Ale Atlantisowi nie chodzi o
wywoływanie zewnętrznych programów.

Nie mam doświadczenia praktycznego, ale w zebranych materiałach do RPi
mam: libESMTP i libquickmail.


--
Michał

Marek
Guest

Sat Aug 23, 2014 11:30 am   



On Sat, 23 Aug 2014 11:30:35 +0200, Atlantis <marekw1986NOSPAM@wp.pl>
wrote:
Quote:
Jak w najprostszy sposób wysłać maila z jakaś informacją z poziomu
programu napisanego w C, działającego pod Raspberry Pi? W internecie

A po co C? nc (netcat) nie może być?

--
Marek

Jarosław Sokołowski
Guest

Sat Aug 23, 2014 1:10 pm   



Pan Michał Lankosz napisał:

Quote:
Jak w najprostszy sposób wysłać maila z jakaś informacją z poziomu
programu napisanego w C, działającego pod Raspberry Pi? W internecie
znajduję mnóstwo przykładów dotyczyących Pythona albo PHP, pod C już
trochę trudniej.

Do głowy przychodzi mi kilka rozwiązań, m.in.:
1) Napisanie własnej procedury, implementującej protokół SMTP i
wykorzystującej socket TCP.
2) Skorzystanie z jakiegoś klienta e-mail obsługiwanego z poziomu
konsoli i wywoływanie go przez system().

A może dałoby się to zrobić bardziej elegancko? Jakaś gotowa biblioteka,
udostępniająca odpowiednią funkcję? Albo program, który udostępniałby w
systemie odpowiedni plik, do którego mógłbym pisać wysyłając wiadomość?

Nie znam C, czy w tym języku nie da się wywołać programu z niezbędnymi
parametrami?

Właśnie podał sposób - przez system(). Ale Atlantisowi nie chodzi o
wywoływanie zewnętrznych programów.

Te zewnętrzne programy, to nie w czym innym napisane, jak w C. Jak ktoś
się uprze, to sobie może uwewnętrznić.

Quote:
Nie mam doświadczenia praktycznego, ale w zebranych materiałach do RPi
mam: libESMTP i libquickmail.

Ale tu w ogóle nic do roboty nie ma -- wystarczy przygotować treść maila
z nagłówkami i wysłać to na port 25 swojego serwera. Ktoś już zauważył,
że dobrze do tego się nadaje netcat (nc) -- też napisany w C, więc każdy
może sobie zobaczyć, jak to robi.

Jak sie nie chce zgłębiać RFC, można zajrzeć na przykład tu (pierwsze
trafienie google) http://www.linuxjournal.com/content/sending-email-netcat

--
Jarek

AlexY
Guest

Sat Aug 23, 2014 5:14 pm   



Użytkownik Michał Lankosz napisał:
Quote:
W dniu 2014-08-23 12:00, AlexY pisze:
Użytkownik Atlantis napisał:
[..]
A może dałoby się to zrobić bardziej elegancko? Jakaś gotowa biblioteka,
udostępniająca odpowiednią funkcję? Albo program, który udostępniałby w
systemie odpowiedni plik, do którego mógłbym pisać wysyłając wiadomość?
Nie znam C, czy w tym języku nie da się wywołać programu z niezbędnymi
parametrami?
Właśnie podał sposób - przez system(). Ale Atlantisowi nie chodzi o
wywoływanie zewnętrznych programów.

No to musi wyważać otwarte drzwi czyli jak Jarek napisał wstawić program
pocztowy w swój program, IMHO bez sensu.

[..]


--
AlexY
http://faq.enter.net.pl/simple-polish.html
http://www.pg.gda.pl/~agatek/netq.html

Atlantis
Guest

Sun Aug 24, 2014 5:56 am   



W dniu 2014-08-23 15:10, Jarosław Sokołowski pisze:

Quote:
Ale tu w ogóle nic do roboty nie ma -- wystarczy przygotować treść maila
z nagłówkami i wysłać to na port 25 swojego serwera. Ktoś już zauważył,
że dobrze do tego się nadaje netcat (nc) -- też napisany w C, więc każdy
może sobie zobaczyć, jak to robi.

Hmm... Wystarczy po prostu wysłać kolejne linie jednym ciągiem, bez
sprawdzania odpowiedzi serwera?
No i czy istnieją jeszcze jakieś publiczne serwery SMTP, które
umożliwiałyby wysłanie wiadomości bez autoryzacji?

Marek
Guest

Sun Aug 24, 2014 8:37 am   



On Sun, 24 Aug 2014 07:56:44 +0200, Atlantis <marekw1986NOSPAM@wp.pl>
wrote:
Quote:
Hmm... Wystarczy po prostu wysłać kolejne linie jednym ciągiem, bez
sprawdzania odpowiedzi serwera?
No i czy istnieją jeszcze jakieś publiczne serwery SMTP, które
umożliwiałyby wysłanie wiadomości bez autoryzacji?

Ale chwila, chcesz wysyłać maile jawnie (znany serwer, oficjalny
dostęp) czy chcesz spamować szukając open relay'e? Bo w pierwszym
przypadku 99% wszystko zadziała a w drugim trzeba weryfikować
komunikację.
Analizując output netcata i kody odp. smtp możesz stwierdzić czy
wystąpił jakiś problem.
Protokoły komunikacyjne aplikacji stworzone za czasów wczesnego
internetu są human readable & friendly, wystarczy umiejętność
czytania Smile, przez co są łatwe implementacyjnie.

--
Marek

Marek
Guest

Sun Aug 24, 2014 8:41 am   



On Sun, 24 Aug 2014 07:56:44 +0200, Atlantis <marekw1986NOSPAM@wp.pl>
wrote:
Quote:
No i czy istnieją jeszcze jakieś publiczne serwery SMTP, które
umożliwiałyby wysłanie wiadomości bez autoryzacji?

Większość umożliwia PLAIN lub LOGIN, wygeneruj sobie string auth
(albo podejrzyj tcpdumpem komunikację lnormalnego klienta by ten
string wyciągnąć) i dodaj do skryptu podczas komunikacji z serwerem.

--
Marek

Marek
Guest

Sun Aug 24, 2014 10:25 am   



On Sat, 23 Aug 2014 13:30:30 +0200, Marek <fake@fakeemail.com> wrote:
Quote:
A po co C? nc (netcat) nie może być?

Trochę napisałem na wyrost, nie do końca może to działać z każdym
serwerem. Jeśli na serwerze jest zaimplementowana silna ochrona
antyspamowa np. greeting pause to od klienta wymaga się precyzyjnej
(rfc strict) komunikacji, nie pamiętam czy netcatem da się
zaimplementować oczekiwanie na odp., wysyłanie sesji "ciurkiem" może
nie zadziałać.

--
Marek

Atlantis
Guest

Sun Aug 24, 2014 1:59 pm   



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: <adres@host.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ć?

A
Guest

Sun Aug 24, 2014 3:09 pm   



Atlantis wrote:

Quote:
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: <adres@host.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ą

Quote:
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.

Borys Pogoreło
Guest

Sun Aug 24, 2014 3:23 pm   



Dnia Sun, 24 Aug 2014 15:59:29 +0200, Atlantis napisał(a):

Quote:
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

Marek Wodzinski
Guest

Mon Aug 25, 2014 10:01 pm   



On 08/24/2014 03:59 PM, Atlantis wrote:
Quote:
Hmm... Doczytałem trochę i udało mi się napisać prostą funkcję.

sprintf(buffer, "DATA\nFROM: <adres@host.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

Atlantis
Guest

Tue Aug 26, 2014 6:45 am   



W dniu 2014-08-26 00:01, Marek Wodzinski pisze:

Quote:
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?


Quote:
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.


Quote:
Rozumiem, żebyś rzeżbił na Arduino, ale tu masz wszystko gotowe,
przetestowane i działające.

Przyzwyczajenia... Programowania uczyłem się na AVR-ach. Wink

Goto page 1, 2  Next

elektroda NewsGroups Forum Index - Elektronika Polska - Jak wysłać e-mail z Raspberry Pi przy użyciu C? Proste metody i biblioteki

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map