120 lines
14 KiB
C++
120 lines
14 KiB
C++
/*
|
|
* Purpose: wxWindows email implementation
|
|
* Author: Frank Buß
|
|
* 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("");
|
|
}
|
|
|