Я слежу за этим руководство отправить письмо на с ++. Вы можете скачать файлы заголовков: 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 = "[email protected]";
::CoInitialize( NULL );
IMailPtr oSmtp = NULL;
oSmtp.CreateInstance( "EASendMailObj.Mail");
oSmtp->LicenseCode = _T("TryIt");
// Set your gmail email address
oSmtp->FromAddr = _T("[email protected]");
// Add recipient email address
oSmtp->AddRecipientEx( _T("[email protected]"), 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 "[email protected]", then the user should be "[email protected]"oSmtp->UserName = _T("[email protected]");
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 = "[email protected]": //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("[email protected]"), 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 "[email protected]", then the user should be "[email protected]"oSmtp->UserName = _T("[email protected]");
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
Строковый литерал и std::string
это две совершенно разные вещи. Обычно, когда функция f
ожидает const char*
Вы можете передать ему строковый литерал или использовать метод c_str()
такой строки, как так f(email.c_str())
,
Однако проблема здесь в том, что _T
это не функция. Это макрос, и он просто добавляет L
в качестве префикса к строковым литералам. Там нет никакого способа, которым вы можете использовать его для std::string
, Вам нужно будет использовать некоторые функции для преобразования.
В качестве альтернативы определите макрос, который делает то же самое, что и _T
и решает использовать wstring
или же string
в зависимости от того, если UNICODE
определено. Попробуйте прочитать код и что делает _T
делай, и ты должен понять, что я имею в виду.
Это зависит от того, UNICODE
определено.
Если это так, используйте std::wstring
вместо строки. Кроме того, удалите _T
обёртывание строковой переменной и добавление .c_str()
Если это стандартный мусор Microsoft (точнее,
эксперимент, который не удался — то, чего они хотели достичь, это
похвально, но то, чем они на самом деле оказались, бесполезно
сложность), вам лучше всего избавиться от нее: функция
main
(не _tmain
), используйте char
(или же wchar_t
, в зависимости от
что хочешь, но должно быть char
в декларации
main
) вместо _TCHAR
и забыть о _T
,
Что касается насущной проблемы, то _T
это макрос, который будут
работать только со строковыми литералами; это так, как это было задумано.
Если вы используете его для чего-то другого, он может расшириться до чего-то вроде
Lemail
что, конечно, не будет известно.
недопустимое использование _T (); это для строковых литералов.
Так что эта линия должна быть;
oSmtp-> FromAddr = email.c_str ();
Это определение _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
вместо.