윤구님의 글까지 봤는데도 잘 이해못해서 한참 고생하다가 해결했습니다.
진작 IdMessage.hpp를 봤으면 해결했을 것을.. 처음엔 Create만 한참 찾았는데.. 델파이에서 Create가 생성자라는 것을 몰라 고생했네요.
꽤 오래전에 해결하신 윤구님께는 필요없는 답변이지만 이 내용으로 검색하실지도 모를 분을 위해 간단하게 소스 달아봅니다.
indy smtp component는 처음 사용하는 거라 혹시나 틀린점 있으면 알려주세요;;
(C++ Builder 6.0, Indy9.0.18 기준)
// 컴포넌트를 폼에 올려놓지 않고 동적생성했기 때문에 직접 include 하였습니다.
// 동적으로 생성하지 않으시려면 컴포넌트 팔레트 중 Indy Clients 탭의 IdSMTP와
// Indy Misc 탭의 IdMessage 컴포넌트를 폼에 올려주세요.
#include
#include
#include
#include
#include
#include
#include
// ... (생략) ...
// --> 동적 생성이 아닐 경우 아래 코드 필요 없음
TIdSMTP *IdSMTP = NULL;
TIdMessage *IdMsg = NULL;
IdMsg = new TIdMessage(this);
IdSMTP = new TIdSMTP(this);
// <-- 동적 생성이 아닐 경우 위의 코드 필요 없음
if (IdMsg) {
IdMsg->From->Text = "from@email.com"; // 보내는 이
IdMsg->Recipients->EMailAddresses = "to@email.com"; // 받는 이
IdMsg->Body->Add("메일 내용"); // 메일 내용
IdMsg->Subject = "제목"; // 제목
IdMsg->ContentType = "multipart/form-data";
TIdAttachment(IdMsg->MessageParts, "C:\\삽질.jpg"); // 첨부파일 추가
if (IdSMTP) {
IdSMTP->Host = "www.email.com"; // 받는 smtp 서버
IdSMTP->Connect(10000); // 10초
try {
IdSMTP->Send(IdMsg);
}
__finally {
IdSMTP->Disconnect();
}
delete IdSMTP; // 동적 생성이 아닐 경우 필요 없음
}
delete IdMsg; // 동적 생성이 아닐 경우 필요 없음
}
}
// ... (생략) ...
윤구 님이 쓰신 글 :
: dynamic_cast이용하니까 되는거 같은데...
: 델파이에서 TIdAttachment(~~~)이건 그럼 형변환을 뜻하는 건가요?
: 전 이게 TIdAttachment인스턴스 생성하는 걸로 생각을 하고 빌더에서 인스턴스 생성해서 거기에 인자로 줄려고 했었던 거에서 문제가 생겼나 보네요..
:
: 초보여서 뭘 몰
: 윤구 님이 쓰신 글 :
: : 전에도 여기다 비슷한 질문 두번이나 올렸지만 4일이 지난 아직도 제가 해결을 못해서 다시 질문 드립니다.
: : 델파이6 시작 그리고 완성이라는 책의 부록에 있는 메일관련예제를 빌더로 만들어 보고 있습니다.
: : 헌데 다른 부분은 델파이에서 빌더로 쉽게 바꿨는데 이 부분에서 막힙니다.
: :
: : //IdMsg.MessageParts.Items[i]과 TIdAttachment 타입인지 비교하는거 같은데 빌더에서는 어떤 함수를 사용해야 하지요?
: : if IdMsg.MessageParts.Items[i] is TIdAttachment then
: : //빌더에서 이렇게 가져다 사용하면 에러가 나서 제 나름대로 바꾸어서 컴파일을 해도 에러가 나거
: : //나 아니면 컴파일 에러는 나지 않지만 엑세스바이올레이션이 발생합니다. 아랫 부분을 빌더로 어
: : //떻게 변경을 해야 할지 힌트라도 주시면 고맙겠습니다.
: : ListBox1.Items.Add( TIdAttachment( IdMsg.MessageParts.Items[i] ).FileName ) //바로 이것
: : else if IdMsg.MessageParts.Items[i] is TIdText then
: : begin
: : TStringList( TIdText( IdMsg.MessageParts.Items[i] ).Body ).SaveToFile(ExtractFilePath(Application.ExeName) + 'tempmail.htm');
: : end;
: :
: : 윤구 님이 쓰신 글 :
: : : 질문 올리고 나서 생각좀 해보고 있는데요...그래도 해결 못해서 다시 질문 올립니다.
: : :
: : : TIdAttachment클래스의 생성자가 어떻게 선언돼있는지 찾아보니까
: : : __fastcall TIdAttachment(TIdMessageParts* Collection, const AnsiString AFileName);
: : : 이게 생성자 같은데...
: : : 헌데 소스상에서
: : :
: : : AnsiString astrFileName;
: : : astrFileName = "temp";
: : : TIdAttachment *IdAttachment = new TIdAttachment(IdMessage1->MessageParts->Items[i],astrFileName);
: : :
: : : 이렇게 작성을 하고 컴파일 하면 아래와 같은 에러가 발생합니다.
: : : [C++ Error] MailMain.cpp(149): E2285 Could not find a match for 'TIdAttachment::TIdAttachment(TIdMessagePart *,AnsiString)'
: : : 빌더사용한지도 별로 안되고 씨++도 익숙하지가 못해서 도저히 해결 방법을 모르겠네요...
: : :
: : :
: : :
: : : 윤구 님이 쓰신 글 :
: : : :
: : : : ListBox1.Items.Add( TIdAttachment( IdMsg.MessageParts.Items[i] ).FileName ) ,
: : : :
: : : : TStringList( TIdText( IdMsg.MessageParts.Items[i] ).Body ).SaveToFile(ExtractFilePath(Application.ExeName) + 'tempmail.htm');
: : : :
: : : :
: : : : 위에 있는 두개가 델파이에서 있는 소스인데요 저걸 빌더에서 어떤식으로 해주어야 할지 잘 모르겠습니다.
: : : : 약간만 바꾸어서 TStringList( TIdText( IdMessage1.MessageParts.Items[i])->Body ).SaveToFile(ExtractFilePath(Application->ExeName) + "tempmail.htm");
: : : : 이렇게 하면 [C++ Error] MailMain.cpp(154): E2459 VCL style classes must be constructed using operator new 이런 에러가 발생합니다.
: : : :
: : : : 그래서 변수로 선언해서 사용하려고 아래처럼 바꿔서 해보면
: : : :
: : : : TIdText *IdText(IdMessage1->MessageParts->Items[i]);
: : : :
: : : : [C++ Error] MailMain.cpp(149): E2031 Cannot cast from 'TIdMessagePart *' to 'TIdText'
: : : : [C++ Error] MailMain.cpp(149): E2285 Could not find a match for 'TIdText::TIdText(TIdMessagePart *)'
: : : : 두개의 에러가 발생합니다....
: : : : 제 생각에는 IdText클래스에 저런 생성자가 없어서 나는 에러 같은데...그럼 인자 없이 만들고
: : : : TIdText *IdText;
: : : : IdText가 가지는 어떤 값에다가 IdMessage1->MessageParts->Items[i]이걸 넣어주면 될거 같은데
: : : : 도움말을 봐도 어떻게 해야 하는지 모르겠습니다.
: : : :
: : : : TIdAttachment에서도 비슷한 이유로 에러가 나서 해결을 못하고 있습니다.
: : : : TIdText,TIdAttachment 이 두개를 어떻게 사용을 해야 하는지 알려주세요.
: : : :
: : : :