// Send a message.
// Specify profile, or leave it to wxWindows to find the current user name
- static bool Send(wxMailMessage& message, const wxString& profileName = wxEmptyString );
+ static bool Send(wxMailMessage& message, const wxString& profileName = wxEmptyString,
+ const wxString& sendMail = wxT("/usr/lib/sendmail -t"));
protected:
};
// A common usage
wxMailMessage(const wxString& subject, const wxString& to,
- const wxString& body, const wxString& attachment = wxEmptyString,
+ const wxString& body, const wxString& from = wxEmptyString,
+ const wxString& attachment = wxEmptyString,
const wxString& attachmentTitle = wxEmptyString)
{
m_to.Add(to);
m_subject = subject;
m_body = body;
+ m_from = from;
if (!attachment.IsEmpty())
{
m_attachments.Add(attachment);
void SetSubject(const wxString& subject) { m_subject = subject; }
void SetBody(const wxString& body) { m_body = body; }
+ void SetFrom(const wxString& from) { m_from = from; }
public:
wxArrayString m_to; //The To: Recipients
+ wxString m_from; //The From: email address (optional)
wxArrayString m_cc; //The CC: Recipients
wxArrayString m_bcc; //The BCC Recipients
wxString m_subject; //The Subject of the message
# Name "NetVC - Win32 Debug"
# Begin Source File
-SOURCE=.\smapi.cpp
+SOURCE=.\email.cpp
# End Source File
# Begin Source File
-SOURCE=.\email.cpp
+SOURCE=..\..\include\wx\net\email.h
# End Source File
# Begin Source File
-SOURCE=.\web.cpp
+SOURCE=..\..\include\wx\net\msg.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\readme.txt
+# End Source File
+# Begin Source File
+
+SOURCE=.\smapi.cpp
# End Source File
# Begin Source File
# End Source File
# Begin Source File
-SOURCE=.\readme.txt
+SOURCE=.\web.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\include\wx\net\web.h
# End Source File
# End Target
# End Project
#include "wx/net/smapi.h"
#endif
+#ifdef __UNIX__
+#include "wx/filefn.h"
+#include "wx/timer.h"
+#include "wx/wfstream.h"
+#include "stdlib.h"
+#include "process.h"
+#endif
+
// Send a message.
// Specify profile, or leave it to wxWindows to find the current user name
#ifdef __WXMSW__
-bool wxEmail::Send(wxMailMessage& message, const wxString& profileName)
+bool wxEmail::Send(wxMailMessage& message, const wxString& profileName, const wxString& WXUNUSED(sendMail))
{
wxASSERT (message.m_to.GetCount() > 0) ;
return session.Send(message);
}
+#elif defined(__UNIX__)
+bool wxEmail::Send(wxMailMessage& message, const wxString& profileName, const wxString& sendMail)
+{
+ wxASSERT (message.m_to.GetCount() > 0) ;
+
+ // The 'from' field is optionally supplied by the app; it's not needed
+ // by MAPI, and on Unix, will be guessed if not supplied.
+ wxString from = message.m_from;
+ if (from.IsEmpty())
+ {
+ from = wxGetEmailAddress();
+ }
+
+ wxASSERT (!from.IsEmpty());
+
+ wxString msg;
+ msg << wxT("To: ");
+
+ size_t i;
+ for (i = 0; i < message.m_to.GetCount(); i++)
+ {
+ msg << message.m_to[i];
+ if (i < message.m_to.GetCount())
+ msg << wxT(", ");
+ }
+
+ msg << wxT("\nFrom: ") << from << wxT("\nSubject: ") << message.m_subject;
+ msg << wxT("\n\n") << message.m_body;
+
+ wxString filename;
+ filename.Printf(wxT("/tmp/msg-%ld-%ld-%ld.txt"), (long) getpid(), wxGetLocalTime(),
+ (long) rand());
+
+ {
+ wxFileOutputStream stream(filename);
+ if (stream.Ok())
+ {
+ stream.Write(msg, msg.Length());
+ }
+ else
+ {
+ return FALSE ;
+ }
+ }
+
+ // TODO search for a suitable sendmail if sendMail is empty
+ wxString sendmail(sendMail);
+
+ wxString cmd;
+ cmd << sendmail << wxT(" < ") << filename;
+
+ // TODO: check return code
+ wxSystem(cmd.c_str());
+
+ wxRemoveFile(filename);
+
+ return TRUE;
+}
#else
#error Send not yet implemented for this platform.
#endif
//Allocate the recipients array
mapiMessage.lpRecips = new MapiRecipDesc[mapiMessage.nRecipCount];
+
+ // If we have a 'From' field, use it
+ if (!message.m_from.IsEmpty())
+ {
+ mapiMessage.lpOriginator = new MapiRecipDesc;
+ ZeroMemory(mapiMessage.lpOriginator, sizeof(MapiRecipDesc));
+
+ mapiMessage.lpOriginator->ulRecipClass = MAPI_ORIG;
+ // TODO Do we have to call Resolve?
+ mapiMessage.lpOriginator->lpszName = (LPSTR) message.m_from.c_str();
+ }
//Setup the "To" recipients
int nRecipIndex = 0;
if (nAttachmentSize)
delete [] mapiMessage.lpFiles;
- //Free up the Recipients memory
+ //Free up the Recipients and Originator memory
delete [] mapiMessage.lpRecips;
+ delete mapiMessage.lpOriginator;
return bSuccess;
}