보통 SMTP 프로토콜을 사용하여 이메일을 전송합니다. 메시지를 보내려면 SMTP 서버에 접근해야 합니다. 네트워크에서 SMTP 서버 주소를 찾고, 포트와 암호화 유형, 로그인 및 인증 방식을 결정해야 합니다. 일부 이메일 제공업체는 계정 설정에서 SMTP 서버 접근을 허용하도록 해야 할 수도 있습니다. 또한 소프트웨어에서 OAuth 인증 구현이 어렵다면 계정 설정에서 애플리케이션용 별도 비밀번호를 생성해볼 수 있습니다.
모든 사전 작업을 마쳤다면 이제 메시지 전송을 시작할 차례입니다. 이를 위해 Aspose.Email for C++ 라이브러리를 사용할 수 있습니다. 가장 간단한 예를 살펴보세요:
auto smtpClient = MakeObject<SmtpClient>(u"smtp.gmail.com", u"login", u"password", SecurityOptions::SSLAuto);
smtpClient->Send(u"login@gmail.com", u"to@gmail.com", u"subject", u"body");
단순 텍스트 이메일을 보내고 싶다면 이 옵션을 사용하세요.
C++를 사용한 첨부 파일이 있는 이메일 전송
C++로 복잡한 이메일을 보내야 한다면 MailMessage 클래스가 큰 도움이 됩니다. 예를 들어, 앞의 예와 유사한 메시지를 보내려면:
auto message = MakeObject<MailMessage>(u"login@gmail.com", u"to@aspose.com", u"subject", u"body");
smtpClient->Send(message);
MailMessage 클래스는 훌륭한 도구입니다. EML 및 MSG(Outlook 메시지 형식) 파일에 저장된 메시지를 보낼 수 있으며, 이 형식을 사용해 첨부 파일이나 iCalendar 객체를 보내 일정 잡기나 참석 확인을 할 수 있습니다. MailMessage를 사용하면 수신자, Cc 및 Bcc 목록을 세밀하게 조정할 수 있고, HTML 마크업이 포함된 이메일을 보낼 수 있습니다. 또한 전송 전 메시지에 다양한 플래그를 지정하고, 메타데이터를 추가하거나, 암호화하는 등 다양한 작업이 가능합니다.
왜 사람들은 이메일 전송에 Aspose.Email for C++를 선택할까요?
맞습니다, Aspose.Email for C++는 단순히 이메일을 보내는 유틸리티가 아닙니다. 발송, 수신, 저장 및 처리와 관련된 다양한 작업을 포괄적으로 지원하는 종합 솔루션이며, 이를 수행할 때 라이브러리의 제한에 부딪히지 않을 것이라는 확신을 가질 수 있습니다. 우리는 오랫동안 이 분야를 연구해 왔으며 기능을 지속적으로 확장하고 있습니다.
아마 최근에 등장한 작은 라이브러리들을 접해보셨을 겁니다. 이들은 많은 사용자가 겪는 간단한 문제를 손쉽게 해결해 주지만, 조금만 눈을 돌리면 그 겸손한 라이브러리를 계속 사용하면서 다양한 우회책, 일부 모듈을 통한 라이브러리 제한 회피, 또 다른 작은 라이브러리와 친화하도록 만든 어댑터 등을 지속적으로 구축해야 함을 깨닫게 됩니다. 이제는 그 소소한 해결책도 그다지 매력적이지 않게 됩니다. 더욱이 서버에 배포하고 나면, 사전에 이러한 우회와 통합을 테스트한 사람이 없어, 라이브러리가 자체적으로 발목을 잡는 경우가 빈번히 발생합니다. 아무리 노력해도 언젠가는 이 라이브러리의 한계에 부딪히게 되고, 새로운 것을 찾아야만 합니다. 따라서 이메일 작업을 할 때는 Aspose.Email for C++을 고려해 보는 것이 좋습니다!
우리는 단순히 SMTP와 작업하기 위한 클라이언트만 제공하는 것이 아닙니다. 먼저, C++에서 이메일을 보낼 때 SMTP가 유일한 프로토콜이 아니라는 점을 강조하고 싶습니다. 저희 제품을 사용하면 Exchange EWS와 Microsoft Graph를 통해 이메일을 보낼 수 있습니다!
이 기사에서 MailMessage의 기능을 이미 소개했습니다. 하지만 이것이 편지를 준비하는 유일한 도구는 아닙니다. 다음을 수행할 수 있습니다:
- TemplateEngine을 사용해 템플릿으로부터 편지를 생성합니다;
- OST, PST 및 MBOX 형식을 지원하여 편지가 들어있는 컨테이너를 풀어냅니다;
- IMAP, POP3, Exchange EWS 및 WebDav 프로토콜과 Microsoft Graph를 지원하여 사서함에서 편지를 다운로드합니다;
- 이메일을 한 형식에서 다른 형식으로 변환합니다.
Exchange EWS 프로토콜을 사용하면 편지(메일)를 쉽게 받을 수 있으며, MAPI 형식입니다. 이를 EML 형식으로 변환하면 이후 SMTP 프로토콜로 쉽게 보낼 수 있습니다. 또한 수신자 목록이나 발신자를 언제든지 변경할 수 있습니다.
C++와 SMTP를 사용한 이메일 전송은 어떻게 작동하나요?
SMTP 구성
SmtpClient 클래스의 인스턴스를 생성하는 순간 특별한 일은 일어나지 않습니다. 향후 SMTP 서버에 연결해 메시지를 보낼 수 있도록 설정을 지정하기만 하면 됩니다. 모든 마법은 첫 번째 호출 시에 발생합니다 send method. 현재 어떤 상황인가요?
실제로 모든 것은 설정한 값에 달려 있습니다. 몇 가지 옵션을 살펴보겠습니다. 서버 호스트는 지정했지만 포트와 암호화 유형을 지정하지 않았다고 가정해 보겠습니다. 이 경우 설정 자동 선택 메커니즘이 작동합니다. 이 메커니즘은 표준 포트와 해당 암호화 알고리즘을 사용해 SMTP 서버에 순차적으로 연결을 시도합니다. 먼저 암호화된 채널을 통해 연결을 시도하고, 실패하면 비암호화 연결을 시도합니다. 프로토콜의 비암호화 버전을 사용하고 싶지 않다면 … 메서드를 지정하십시오. 현재 무슨 상황인가요? SecurityOptions.SSL_AUTO 설정. 이 설정은 서버 설정을 선택하도록 허용하지만, 암호화된 채널만 확인합니다.
서버와 연결이 성공하면 인증을 시도합니다. 인증에 실패하면 오류 코드를 저장하여 추후에 사용할 수 있습니다. 매처는 다른 방법으로 연결을 시도합니다. 연결 및 로그인이 가능하면 메시지를 전송합니다. 연결에 실패하면(선택 과정에서 저장된 경우) 사용자는 인증 오류 코드를 받게 되며, 이를 통해 비밀번호를 잘못 입력했거나 다른 실수가 있었음을 알 수 있습니다. 포트와 암호화 유형 중 어떤 옵션도 맞지 않아 인증 단계에 도달하지 못한 경우, 사용자는 서버 설정이 올바르지 않다는 오류를 받게 됩니다.
참고로, 우리 SmtpClient(다른 모든 라이브러리 클라이언트와 마찬가지)는 프록시를 통해 SMTP 서버에 연결할 수 있습니다. 초기화 시 프록시 서버 설정도 지정할 수 있습니다.
SMTP 클라이언트 인증
SmtpClient는 다양한 연결 방식뿐 아니라 여러 인증 방식을 지원합니다. 예를 들어 OAuth 메커니즘을 사용할 수 있으며, 이를 위해 당사는 여러 도구를 한 번에 제공합니다.
우선 TokenProvider입니다. 이 클래스는 OAuth 토큰을 저장하고 갱신하는 데 필요한 모든 데이터를 포함합니다. 따라서 OAuth 인증을 직접 수행하고 OAuth 서버에서 받은 필요한 정보를 저장해야 합니다. 여기서 RefreshToken이 핵심 역할을 합니다. 이는 AccessToken과 함께 인증 서버에서 발급되는 추가 토큰이며, 일반적으로 AccessToken은 일정 기간만 유효하지만 RefreshToken은 훨씬 오래, 경우에 따라 무기한(사용자가 취소할 때까지) 유효합니다. RefreshToken 덕분에 TokenProvider 클래스는 AccessToken이 만료되면 언제든지 새롭게 갱신할 수 있습니다.
또 다른 옵션은 ITokenProvider 인터페이스입니다. 이를 통해 OAuth 메커니즘을 직접 구현할 뿐만 아니라 필요에 따라 SmtpClient에 전달하여 자체적으로 사용할 수 있습니다.
OAuth 메커니즘이 항상 필요한 것은 아니라는 점을 유념해야 합니다. 경우에 따라 사용자명·비밀번호만으로 로그인하는 것이 훨씬 간단합니다. 이를 위해 이메일 계정을 별도로 재구성하거나 2단계 인증을 해제할 필요가 없습니다. 보다 안전한 방법은 애플리케이션 전용 비밀번호를 사용하는 것입니다. 이 기능을 활용하려면 이메일 계정 설정을 확인하세요. 대부분의 경우 애플리케이션 비밀번호는 계정에 설정하면 자동으로 생성됩니다. 이를 어디엔가 저장해 두는 것을 잊지 마세요. 또한 설정 단계에서 애플리케이션 권한을 가능한 최소로 제한하는 것이 좋습니다. 물론 공격자가 이 비밀번호를 입수하면 계정을 완전히 장악하지는 못하더라도 여러 불쾌한 일을 할 수 있습니다. 여기서는 할 수 있는 것이 별로 없으며, 비밀번호가 데이터를 침입자로부터 보호하는 유일한 방어 수단이기 때문입니다. 전반적으로 이 도구는 매우 편리하지만 계정 보안을 낮추므로 위험을 감수하고 사용해야 합니다.
C++를 사용한 SMTP 이메일 전송
서버와 연결이 성공적으로 이루어지고 인증도 통과했습니다. 이제 메시지를 보내야 할 차례입니다. 전송에는 MailMessage 객체를 사용합니다. 기술적으로는 필요한 데이터를 바로 send 메서드에 전달할 수 있지만, 실제로는 여전히 MailMessage 객체에 데이터를 수집합니다. 이후 MailMessage 클래스가 EML 형식으로 직렬화하는 기능을 이용해 SMTP 서버에 전달할 데이터 스트림을 얻고, 서버에 전송 명령을 내려 메시지 본문을 텍스트 데이터 형태로 전달합니다. 첨부 파일 등 바이너리 데이터가 포함된 경우 Base64 형식으로 인코딩되며, 메타데이터는 수신자가 이를 다시 디코딩해야 함을 나타냅니다. SMTP 서버는 수신한 메시지의 정확성(예: FROM 필드와 서버의 발신자 계정 일치 여부)을 확인하고 필요에 따라 메타데이터를 추가로 보완합니다. 그런 다음 서버는 이메일 메타데이터에서 가져온 수신자 리스트에 따라 이메일을 전송합니다.