2

我正在按照本指南使用 c++ 发送电子邮件。您可以下载头文件:easendmailobj.tlheasendmail 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
4

5 回答 5

2

字符串文字和 astd::string是两个完全不同的东西。通常,当一个函数f需要 a时const char*,您可以将字符串文字传递给它,或者您可以使用这样c_str()的字符串方法f(email.c_str())

然而这里的问题是这_T不是一个函数。它是一个宏,它只是将 aL作为前缀附加到字符串文字。您无法将其用于std::string. 您将需要使用一些函数进行转换。

或者定义一个与定义相同_T并决定使用wstringstring取决于是否定义的宏UNICODE。尝试通读代码以及它做了什么_T,你应该明白我的意思。

于 2014-02-07T09:56:35.030 回答
1

这取决于是否UNICODE定义。

如果是,请使用std::wstring而不是字符串。此外,删除_T包装字符串变量并添加.c_str()

于 2014-02-07T10:00:08.870 回答
1

如果这是标准的微软垃圾(更准确地说,是一个失败的实验——他们想要实现的是值得称赞的,但他们最终得到的是无用的额外复杂性),你最好摆脱它:函数是 main(不是_tmain),使用char(或wchar_t,取决于你想要什么,但它必须char在声明中 main)而不是_TCHAR,然后忘记_T.

至于眼前的问题,_T是一个 适用于字符串文字的宏;这就是它的设计方式。如果你在其他任何东西上使用它,它可能会扩展到类似 的东西 Lemail,这当然是不为人知的。

于 2014-02-07T10:01:09.547 回答
0

这是 的定义_T

#if defined(_UNICODE)
#define _T(x) L ##x
#else
#define _T(x) x
#endif

如您所见,它只是附加L在其中传递的任何内容的前面。因此,如果您传入一个字符串,例如_T("HELLO WORLD"),它将转换为L"HELLO WORLD"if_UNICODE已定义。

_T(email)同样,例如,如果您传入任何其他令牌,它会将其转换Lemail为您收到错误的原因。

解决方法是使用std::wstringstd::string作为:

#if defined(_UNICODE)
#define String std::wstring
#else
#define String std::string
#endif

String email改用。

于 2014-02-07T10:05:11.450 回答
0

_T() 的无效使用;它用于字符串文字。

所以那条线应该是;

oSmtp->FromAddr = email.c_str();

于 2014-02-07T09:58:32.333 回答