Odesílání emailu z programu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Odesílání emailu z programu – C / C++ – Fórum – Programujte.comOdesílání emailu z programu – C / C++ – Fórum – Programujte.com

 

BigFood
~ Anonymní uživatel
16 příspěvků
7. 11. 2010   #1
-
0
-

Ahoj, jak se dá odeslat email z programu přes SMTP?
Google neporadil.
Díky

Nahlásit jako SPAM
IP: 78.80.70.–
KIIV
~ Moderátor
+43
God of flame
7. 11. 2010   #2
-
0
-

a co si na tom protokolu nepochopil?
pripojis socket a posilas data podle predpisu..

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
BigFood
~ Anonymní uživatel
16 příspěvků
8. 11. 2010   #3
-
0
-

No o to právě jde. Jak se připojit k socketu a posilat data podle predpisu?

Nahlásit jako SPAM
IP: 78.80.70.–
KIIV
~ Moderátor
+43
God of flame
8. 11. 2010   #4
-
0
-
Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
m->29+6
Super člen
8. 11. 2010   #5
-
0
-

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

Nahlásit jako SPAM
IP: 83.208.112.–
BigFood
~ Anonymní uživatel
16 příspěvků
9. 11. 2010   #6
-
0
-

No, abych řek pravdu myslel jsem si že to bude jednoduší.
Ale jinak dík, určitě se na to podívám.

Nahlásit jako SPAM
IP: 78.80.70.–
BigFood
~ Anonymní uživatel
16 příspěvků
26. 2. 2011   #7
-
0
-

Tak už jsem se naučil WinSokety (2,2), takže bych se rád pustil do toho SMTP. Bohužel je to anglicky, a je toho hodně. Nebylo by něco v CZ nebo něco stručnějšího v EN ?

Nahlásit jako SPAM
IP: 78.80.70.–
m->29+6
Super člen
27. 2. 2011   #8
-
0
-
Nahlásit jako SPAM
IP: 83.240.51.–
BigFood
~ Anonymní uživatel
16 příspěvků
27. 2. 2011   #9
-
0
-

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:

Nahlásit jako SPAM
IP: 78.80.70.–
nervak0
Věrný člen
27. 2. 2011   #10
-
0
-

MAIL FROM: <jag.mv2@seznam.cz>

Nahlásit jako SPAM
IP: 213.211.51.–
BigFood
~ Anonymní uživatel
16 příspěvků
27. 2. 2011   #11
-
0
-

nervak napsal:
MAIL FROM: <jag.mv2@seznam.cz>



Jsem sem to špatně opsal, nevím v čem je chyba :(

Nahlásit jako SPAM
IP: 78.80.70.–
BigFood
~ Anonymní uživatel
16 příspěvků
1. 3. 2011   #13
-
0
-

Takže je chyba v emailu ? :smile11:

Nahlásit jako SPAM
IP: 78.80.70.–
m->29+6
Super člen
1. 3. 2011   #14
-
0
-

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.

Nahlásit jako SPAM
IP: 83.240.51.–
nervak0
Věrný člen
1. 3. 2011   #15
-
0
-

Ukaž kód, nebudeme hádat, co kde máš nebo nemáš špatně.

Nahlásit jako SPAM
IP: 213.211.51.–
BigFood
~ Anonymní uživatel
16 příspěvků
2. 3. 2011   #16
-
0
-

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;
}

Nahlásit jako SPAM
IP: 78.80.70.–
nervak0
Věrný člen
2. 3. 2011   #17
-
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.

Nahlásit jako SPAM
IP: 213.211.51.–
BigFood
~ Anonymní uživatel
16 příspěvků
2. 3. 2011   #18
-
0
-

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";

Nahlásit jako SPAM
IP: 78.80.70.–
nervak0
Věrný člen
2. 3. 2011   #19
-
0
-

$ 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

Nahlásit jako SPAM
IP: 213.211.51.–
BigFood
~ Anonymní uživatel
16 příspěvků
3. 3. 2011   #20
-
0
-

Jo, už to funguje. Děkuji moc.
Ještě chyb potřeboval vystětlit ten base 64. Jak se do něj / z něj převádí určitý text.

Nahlásit jako SPAM
IP: 78.80.70.–
nervak0
Věrný člen
4. 3. 2011   #21
-
0
-

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

Nahlásit jako SPAM
IP: 213.211.51.–
BigFood
~ Anonymní uživatel
16 příspěvků
4. 3. 2011   #22
-
0
-

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";

Nahlásit jako SPAM
IP: 78.80.70.–
nervak0
Věrný člen
4. 3. 2011   #23
-
0
-

Asi ti chybí prázdný řádek oddělující hlavičky od zprávy

Subject: predmet\r\n

\r\n
Halo

Nahlásit jako SPAM
IP: 213.211.51.–
BigFood
~ Anonymní uživatel
16 příspěvků
5. 3. 2011   #24
-
0
-

Děkuju

Nahlásit jako SPAM
IP: 78.80.70.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 14 hostů

Podobná vlákna

C# Odesílání emailů — založil jakub

PHP odesílání kopie emailu — založil cheondervara

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý