SMTP + 0x0A, 0x0D

facelift

Новичок
SMTP + 0x0A, 0x0D

Всем привет. Пытаюсь отправить картинку(JPEG) по протоколу SMTP. Картинку получаю, но она испорчена. В результате недолгих исследований удалось выяснить что в принятом файле 0x0A было заменено на 0x0D, 0x0A.
Как это лечить? Спасибо за советы.
 

facelift

Новичок
whirlwind
Я не знаю. Стоит прочитать про mime?

-~{}~ 24.03.08 18:17:

Все, спасибо, вопрос снимается. Если кому интересно то надо было шифровать по base64.
Теперь след. вопрос. Отправил файлик, получмл его. Но не все его читают. Браузеры читают, а вот простая прога для просмотра изображений - нет(просмотр рисунков в винде). Что делать?
 

facelift

Новичок
А теперь еще один вопрос. Почему при отсылке больших сообщений (4 МБ) сообщения приходят битые?
 

kvf77

Red Devil
facelift
потому что не все серверы позволяют получать такие сообщения.
 

ys

отодвинутый новичок
kvf77
Ответ неправильный.
SMTP сервера как TRUE и FALSE - или принимают или нет.
 

facelift

Новичок
Посылаю большой wav файл (56 МБ), он приходит, и его даже можно открыть проигрывателем. Но слышен только шум, иногда только слышна музыка. Размер поланного и принятого файлов совпадают. А вот когда начинаешь их сравнивать арахисом(araxis merge) то видишь что данные не те. Местами те, а местами не те ).
 

Dovg

Продвинутый новичок
facelift
А все-таки
как кодируешь в миме, как отправляешь?
и можно ли кусок кода?
--
Отправь большой файл каким-нить тандербирдом
посмотри он кодирует вложения и сравни со своим
 

facelift

Новичок
Автор оригинала: Dovg
facelift
А все-таки
как кодируешь в миме, как отправляешь?
и можно ли кусок кода?
--
Отправь большой файл каким-нить тандербирдом
посмотри он кодирует вложения и сравни со своим
Dovg
Кодирую по Base64
Код:
size_t Base64EncodeBuffer(unsigned char *destBuffer, const unsigned char *sourceBuffer, size_t bufferSize)
{
	static const char cb64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
							   "abcdefghijklmnopqrstuvwxyz"
							   "0123456789+/";

	const size_t lastByteCount = bufferSize % 3;
	const size_t divSize = bufferSize - lastByteCount;

	size_t i, j;
	
	for(i = 0, j = 0; i < divSize; i += 3, j += 4)
	{
		destBuffer[j]	  = cb64[ sourceBuffer[i] >> 2 ];
		destBuffer[j + 1] = cb64[ ((sourceBuffer[i] & 0x03) << 4) | ((sourceBuffer[i + 1] & 0xf0) >> 4) ];
		destBuffer[j + 2] = cb64[ ((sourceBuffer[i + 1] & 0x0f) << 2) | ((sourceBuffer[i + 2] & 0xc0) >> 6) ];
		destBuffer[j + 3] = cb64[ sourceBuffer[i + 2] & 0x3f ];
	}
	
	if(lastByteCount > 0)
	{
		destBuffer[j]	  = cb64[ sourceBuffer[i] >> 2 ];
		destBuffer[j + 1] = cb64[ ((sourceBuffer[i] & 0x03) << 4) | ((sourceBuffer[i + 1] & 0xf0) >> 4) ];
		destBuffer[j + 2] = (unsigned char) (lastByteCount > 1 ? cb64[ ((sourceBuffer[i + 1] & 0x0f) << 2) | ((sourceBuffer[i + 2] & 0xc0) >> 6) ] : '=');
		destBuffer[j + 3] = (unsigned char)'=';

		j += 4;
	}

	return j;
}
Так шлю
Код:
int TCPClient::SendFileBase64(FILE *fp)
{
	//ASSERT(fp);

	size_t totalSize = 0;
	size_t size = 0;
	const size_t bufSize = 1024;
	const size_t sbufSize = bufSize * 3;
	const size_t dbufSize = bufSize * 4;
	unsigned char sbuf[sbufSize];
	unsigned char dbuf[dbufSize];
	size_t dsize = 0;

	FILE *ffp = fopen("c:\\recv.txt", "wb");
	
	while(!feof(fp))
	{
		size = fread(sbuf, sizeof(char), sbufSize, fp);
		
		memset(dbuf, dbufSize, 0);
		dsize = Base64EncodeBuffer(dbuf, sbuf, size);

		int rc = send(m_Socket, reinterpret_cast<char *>(dbuf), dsize, 0);
		fwrite(dbuf, sizeof(char), dsize, ffp);
		if(rc == SOCKET_ERROR)
		{
			std::cerr << "WSAGetLastError = " << WSAGetLastError() << std::endl;
			throw RecvException();
			return -1;
		}
		totalSize += rc;	
	}

	std::cout << std::endl << "Size is " << totalSize << std::endl;

	return totalSize;
}
 

Dovg

Продвинутый новичок
Вопросы по программированию на РНР >
Есть мнение, что ваш код написан не на php :)

-~{}~ 26.03.08 11:45:

По теме
сравнение закодированного вложения с ним же из почтового клиента дало что-нибудь?
 

Dovg

Продвинутый новичок
не бейте smtp, он не виновен в кодировании вложений
--
сравнение закодированного вложения с ним же из почтового клиента дало что-нибудь?
 

facelift

Новичок
Dovg
Послал текстовый файл атачем, закодированным по Base64, он пришел, но когда сохранил сообщение оно уже было незакодированное.
Маленькие файлы нормально посылаются. Все ОК. Проблемма с большими.

Большие файлы приходят битыми. Что делать (с)?
 

facelift

Новичок
Dovg
Блин, у меня аутглюк, ты не можешь посмотеть что там приходит?

-~{}~ 26.03.08 12:05:

Все правильно. Зандерберд тоже отправляет в b64. Так и надо выходит - все бинарники кодировать в base64

Из сообщения:

Код:
--------------080208090600030207050801
Content-Type: application/x-msdownload;
 name="Setup_RepliGo_RPM1.0.1.exe"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
 filename="Setup_RepliGo_RPM1.0.1.exe"

TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA2AAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4g
RE9TIG1vZGUuDQ0KJAAAAAAAAADnsLO+o9Hd7aPR3e2j0d3tefLB7aHR3e1Z8sTtstHd7aPR
3O080d3tWfXB7avR3e1Z9ZjtotHd7Vn14O2i0d3tUmljaKPR3e0AAAAAAAAAAAAAAAAAA
 
Сверху