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

У меня возникла проблема с отправкой вложения с помощью класса 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\ИМЯ_ПОЛЬЗОВАТЕЛЯ_WINDOWS\...

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

P.S. Я использую Windows7 32bit и Visual C++ Express 2010.


person Popa611    schedule 15.03.2014    source источник


Ответы (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;
}
person Stanislav    schedule 04.02.2015