Отправка E-mail из программы на Vc++

  • Автор темы Alex_Bamuner
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

Alex_Bamuner

Гость
#1
Всем привет.
Стоит задача - отправить письмо по электронной почте из приложения, написанного на VC++. Написал я следующее:

#define SMTP_PORT 25 //порт почтового сервера
#define SMTP_ADDR "..........." //Айпишник почтового сервера - я пытался на yandex

SOCKET nSMTPServerSocket;
struct sockaddr_in smtp_address;
int nConnect;
int iLength;
int iMsg = 0;
int iEnd = 0;
BYTE sBuf[4096];

char *MailMessage[] =
{
"HELO domain.ru\r\n",
"MAIL FROM:<",
"RCPT TO:<vasya@pupkin.ru>\r\n",
"DATA\r\n",
"",
"QUIT\r\n",
NULL
};

lstrcat(MailMessage[1], "vasja@pupkin.ru>\r\n");
lstrcat(MailMessage[4],"Hello world\r\n\r\n.\r\n");

nSMTPServerSocket = socket(PF_INET, SOCK_STREAM, 0);

if(nSMTPServerSocket != INVALID_SOCKET) {
smtp_address.sin_family = AF_INET;
smtp_address.sin_addr.s_addr = inet_addr(SMTP_ADDR);
smtp_address.sin_port = htons(SMTP_PORT);

nConnect = connect(nSMTPServerSocket, (PSOCKADDR)&smtp_address, sizeof(smtp_address));

if(nConnect) { }
else {
do {
iLength = recv(nSMTPServerSocket, (LPSTR)sBuf+iEnd, sizeof(sBuf)-iEnd, 0);
iEnd += iLength;
sBuf[iEnd] = '\0';
send(nSMTPServerSocket, (LPSTR)MailMessage[iMsg], strlen(MailMessage[iMsg]), 0);
iMsg++;
} while(MailMessage[iMsg]);
}

closesocket(nSMTPServerSocket);
}


Требуется авторизация - это ответ с сервера. Я почитал о протоколе - там черт ногу сломит, особенно когда я добрался до 64-coding. Тут я решил уже обратиться за помощью сюда... Благодарю за любые советы и комментарии.
С уважением,
Александр.
 
Z

zubr

Гость
#2
Чтобы не заморачиваться с протоколом, посмотри лог какой нибудь почтовой программы, к примеру Outlook, в логе будет протокол обмена с почтовым сервером. Естественно подразумевается, что Outlook настроен на соединение с интересующим почтовым сервером.
 
A

Alex_Bamuner

Гость
#3
Идея неплохая, спасибо... Но я никлгда такими вещами прежде не интересовался - подскажи, а где этот лог найти? В папке Outlook Express я такового не нашел... =(
 
Z

zubr

Гость
#4
Для Outlook ищи (для NT-систем) в каталоге Documents and Settings\...\... файл по имени Smtp.log
 
A

Alex_Bamuner

Гость
#5
Ага, поищу. Спасибо. А вообще, странное дело - я подключился к smtp серверу на mail.ru. И он безо всякой авторизации дал мне отправить письмо с первого попавшегося вымышленного адреса. С существующих - не даёт, а с левых - пожалуйста!
 
A

Alex_Bamuner

Гость
#6
хм... smtp.log не создаётся.... короче говоря, у меня его нету... =( Если у кого-нить есть такой - вышлите, если не сложно - bamuner@yandex.ru. А если у кого-нить есть алгоритм шифрования Base64 - тоже будет очень кстати. Логин и пароль серверу надо посылать в Base64 кодировке.
 
Z

zubr

Гость
#7
Для: Alex_Bamuner
В настройках Outlook есть возможность включить ведение лога, по видимому у тебя эти возможности отключены. Смотрим Сервис->Параметры, вкладку Обслуживание. А присылать тебе свой лог с авторизацией, извини, как то не хочется.
Насчет алгоритма шифрования Base64 у меня есть функция, но на Delphi, переводить в C нет времени, если устроит, могу прислать.
 
A

Alex_Bamuner

Гость
#8
Я так думаю, что разницы большой нет - из Delphi сделать C не так уж и запарно. Так что буду весьма благодарен за функцию. а Outlook проверю - что там с ведением лога... Спасибо!
 
Z

zubr

Гость
#9
Вот функция:
Код:
procedure SmtpJoin(Name:string; Stream:TStream; Count:integer;
var outstr:string);
var
s:string[76]; 
size:integer; 
u:string; 
ss:integer; 
c1,c2:byte; 
x:integer; 
begin
try
outstr:='begin 600 '+Name;
size:=45;
while Count>0 do begin 
if size>Count then size:=count; 
dec(count,size);
Stream.Read(s[1],size);
u:=uchr(size); 
ss:=2; 
c2:=0; 
for x:=1 to size do begin 
c1:=ord(s[x]); 
u:=u+uchr(c2 or (c1 shr ss)); 
c2:=(c1 shl (6-ss)) and 63; 
ss:=(ss+2) and 7; 
if ss=0 then begin 
ss:=2; 
u:=u+uchr(c2); 
c2:=0; 
end; 
end;
if (ss>2) then begin 
u:=u+uchr(c2)+#96; 
if ss=4 then u:=u+#96; 
end;
outstr:=outstr+#13+#10+u;
end;
outstr:=outstr+#13+#10+'end';
except
end;
end;
Функция переводит данные потока в кодировку BASE64, для дальнейшей отправки в виде аттача по SMTP. Здесь Name - имя файла, который будет в аттаче, Stream - поток, Count - размер потока, outstr - результат перевода.
 
A

Alex_Bamuner

Гость
#10
Ага, спасибо... погляжу на досуге... :) Сейчас всё-таки сделал аутлуковский лог, выдрал оттуда логин и пароль и в итоге авторизация пошла как по маслу. Правда письмо отсылается как-то странно - при отсылке на yandex приходит пустое письмо от анонима, а на mail - приходит письмо с моего аккаунта, но в теле письма кроме того, что я напечатал, присылается вся-вся история блуждания письма по серверам... такие вот дела. Кстати, вообще задача стоит - отсылка аттачментов. На эту тему есть идеи - как подключать аттачменты к письмам?
 
Z

zubr

Гость
#11
Кстати, вообще задача стоит - отсылка аттачментов. На эту тему есть идеи - как подключать аттачменты к письмам?
Ну так в чем проблема, та функция, что я выложил как раз это и делает, по крайней мере у меня она как раз для такой задачи и использовалась.
 
Статус
Закрыто для дальнейших ответов.