Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2010, 20:50   #1
dimorik
Пользователь
 
Регистрация: 23.08.2008
Сообщений: 51
По умолчанию Отправить файл на E mail

Ребята, подскажите пожалуйста как осуществить низкоуровневую (API C++) отправку файла на e-mail? Очень интересно как там все происходит! Буду благодарен за любую информацию. Желательно поподробнее!
dimorik вне форума Ответить с цитированием
Старый 15.03.2010, 21:24   #2
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Цитата:
Сообщение от Некто Purpe
пример в чистом API. Думаю, что должен сработать в любом Си-компиляторе:
PHP код:
#define SMTP_PORT 25 //порт почтового сервера
#define SMTP_ADDR "128.1.1.1" //Айпишник почтового сервера

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], "purpe@sources.ru>\r\n");
lstrcat(MailMessage[4],"Hello world\r\n\r\n.\r\n");

nSMTPServerSocket socket(PF_INETSOCK_STREAM0);

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_addresssizeof(smtp_address));

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

closesocket(nSMTPServerSocket);

А вот адрес где это было взято - sources.ru/NonCGI/Forum2/HTML/000698.html Гугл выдал первой ссылкой по запросу :"отправка email C++"
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 16.03.2010, 04:06   #3
dimorik
Пользователь
 
Регистрация: 23.08.2008
Сообщений: 51
По умолчанию

Да, этот код я уже встречал.. Вот только понять не могу, где же тут имя файла который нужно отправить, или указатель на него? Еще вопрос: можно ли используя созданный сокет из приведенного выше кода, отправить файл с помощью функции TransmitFile ? Прошу не винить строго, если я что-то недоглядел. Я в апи новичек.
dimorik вне форума Ответить с цитированием
Старый 16.03.2010, 11:04   #4
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Вопрос немного другой нежели кажется. Что делает TansmittFile ? Она считывает весь файл в память процесса и потом передает его как обычные пакеты. Вы можете использовать этот открытый сокет для взаимодействия с сервером, но сам принцип взаимодействия не укладывается в примитивную передачу байтов туда сюда. Есть спец.формат и как раз вот это:
"HELO domain.ru\r\n",
"MAIL FROM:<",
"RCPT TO:<vasya@pupkin.ru>\r\n",
"DATA\r\n",
"",
"QUIT\r\n",

- его часть которая отвечает за инициализацию создания письма. Т.е на другом конце провода просто есть серверный сокет который циклические слушает порт SMTP и от полученных через этот порт данных он и решит что ему дальше делать.

Если вкратце то вам нужно почитать как сервер хочет получить свой файл. Если вы просто его вышлите с помощью TansmittFile - толку от этого не будет, потому что сервер его не сможет принять - вы его об этом не предупредили
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 16.03.2010, 11:04   #5
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Вопрос немного другой нежели кажется. Что делает TansmittFile ? Она считывает весь файл в память процесса и потом передает его как обычные пакеты. Вы можете использовать этот открытый сокет для взаимодействия с сервером, но сам принцип взаимодействия не укладывается в примитивную передачу байтов туда сюда. Есть спец.формат и как раз вот это:
"HELO domain.ru\r\n",
"MAIL FROM:<",
"RCPT TO:<vasya@pupkin.ru>\r\n",
"DATA\r\n",
"",
"QUIT\r\n",

- его часть которая отвечает за инициализацию создания письма. Т.е на другом конце провода просто есть серверный сокет который циклические слушает порт SMTP и от полученных через этот порт данных он и решит что ему дальше делать.

Если вкратце то вам нужно почитать как сервер хочет получить свой файл. Если вы просто его вышлите с помощью TansmittFile - толку от этого не будет, потому что сервер его не сможет принять - вы его об этом не предупредили
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 17.03.2010, 17:49   #6
dimorik
Пользователь
 
Регистрация: 23.08.2008
Сообщений: 51
По умолчанию

А нельзя ли поподробнее о строчках выделенных красным!? Все-таки я недопонимаю, как серверу дать знать что я хочу передать ему файл? и как узнать "согласен-ли" он его принять.. может есть у кого исходник, ЛЮДИ!!!! Или объясните мне у приведенного кода построчно, что, куда и зачем! Я раньше дельфи юзал, так там я отправлял файл с помощью готового компонента... должен же быть его аналог написанный на апи!
dimorik вне форума Ответить с цитированием
Старый 17.03.2010, 18:18   #7
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

В википедии есть ссылка на спецификацию протокола. Но сама спецификация, спорю, такая же идиотская как и спецификация SQL или HTTP - 20 строк размазаны по 150 страницам, но что делать, люди пожелали придать вес элементарным вещам и получили нечто что даже и читать то не хочется.
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 17.03.2010, 19:45   #8
dimorik
Пользователь
 
Регистрация: 23.08.2008
Сообщений: 51
По умолчанию

Ну и на этом спасибо! Кажется кое-чего начал понимать.. нашел мало-мальской инфы.. теперь дело времени..
dimorik вне форума Ответить с цитированием
Старый 01.04.2010, 12:29   #9
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

я скопировал этот код и он не скомпилился
Код:
#define SMTP_PORT 25 //порт почтового сервера
#define SMTP_ADDR "128.1.1.1" //Айпишник почтового сервера

SOCKET nSMTPServerSocket;//что это???
struct in_addr smtp_address;
/*
struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};
*/

/*
in_addr Structure

The in_addr structure represents an IPv4 Internet address.


typedef struct in_addr {  union {    struct {      u_char s_b1,s_b2,s_b3,s_b4;    } S_un_b;   
struct {      u_short s_w1,s_w2;    } S_un_w;    u_long S_addr;  } S_un;
} IN_ADDR,  *PIN_ADDR,  FAR *LPIN_ADDR;
Members
S_un 
S_un_b 
An IPv4 address formatted as four u_chars.

S_un_w 
An IPv4 address formatted as two u_shorts.

S_addr 
An IPv4 address formatted as a u_long.

Remarks
The in_addr structure is used with IPv4 addresses. 

The in_addr structure is the IPv4 equivalent of the IPv6-based in6_addr structure. 

Note  The IN_ADDR, PIN_ADDR, and LPIN_ADDR derived structures are only defined on the Windows SDK released with Windows Vista and later. On earlier versions of the Windows SDK, variables of this type should be declared as struct in_addr. 

Requirements
Client
 Requires Windows Vista, Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95.
 
Server
 Requires Windows Server 2008, Windows Server 2003, Windows 2000 Server, or Windows NT Server.
 
Header
 Declared in In_addr.h on Windows Server 2008 and Windows Vista.

Declared in Winsock2.h on Windows Server 2003, Windows XP, Windows 2000, Windows NT, Windows Me, Windows 98, and Windows 95.
 
*/
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], "purpe@sources.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);
}
плиз поясните по поводу
SOCKET nSMTPServerSocket;//что это??? F1 не помог
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], "purpe@sources.ru>\r\n");//это как бы склеивание строк?
Dimarik вне форума Ответить с цитированием
Старый 01.04.2010, 12:30   #10
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

я скопировал этот код и он не скомпилился
Код:
#define SMTP_PORT 25 //порт почтового сервера
#define SMTP_ADDR "128.1.1.1" //Айпишник почтового сервера

SOCKET nSMTPServerSocket;//что это???
struct in_addr smtp_address;
/*
struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};
*/

/*
in_addr Structure

The in_addr structure represents an IPv4 Internet address.


typedef struct in_addr {  union {    struct {      u_char s_b1,s_b2,s_b3,s_b4;    } S_un_b;   
struct {      u_short s_w1,s_w2;    } S_un_w;    u_long S_addr;  } S_un;
} IN_ADDR,  *PIN_ADDR,  FAR *LPIN_ADDR;
Members
S_un 
S_un_b 
An IPv4 address formatted as four u_chars.

S_un_w 
An IPv4 address formatted as two u_shorts.

S_addr 
An IPv4 address formatted as a u_long.

Remarks
The in_addr structure is used with IPv4 addresses. 

The in_addr structure is the IPv4 equivalent of the IPv6-based in6_addr structure. 

Note  The IN_ADDR, PIN_ADDR, and LPIN_ADDR derived structures are only defined on the Windows SDK released with Windows Vista and later. On earlier versions of the Windows SDK, variables of this type should be declared as struct in_addr. 

Requirements
Client
 Requires Windows Vista, Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95.
 
Server
 Requires Windows Server 2008, Windows Server 2003, Windows 2000 Server, or Windows NT Server.
 
Header
 Declared in In_addr.h on Windows Server 2008 and Windows Vista.

Declared in Winsock2.h on Windows Server 2003, Windows XP, Windows 2000, Windows NT, Windows Me, Windows 98, and Windows 95.
 
*/
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], "purpe@sources.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);
}
плиз поясните по поводу
SOCKET nSMTPServerSocket;//что это??? F1 не помог
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], "purpe@sources.ru>\r\n");//это как бы склеивание строк?
Dimarik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправить по e-mail папку с файлами Titan123 Работа с сетью в Delphi 4 22.12.2008 19:42
Как програмно отправить письмо на E-mail ? SG13 Работа с сетью в Delphi 2 13.06.2008 12:50
Подскажите как отправить E-mail из программы... Артем Чижук Общие вопросы Delphi 1 07.06.2008 08:47