使用CSmtp class发送附件时出现问题 以下是该链接上的代码:
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@email.com");
mail.SetPassword("password");
mail.SetSenderName("");
mail.SetSenderMail("email@email.com");
mail.SetReplyTo("");
mail.SetSubject("Subject");
mail.AddRecipient("email@email.com");
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 \ ...
这就是它,感谢您的所有回复和想法。
P.S。我使用的是Windows7 32位和Visual c + + Express 2010。
答案 0 :(得分:1)
对于第一个问题,我认为您指的是this代码。
可能的问题:
A)
在CSmtp.cpp中:
hFile = fopen(FileName.c_str(), "rb");
应该是(你也应该考虑fopen_s):
hFile = fopen(Attachments[FileId].c_str(), "rb");
B)
在头文件CSmtp.h中有一行指定邮件的最大大小。可能你的附件大于5MB。将其更改为25MB:
#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);
对于第二个问题,您可以执行类似的操作(另请参阅here):
#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;
}