我正在关注此guide以c ++发送电子邮件。您可以在here
下载标题文件:easendmailobj.tlh
和easendmail object
#include "stdafx.h"
#include <iostream>
#include "easendmailobj.tlh"
using namespace EASendMailObjLib;
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//string email = "randomemail1@gmail.com";
::CoInitialize( NULL );
IMailPtr oSmtp = NULL;
oSmtp.CreateInstance( "EASendMailObj.Mail");
oSmtp->LicenseCode = _T("TryIt");
// Set your gmail email address
oSmtp->FromAddr = _T("randomemail1@gmail.com");
// Add recipient email address
oSmtp->AddRecipientEx( _T("randomemail2s@hotmail.com"), 0 );
// Set email subject
oSmtp->Subject = _T("simple email from Visual C++ with gmail account");
// Set email body
oSmtp->BodyText = _T("this is a test email sent from Visual C++ project with Gmail");
// Gmail SMTP server address
oSmtp->ServerAddr = _T("smtp.gmail.com");
// If you want to use direct SSL 465 port,
// Please add this line, otherwise TLS will be used.
// oSmtp->ServerPort = 465;
// detect SSL/TLS automatically
oSmtp->SSL_init();
// Gmail user authentication should use your
// Gmail email address as the user name.
// For example: your email is "gmailid@gmail.com", then the user should be "gmailid@gmail.com"
oSmtp->UserName = _T("somerandomemail@gmail.com");
oSmtp->Password = _T("somepassword");
_tprintf(_T("Start to send email via gmail account ...\r\n" ));
if( oSmtp->SendMail() == 0 )
{
_tprintf( _T("email was sent successfully!\r\n"));
}
else
{
_tprintf( _T("failed to send email with the following error: %s\r\n"),
(const TCHAR*)oSmtp->GetLastErrDescription());
}
if( oSmtp != NULL )
oSmtp.Release();
int x;
cin>>x;
return 0;
}
当我尝试使用字符串变量而不是“”???
时,为什么会出错#include "stdafx.h"
#include <iostream>
#include "easendmailobj.tlh"
using namespace EASendMailObjLib;
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
string email = "randomemail1@gmail.com": //string variables
::CoInitialize( NULL );
IMailPtr oSmtp = NULL;
oSmtp.CreateInstance( "EASendMailObj.Mail");
oSmtp->LicenseCode = _T("TryIt");
// Set your gmail email address
oSmtp->FromAddr = _T(email); // string variable instead of " " , error is here
// Add recipient email address
oSmtp->AddRecipientEx( _T("randomemail2s@hotmail.com"), 0 );
// Set email subject
oSmtp->Subject = _T("simple email from Visual C++ with gmail account");
// Set email body
oSmtp->BodyText = _T("this is a test email sent from Visual C++ project with Gmail");
// Gmail SMTP server address
oSmtp->ServerAddr = _T("smtp.gmail.com");
// If you want to use direct SSL 465 port,
// Please add this line, otherwise TLS will be used.
// oSmtp->ServerPort = 465;
// detect SSL/TLS automatically
oSmtp->SSL_init();
// Gmail user authentication should use your
// Gmail email address as the user name.
// For example: your email is "gmailid@gmail.com", then the user should be "gmailid@gmail.com"
oSmtp->UserName = _T("somerandomemail@gmail.com");
oSmtp->Password = _T("somepassword");
_tprintf(_T("Start to send email via gmail account ...\r\n" ));
if( oSmtp->SendMail() == 0 )
{
_tprintf( _T("email was sent successfully!\r\n"));
}
else
{
_tprintf( _T("failed to send email with the following error: %s\r\n"),
(const TCHAR*)oSmtp->GetLastErrDescription());
}
if( oSmtp != NULL )
oSmtp.Release();
int x;
cin>>x;
return 0;
}
我收到以下错误
Error C2065: 'Lemail' : undeclared identifier
答案 0 :(得分:2)
字符串文字和std::string
是两个完全不同的东西。通常,当函数f
期望const char*
时,您可以将字符串文字传递给它,或者您可以使用类似c_str()
的字符串的f(email.c_str())
方法。
但问题是_T
不是函数。它是一个宏,它只是在字符串文字中添加L
作为前缀。您无法将其用于std::string
。您需要使用一些函数进行转换。
或者定义一个与_T
相同的宏,并根据是否定义wstring
决定使用string
或UNICODE
。尝试阅读代码以及_T
做了什么,你应该理解我的意思。
答案 1 :(得分:1)
这取决于是否定义了UNICODE
。
如果是,请使用std::wstring
而不是字符串。另外,删除包裹字符串变量的_T
并添加.c_str()
答案 2 :(得分:1)
如果这是标准的微软垃圾(更确切地说,是
实验失败 - 他们想要实现的是
值得称赞,但他们实际上最终得到的是无用的额外
复杂性),你最好摆脱它:功能是
main
(不是_tmain
),使用char
(或wchar_t
,具体取决于
你想要什么,但在声明中必须是char
main
)代替_TCHAR
,忘记了_T
。
对于直接问题,_T
是将的宏
只适用于字符串文字;这就是它的设计方式。
如果你在其他任何东西上使用它,它可能会扩展到类似的东西
Lemail
,当然不会被人知道。
答案 3 :(得分:0)
_T()的无效用法;它适用于字符串文字。
这条线应该是;
oSmtp-&gt; FromAddr = email.c_str();
答案 4 :(得分:0)
这是_T
:
#if defined(_UNICODE)
#define _T(x) L ##x
#else
#define _T(x) x
#endif
正如您所看到的,它只是在L
前面附加任何内容。因此,如果您传入字符串,例如_T("HELLO WORLD")
,如果定义了L"HELLO WORLD"
,则会转换为_UNICODE
。
同样,如果您传入任何其他令牌,例如_T(email)
,它会将其转换为Lemail
,这就是您收到错误的原因。
解决方法是使用std::wstring
和std::string
作为:
#if defined(_UNICODE)
#define String std::wstring
#else
#define String std::string
#endif
并改为使用String email
。