105 lines
6.8 KiB
C++
105 lines
6.8 KiB
C++
|
/*
|
|||
|
* Purpose: private wxWindows mail transport implementation
|
|||
|
* Author: Frank Bu<EFBFBD>
|
|||
|
* Created: 2002
|
|||
|
*/
|
|||
|
|
|||
|
#include <wx/sckstrm.h>
|
|||
|
|
|||
|
#include "smtp.h"
|
|||
|
#include "states.h"
|
|||
|
|
|||
|
#define SOCKET_ID 1
|
|||
|
|
|||
|
wxSMTPListener g_nullListener;
|
|||
|
|
|||
|
wxSMTP::wxSMTP(wxSMTPListener* pListener) :
|
|||
|
m_pMailState(&g_initialState)
|
|||
|
{
|
|||
|
if (pListener) {
|
|||
|
m_pListener = pListener;
|
|||
|
} else {
|
|||
|
m_pListener = &g_nullListener;
|
|||
|
}
|
|||
|
m_pMessage = NULL;
|
|||
|
}
|
|||
|
|
|||
|
wxSMTP::~wxSMTP()
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
void wxSMTP::EvaluateLine(const wxString& line)
|
|||
|
{
|
|||
|
// TODO: implementing response timeout somewhere
|
|||
|
// TODO: implementing multiline response
|
|||
|
|
|||
|
// get command
|
|||
|
unsigned long cmd = 0;
|
|||
|
line.ToULong(&cmd);
|
|||
|
m_pMailState->onResponse(*this, cmd);
|
|||
|
}
|
|||
|
|
|||
|
void wxSMTP::OnConnect(wxSocketEvent& event)
|
|||
|
{
|
|||
|
m_pMailState->onConnect(*this, event);
|
|||
|
}
|
|||
|
|
|||
|
void wxSMTP::Send(wxEmailMessage* pMessage)
|
|||
|
{
|
|||
|
// no message means nothing to do
|
|||
|
if (!pMessage) return;
|
|||
|
m_pMessage = pMessage;
|
|||
|
|
|||
|
// add recipients from message
|
|||
|
wxRecipientsIterator ri = m_pMessage->GetRecipientsIterator();
|
|||
|
while (ri.HasNext()) m_recipients.Add(ri.GetNext());
|
|||
|
m_count = 0;
|
|||
|
|
|||
|
// init new socket connection
|
|||
|
m_pMailState = &g_initialState;
|
|||
|
Connect();
|
|||
|
}
|
|||
|
|
|||
|
void wxSMTP::ChangeState(const MailState& mailState)
|
|||
|
{
|
|||
|
m_pMailState = &mailState;
|
|||
|
}
|
|||
|
|
|||
|
void wxSMTP::SendNextRecipient()
|
|||
|
{
|
|||
|
if (m_count < m_recipients.GetCount()) {
|
|||
|
m_currentRecipient = m_recipients[m_count++];
|
|||
|
Write(wxT("RCPT TO:<") + m_currentRecipient + wxT(">\x00d\x00a"));
|
|||
|
} else {
|
|||
|
ChangeState(g_startDataState);
|
|||
|
Write(wxT("DATA\x00d\x00a"));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void wxSMTP::OnRecipientError()
|
|||
|
{
|
|||
|
m_pListener->OnRecipientAdded(m_currentRecipient, 0);
|
|||
|
}
|
|||
|
|
|||
|
void wxSMTP::OnRecipientSuccess()
|
|||
|
{
|
|||
|
m_pListener->OnRecipientAdded(m_currentRecipient, 1);
|
|||
|
}
|
|||
|
|
|||
|
void wxSMTP::OnDataSuccess()
|
|||
|
{
|
|||
|
m_pListener->OnDataSent(1);
|
|||
|
}
|
|||
|
|
|||
|
void wxSMTP::SendFrom()
|
|||
|
{
|
|||
|
Write(wxT("MAIL FROM:<") + m_pMessage->GetFrom() + wxT(">\x00d\x00a"));
|
|||
|
}
|
|||
|
|
|||
|
void wxSMTP::SendData()
|
|||
|
{
|
|||
|
wxSocketOutputStream out(*this);
|
|||
|
// wxFileOutputStream out("mail.txt");
|
|||
|
m_pMessage->Encode(out);
|
|||
|
}
|
|||
|
|