электронная почта — CSmtp не будет отправлять вложения электронной почты. Но без вложений работает нормально. (C ++)

У меня проблема с отправкой вложения с помощью Класс CSmtp.
Вот код по этой ссылке:

int SendMail()
{
bool bError = false;

try
{
CSmtp mail;

#define test_gmail_tls

#if defined(test_gmail_tls)
mail.SetSMTPServer("smtp.gmail.com",587);
mail.SetSecurityType(USE_TLS);
#elif defined(test_gmail_ssl)
mail.SetSMTPServer("smtp.gmail.com",465);
mail.SetSecurityType(USE_SSL);
#elif defined(test_hotmail_TLS)
mail.SetSMTPServer("smtp.live.com",25);
mail.SetSecurityType(USE_TLS);
#elif defined(test_aol_tls)
mail.SetSMTPServer("smtp.aol.com",587);
mail.SetSecurityType(USE_TLS);
#elif defined(test_yahoo_ssl)
mail.SetSMTPServer("plus.smtp.mail.yahoo.com",465);
mail.SetSecurityType(USE_SSL);
#endif

mail.SetLogin("[email protected]");
mail.SetPassword("password");
mail.SetSenderName("");
mail.SetSenderMail("[email protected]");
mail.SetReplyTo("");
mail.SetSubject("Subject");
mail.AddRecipient("[email protected]");
mail.SetXPriority(XPRIORITY_NORMAL);
mail.SetXMailer("The Bat! (v3.02) Professional");
mail.AddMsgLine("Hello,");
mail.AddMsgLine("you have been successfully registered!");
mail.AddMsgLine(" ");
mail.AddMsgLine("Username: ");
mail.AddMsgLine("Password: ");
mail.AddMsgLine(" ");
mail.AddMsgLine("See ya!");

mail.AddAttachment("C:\\Users\\Jenda\\AppData\\Roaming\\text.dat");
mail.Send();
}
catch(ECSmtp e)
{
std::cout << "Error: " << e.GetErrorText().c_str() << ".\n";
bError = true;
}
if(!bError)
std::cout << "Registration E-Mail was sent on given address.\n";
return 0;
}

Когда я комментирую вложение, оно успешно отправляет электронное письмо. НО когда я пытаюсь отправить это вложение, кажется, что он просто останавливается и ничего не делает — он не возвращает ни ошибки, ни чего-либо. Это просто ничего не делает (хотя отвечает — по словам менеджера задач, вы знаете).

Также здесь возникает дополнительный вопрос: вы видите путь вложения (C: \ Users \ Jenda \ AppData \ Roaming \ text.dat)? Как программа может получить информацию о пользователе (имя) и как я могу добавить ее в путь, чтобы она работала на каждом компьютере. C: \ Users \ WINDOWSUSERNAME \ …

Вот и все, спасибо за все ваши ответы и идеи.

Постскриптум Я использую Windows7 32bit и Visual C ++ Express 2010.

1

Решение

По первому вопросу, я полагаю, вы имеете в виду этот код.

Возможные проблемы:

A)

В CSmtp.cpp:

hFile = fopen(FileName.c_str(), "rb");

должно быть (также вы должны рассмотреть fopen_s):

hFile = fopen(Attachments[FileId].c_str(), "rb");

B)

В заголовочном файле CSmtp.h есть строка, указывающая максимальный размер письма. Вероятно, ваши вложения более 5 МБ. Измените его на 25 МБ:

#define MSG_SIZE_IN_MB 5  // the maximum size of the
// message with all attachments

C)

В коде много специфических частей для Windows / Linux.
Один из таких примеров:

pos = Attachments[FileId].find_last_of("\\");

из-за этого путь вашего вложения должен содержать «\\», а не «/», если вы находитесь в Windows. Лучшим подходом было бы получить от системы разделение. В двух словах посмотрите, правильно ли вы определили путь (пример: «c: \\ test3.txt»).

D)

Я настоятельно советую вам добавить в конце main.cpp строку (чтобы можно было видеть системные сообщения):

Sleep(4000);

По второму вопросу вы можете сделать что-то вроде (см. Также Вот):

#include <cassert>
#include <fstream>
#include <string>
#include <Windows.h>

std::string getPath(void){
//Get local dir
TCHAR szBuf[MAX_PATH] = { 0 };
::GetEnvironmentVariable("USERPROFILE", szBuf, MAX_PATH);
std::string path = szBuf;
path += "\\AppData\\Roaming\\text.dat";
return path;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]