120 lines
14 KiB
C++
Raw Normal View History

/*
* Purpose: wxWindows email implementation
* Author: Frank Bu<EFBFBD>
* Created: 2002
*/
#include "email.h"
#include "Base64.h"
wxEmailMessage::wxEmailMessage(const wxString& subject, const wxString& text, const wxString& from) :
m_subject(subject),
m_text(text),
m_from(from)
{
}
const wxString& wxEmailMessage::GetFrom()
{
return m_from;
}
void wxEmailMessage::AddRecipient(const wxString& address)
{
m_rcptArray.Add(address);
}
void wxEmailMessage::AddTo(const wxString& address)
{
m_toArray.Add(address);
}
void wxEmailMessage::AddCc(const wxString& address)
{
m_ccArray.Add(address);
}
void wxEmailMessage::AddBcc(const wxString& address)
{
m_bccArray.Add(address);
}
void wxEmailMessage::AddFile(const wxFileName& fileName, const wxString mimeMainType, const wxString mimeSubType)
{
// add new entry
m_mimeParts.Add(wxMimePart(fileName));
}
wxRecipientsIterator wxEmailMessage::GetRecipientsIterator()
{
return wxRecipientsIterator(*this);
}
void wxEmailMessage::Encode(wxOutputStream& out)
{
// TODO: use only MIME if neccessary
wxString header;
wxString cr(wxT("\x00d\x00a"));
// TODO: calculate a more random boundary
wxString boundary(wxT("---_0123456789-boundary-9876543210_---"));
wxString boundarySep = wxT("--") + boundary + cr;
header << wxT("From: ") << m_from << cr;
// TODO: add to, cc and bcc in the right format with line breaking, if too long
header << wxT("Bcc:") << cr
<< wxT("Subject: ") << m_subject << cr // TODO: add Date:
<< wxT("MIME-Version: 1.0") << cr
<< wxT("Content-Type: multipart/mixed; boundary=\"") << boundary << wxT("\"") << cr
<< cr
<< cr
<< wxT("This is a multi-part message in MIME format") << cr
<< cr
<< boundarySep
<< wxT("Content-Type: text/plain; charset=iso-8859-1") << cr
<< wxT("Content-Transfer-Encoding: 8bit") << cr
<< cr
<< m_text << cr; // TODO: is it possible in MIME message to have a single '.' on a line?
out.Write((const char*) header.mb_str(), header.Length());
for (size_t i = 0; i < m_mimeParts.GetCount(); i++) {
out.Write((const char*) boundarySep.mb_str(), boundarySep.Length());
m_mimeParts[i].Encode(out);
}
wxString footer = wxT("--") + boundary + wxT("--") + cr + wxT(".") + cr; // TODO: perhaps moving the '.\r\n' sequence to another place
out.Write((const char*) footer.mb_str(), footer.Length());
}
wxRecipientsIterator::wxRecipientsIterator(const wxEmailMessage& emailMessage) :
m_emailMessage(emailMessage)
{
m_rcptCount = 0;
m_toCount = 0;
m_ccCount = 0;
m_bccCount = 0;
}
bool wxRecipientsIterator::HasNext()
{
if (m_rcptCount < m_emailMessage.m_rcptArray.GetCount() ||
m_toCount < m_emailMessage.m_toArray.GetCount() ||
m_ccCount < m_emailMessage.m_ccArray.GetCount() ||
m_bccCount < m_emailMessage.m_bccArray.GetCount())
{
return true;
}
return false;
}
wxString wxRecipientsIterator::GetNext()
{
if (m_rcptCount < m_emailMessage.m_rcptArray.GetCount()) {
return m_emailMessage.m_rcptArray[m_rcptCount++];
} else if (m_toCount < m_emailMessage.m_toArray.GetCount()) {
return m_emailMessage.m_toArray[m_toCount++];
} else if (m_ccCount < m_emailMessage.m_ccArray.GetCount()) {
return m_emailMessage.m_ccArray[m_ccCount++];
} else if (m_bccCount < m_emailMessage.m_bccArray.GetCount()) {
return m_emailMessage.m_bccArray[m_bccCount++];
}
return wxT("");
}