Ahoj, jak se dá odeslat email z programu přes SMTP?
Google neporadil.
Díky
Fórum › C / C++
Odesílání emailu z programu
serial o socketech je na builder.cz
RFC pro SMTP http://www.faqs.org/rfcs/rfc2821.html
S týmto ti nikto nepomôže. Jedine ak by si za to zaplatil tak hádam by sa aj niekto obetoval a napísal ti to :-D Ale môžem ti pomôcť aspoň tak ako ti Google nepomohol. Začal by som seriálom o soketoch na builder.cz http://www.builder.cz/art/cpp/sokety_a_cpp.html, a potom sa presunul ďalej na root.cz http://www.root.cz/serialy/sokety-a-cc/, kde tie články pokračujú ak by si potreboval aj pokročilejšie veci. Ale myslím, že to nebude nutné. Ak by ťa siete zaujali tak veľa ľudí odporúča prednášky Jiřího Peterky http://earchiv.cz/i_prednasky.php3. Možno na nej nájdeš aj niečo o SMTP. Ja som sa zatiaľ k tomu nedostal :-( Ďalej tu máš niečo o funkciách, ktoré zvládajú aj IPv6 https://www.ipv6.cz/Programování, aby si nepoužíval tie zastaralé, čo sú v tých článkoch na root.cz a builder.cz. No a nakoniec by si sa mal zoznámiť s dokumentami RFC. Hlavne si prečítaj RFC 2821 http://www.faqs.org/rfcs/rfc2821.html čo je v podstate norma SMTP. Nie je toho málo, ale dá sa to. Zo soketov ti stačí vedieť ako ho vytvoriť a potom len cez neho posielaš dáta. Pekné čítanie :-)
Pochybujem, že by to niekto preložil do češtiny. Je to norma a preto je to obsiahle a v IT svete vládne angličtina. No celú normu asi potrebovať nebudeš, len zákady a tie sa dajú vygoogliť http://www.google.com/search?client=opera&rls=sk&q=smtp+protokol&sourceid=opera&ie=utf-8&oe=utf-8#q=smtp+protokol&num=10&hl=sk&safe=active&client=opera&rls=sk&prmd=ivns&source=lnt&tbs=lr:lang_1cs%7Clang_1sk&lr=lang_cs%7Clang_sk&sa=X&ei=7yFqTemiE8-WOseNoacL&ved=0CAcQpwUoAQ&fp=10f23dacd223cfba.
Ty úplný základy mi budou stačit, děkuju za link. Už vím jak se dorozumívat s SMTP.
Ale je tu jeden problém...
Info:
Adresa serveru: SMTP.seznam.cz
Port: 25
1) Připojím se
2) Obrdřím zprávu od serveru: 220 2.0.0 Seznam SMTP waiting for your HELO/EHLO
3) Odpovím serveru: HELO jag.mv2.seznam.cz
4) Obrdřím zprávu od serveru: 250 Email.Seznam.cz - Email zdarma na cely zivot ESMTP
5) Odpovím serveru: MAIL FROM <jag.mv2@seznam.cz>
6)Obrdřím zprávu od serveru: 502 5.5.1 Command '
Dál jsem to ani nezkoušel :(, protože by server měl vyhodit 250
V čem může být problém. A ještě se chci zeptat, občas mi to při připojování vyhodí že jsem byl trvale zabanován :smile11:
http://www.google.com/url?sa=t&source=web&cd=1&ved=0CBUQFjAA&url=http%3A%2F%2Fwww.answersthatwork.com%2FDownload_Area%2FATW_Library%2FNetworking%2FNetwork__3-SMTP_Server_Status_Codes_and_SMTP_Error_Codes.pdf&ei=hk9qTffxEYjsOZilmKML&usg=AFQjCNHLToRZip_6JhXPQYDL0HkQkLEX_A&sig2=TTo2Yg27-k3NjvOnjVpkHw Strana 21. Prípadne Goggle "smtp 502 5.5.1 Command"
No, ja sa v tomto moc nevyznám. So smtp som takto nízkoúrovňovo nikdy nerobil. Ale napríklad používam GMail cez SMTP v Pythone, tak si to môžeš upraviť a skúsiť ak poznáš tento jazyk https://pythonadventures.wordpress.com/2011/02/19/send-emails-via-gmail/. Ak to tam pôjde tak je chyba niekde u teba. Inak je chyba na serveri. Skript uprav tak, že tam vložíš svoje meno, heslo a adresu SMTP serveru.
Tady to je:
...includes...
#define TCP_PORT "25"
int main()
{
WORD wVersionRequested = MAKEWORD(2,2); // Verze WinSock
WSADATA data;
SOCKET mainSocket;
struct hostent *host;
struct addrinfo *addrInfo, *addrTemp;
int error, pocet_adres = 0, size;
char **temp, port[500], *ip4Text, ip4Text_app[INET_ADDRSTRLEN], ip6Text_app[INET6_ADDRSTRLEN], buf[BUFSIZE], msg[BUFSIZE], DN[BUFSIZE], *ipText_app, message[BUFSIZE];
unsigned int ipTextLen;
void *binAddress = NULL;
// Naplnění struktury WSADATA (data)
if (WSAStartup(wVersionRequested, &data) != 0)
{
error = WSAGetLastError();
sprintf(msg, "Chyba při inicializování struktury WSADATA!\nČislo chyby: %i\nPopis chyby: %s",error, LastErr(error));
MessageBox(NULL, msg , NULL, MB_ICONERROR);
return -1;
}
sprintf(DN, "smtp.seznam.cz");
system("cls");
// Naplnění struktury hostent
if ((host = gethostbyname(DN)) == NULL)
{
error = WSAGetLastError();
sprintf(msg, "Server nenalezen! (host)\nČislo chyby: %i\nPopis chyby: %s",error, LastErr(error));
MessageBox(NULL, msg , NULL, MB_ICONERROR);
return -1;
}
// Naplnění struktury addrInfo
if (getaddrinfo(DN, TCP_PORT, NULL, &addrInfo) != 0)
{
error = WSAGetLastError();
sprintf(msg, "Server nenalezen! (addrInfo)\nČislo chyby: %i\nPopis chyby: %s",error, LastErr(error));
MessageBox(NULL, msg , NULL, MB_ICONERROR);
return -1;
}
// Informace o serveru
cout << "\nInformace o serveru\n";
cout << "Oficialni nazev: " << host->h_name << endl;
cout << "Alternativy: \n";
temp = host->h_aliases;
while (*temp != NULL)
{
printf("%s\n", *(temp++));
}
cout << "Adresy:\n";
temp = host->h_addr_list;
while (*temp != NULL)
{
ip4Text = (char*)inet_ntoa(*(struct in_addr*)*temp++);
if (ip4Text == NULL)
{
error = WSAGetLastError();
sprintf(msg, "Chyba při načítání IP adresy!\nČislo chyby: %i\nPopis chyby: %s",error, LastErr(error));
MessageBox(NULL, msg , NULL, MB_ICONERROR);
return -1;
}
cout << "\t"<< ip4Text << endl;
pocet_adres++;
}
cout << "Pocet adres: " << pocet_adres << "\n";
cout << "Velikost jedne adresy: " << host->h_length << " bajtu\n";
cout << "Velikost vsech adres : " << host->h_length * pocet_adres << " bajtu\n";
cout << "Verze IP: ";
addrTemp = addrInfo;
switch (addrTemp->ai_family)
{
case AF_INET:
cout << "IPv4\n";
break;
case AF_INET6:
cout << "IPv6\n";
break;
default:
cout << "Nezname - Identifikator: " << addrTemp->ai_family << "(Error: " << WSAGetLastError << ")\n";
break;
}
cout << "Verze protokolu: ";
switch (addrTemp->ai_protocol)
{
case IPPROTO_TCP:
cout << "TCP/IP\n";
break;
case IPPROTO_UDP:
cout << "UDP\n";
break;
case 113:
cout << "RM\n";
break;
case 0:
cout << "Nezname\n";
break;
default:
cout << "Nezname - Identifikator: " << addrTemp->ai_protocol << "(Error: " << WSAGetLastError << ")\n";
break;
}
cout << "Press any key to connect...";
getche();
// Tvorba TCP/IP soketu
if ((mainSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
{
error = WSAGetLastError();
sprintf(msg, "Chyba pri tvorby soketu!\nČislo chyby: %i\nPopis chyby: %s",error, LastErr(error));
MessageBox(NULL, msg , NULL, MB_ICONERROR);
closesocket(mainSocket);
WSACleanup();
return -1;
}
// Připojování k serveru
if (connect(mainSocket, addrInfo->ai_addr, addrInfo->ai_addrlen) == SOCKET_ERROR)
{
error = WSAGetLastError();
sprintf(msg, "Chyba při připojování k serveru!\nČislo chyby: %i\nPopis chyby: %s\nInfo:\nAdresa: %s\nPort: %s",error, LastErr(error), DN, TCP_PORT);
MessageBox(NULL, msg , NULL, MB_ICONERROR);
closesocket(mainSocket);
WSACleanup();
return -1;
}
else
{
cout << "Pripojeno...\n";
}
// Odesílání a přijímání dat
system("cls");
cout << "Spojeni bylo navazano!\n";
// Příjem
size = recv(mainSocket, buf, BUFSIZE ,0);
buf[size] = '\0';
cout << "1# Odpoved serveru: " << buf << "\n";
// Odeslání
sprintf(buf, "HELO jag.mv2.seznam.cz");
size = send(mainSocket,buf, BUFSIZE + 1, 0);
cout << "2# Odeslany prikaz: " << buf << "\n";
// Příjem
size = recv(mainSocket, buf, BUFSIZE ,0);
buf[size] = '\0';
cout << "3# Odpoved serveru: " << buf << "\n";
// Odeslání
sprintf(buf, "MAIL FROM:<jag.mv2@seznam.cz>");
size = send(mainSocket,buf, BUFSIZE + 1, 0);
cout << "4# Odeslany prikaz: " << buf << "\n";
// Příjem
size = recv(mainSocket, buf, BUFSIZE ,0);
buf[size] = '\0';
cout << "5# Odpoved serveru: " << buf << "\n";
// Odeslání
sprintf(buf, "RCPT TO: <jag.mv@seznam.cz>");
size = send(mainSocket,buf, BUFSIZE + 1, 0);
cout << "6# Odeslany prikaz: " << buf << "\n";
// Příjem
size = recv(mainSocket, buf, BUFSIZE ,0);
buf[size] = '\0';
cout << "7# Odpoved serveru: " << buf << "\n";
// Odeslání
sprintf(buf, "Pokusna zprava");
size = send(mainSocket,buf, BUFSIZE + 1, 0);
cout << "8# Odeslany prikaz: " << buf << "\n";
// Příjem
size = recv(mainSocket, buf, BUFSIZE ,0);
buf[size] = '\0';
cout << "9# Odpoved serveru: " << buf << "\n";
// Odeslání
sprintf(buf, "QUIT");
size = send(mainSocket,buf, BUFSIZE + 1, 0);
cout << "10# Odeslany prikaz: " << buf << "\n";
// Příjem
size = recv(mainSocket, buf, BUFSIZE ,0);
buf[size] = '\0';
cout << "11# Odpoved serveru: " << buf << "\n";
cout << "\nQ = Quit\n";
buf[999] = getche();
cout << "\n";
//Vyčištění struktury WSADATA
closesocket(mainSocket);
WSACleanup();
system("pause");
return 0;
}
Když načteš BUFSIZE bajtů, tak ten \0 zapíšeš za buf.
size = recv(mainSocket, buf, BUFSIZE-1, 0);
buf[size] = '\0';
V příkazech ti chybí ukončovač řádku a odesíláš celý buffer a dokonce 1 bajt navíc.sprintf(buf, "HELO jag.mv2.seznam.cz\r\n");
size = send(mainSocket, buf, strlen(buf), 0);
Taky recv/send nezaručuje příjetí/odeslání celého řádku.Už je to lepší, teď mi hlásí že nejsem authenticated. Nějak se mu pokouším odeslat přihlašovací údaje, ale neznám syntaxi toho příkazu. V základech neni.
// Odesílám prihlasovaci jmeno
sprintf(buf, "USERNAME:<jag.mv2@seznam.cz>\r\n");
size = send(mainSocket,buf, strlen(buf), 0);
cout << "Odeslany prikaz: " << buf << "\n";
// Příjem odpovedi serveru
size = recv(mainSocket, buf, BUFSIZE,0);
buf[size] = '\0';
cout << "3# Odpoved serveru: " << buf << "\n";
// Odesílám prihlasovaci heslo
sprintf(buf, "PASS:<123456>\r\n");
size = send(mainSocket,buf, strlen(buf), 0);
cout << "Odeslany prikaz: " << buf << "\n";
// Příjem odpovedi serveru
size = recv(mainSocket, buf, BUFSIZE,0);
buf[size] = '\0';
cout << "3# Odpoved serveru: " << buf << "\n";
$ printf 'usr@sez.cz' | base64
dXNyQHNlei5jeg==
$ printf 'pass' | base64
cGFzcw==
$ printf 'usr@sez.cz\x00usr@sez.cz\x00pass' | base64
dXNyQHNlei5jegB1c3JAc2V6LmN6AHBhc3M=
$ nc smtp.seznam.cz 25
220 2.0.0 Seznam SMTP server waiting for your HELO/EHLO
EHLO X
250-Email.Seznam.cz - Email zdarma na cely zivot ESMTP
250-AUTH LOGIN PLAIN
250-8BITMIME
250-PIPELINING
250-SIZE 18000000
250-ENHANCEDSTATUSCODES
250 X-SZNEXTENSIONS
AUTH LOGIN
334 VXNlcm5hbWU6
dXNyQHNlei5jeg
334 UGFzc3dvcmQ6
cGFzcw
235 2.2.0 Authentication succeeded
$ nc smtp.seznam.cz 25
220 2.0.0 Seznam SMTP server waiting for your HELO/EHLO
EHLO X
250-Email.Seznam.cz - Email zdarma na cely zivot ESMTP
250-AUTH LOGIN PLAIN
250-8BITMIME
250-PIPELINING
250-SIZE 18000000
250-ENHANCEDSTATUSCODES
250 X-SZNEXTENSIONS
AUTH PLAIN
334 Send base64(login\0login\0password)
dXNyQHNlei5jegB1c3JAc2V6LmN6AHBhc3M
235 2.2.0 Authentication succeeded
Máš řadu bajtů, po 8 bitech.
Plain:ABC = 65 66 67 = 01000001|01000010|01000011
Do Base64 to převedeš tak, že každých 6 bitů vyjádříš abecedou Base64.
010000|010100|001001|000011 = 16 20 9 3 = Base64:QUJD
A zpátky zase znaky z Base64 převedeš na odpovídající 6 bitové hodnoty a každých 8 bitů je 1 výsledný bajt.
http://en.wikipedia.org/wiki/Base64
Na ten Base64 se podívám jindy. Na netu jsem našel nějaku funkci co to přelouská tam i zpět. Jetše bych potřeboval vědět jak nastavit zprávě předmět a od koho je. Vždy mi totiž přijde je email od nikoho (text zpravy obsahuje).
Na netu jsem našel že by se to údajně mělo dělat takhle, bohužel se mi vše zobrazí v těle zprávy.
sprintf(buf, "DATA\r\n");
size = send(mainSocket,buf, strlen(buf), 0);
cout << "Odeslany prikaz: " << buf << "\n";
sprintf(buf, "Subject: Predmet zpravy\r\n");
size = send(mainSocket,buf, strlen(buf), 0);
cout << "Odeslany prikaz: " << buf << "\n";
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
C# Odesílání emailů — založil jakub
PHP odesílání kopie emailu — založil cheondervara
Odesílání emailu přes SMTP — založil bedna
Odesílání emailu, včetně obrázku jako příloh — založil another_freak
Skype - odesílání příkazu programu — založil Spoky
Moderátoři diskuze