SMTP works again.

* The message to send the mails never made it to the add-on looper.
* Mail protocol threads now have names.
* Added a "public" BOutboundMailProtocol::SendMessages() call that sends
  itself a message (even the correct one this time).
This commit is contained in:
Axel Dörfler
2015-11-22 11:35:17 +01:00
parent 44d78872df
commit 62eec60079
7 changed files with 59 additions and 46 deletions
+11 -5
View File
@@ -1,5 +1,5 @@
/*
* Copyright 2004-2013, Haiku, Inc. All Rights Reserved.
* Copyright 2004-2015, Haiku, Inc. All Rights Reserved.
* Copyright 2001 Dr. Zoidberg Enterprises. All rights reserved.
* Copyright 2011 Clemens Zeidler. All rights reserved.
*
@@ -52,7 +52,7 @@ typedef status_t BMailFilterAction;
class BMailProtocol : public BLooper {
public:
BMailProtocol(
BMailProtocol(const char* name,
const BMailAccountSettings& settings);
virtual ~BMailProtocol();
@@ -109,6 +109,8 @@ protected:
const BMailProtocolSettings& settings);
private:
static BString _LooperName(const char* name,
const BMailAccountSettings& settings);
BMailFilter* _LoadFilter(const BMailAddOnSettings& settings);
BMailFilterAction _ProcessHeaderFetched(entry_ref& ref,
BFile& mail, BMessage& attributes);
@@ -127,7 +129,7 @@ private:
class BInboundMailProtocol : public BMailProtocol {
public:
BInboundMailProtocol(
BInboundMailProtocol(const char* name,
const BMailAccountSettings& settings);
virtual ~BInboundMailProtocol();
@@ -147,13 +149,17 @@ protected:
class BOutboundMailProtocol : public BMailProtocol {
public:
BOutboundMailProtocol(
BOutboundMailProtocol(const char* name,
const BMailAccountSettings& settings);
virtual ~BOutboundMailProtocol();
virtual status_t SendMessages(const BMessage& message,
off_t totalBytes);
virtual void MessageReceived(BMessage* message);
virtual status_t SendMessages(const BMessage& message,
protected:
virtual status_t HandleSendMessages(const BMessage& message,
off_t totalBytes) = 0;
};
@@ -15,7 +15,7 @@
IMAPProtocol::IMAPProtocol(const BMailAccountSettings& settings)
:
BInboundMailProtocol(settings),
BInboundMailProtocol("IMAP", settings),
fSettings(settings.Name(), settings.InboundSettings()),
fWorkers(5, false)
{
@@ -1,5 +1,5 @@
/*
* Copyright 2007-2013, Haiku, Inc. All rights reserved.
* Copyright 2007-2015, Haiku, Inc. All rights reserved.
* Copyright 2001-2002 Dr. Zoidberg Enterprises. All rights reserved.
* Copyright 2011, Clemens Zeidler <[email protected]>
*
@@ -69,7 +69,7 @@ NotHere(BStringList& that, BStringList& otherList, BStringList* results)
POP3Protocol::POP3Protocol(const BMailAccountSettings& settings)
:
BInboundMailProtocol(settings),
BInboundMailProtocol("POP3", settings),
fNumMessages(-1),
fMailDropSize(0),
fServerConnection(NULL)
@@ -248,7 +248,7 @@ SplitChallengeIntoMap(BString str, map<BString,BString>& m)
SMTPProtocol::SMTPProtocol(const BMailAccountSettings& settings)
:
BOutboundMailProtocol(settings),
BOutboundMailProtocol("SMTP", settings),
fAuthType(0)
{
fSettingsMessage = settings.OutboundSettings();
@@ -329,7 +329,7 @@ SMTPProtocol::Disconnect()
//! Process EMail to be sent
status_t
SMTPProtocol::SendMessages(const BMessage& message, off_t totalBytes)
SMTPProtocol::HandleSendMessages(const BMessage& message, off_t totalBytes)
{
type_code type;
int32 count;
@@ -337,6 +337,9 @@ SMTPProtocol::SendMessages(const BMessage& message, off_t totalBytes)
if (status != B_OK)
return status;
// TODO: sort out already sent messages -- the request could
// be issued while we're busy sending them already
SetTotalItems(count);
SetTotalItemsSize(totalBytes);
@@ -27,10 +27,11 @@ public:
const BMailAccountSettings& settings);
virtual ~SMTPProtocol();
protected:
status_t Connect();
void Disconnect();
virtual status_t SendMessages(const BMessage& message,
virtual status_t HandleSendMessages(const BMessage& message,
off_t totalBytes);
status_t Open(const char *server, int port, bool esmtp);
+36 -10
View File
@@ -1,5 +1,5 @@
/*
* Copyright 2011-2013, Haiku, Inc. All rights reserved.
* Copyright 2011-2015, Haiku, Inc. All rights reserved.
* Copyright 2001-2003 Dr. Zoidberg Enterprises. All rights reserved.
*/
@@ -43,11 +43,11 @@ using namespace BPrivate;
const uint32 kMsgDeleteMessage = '&DeM';
const uint32 kMsgAppendMessage = '&ApM';
const uint32 kMsgSendMessage = '&SeM';
BMailProtocol::BMailProtocol(const BMailAccountSettings& settings)
BMailProtocol::BMailProtocol(const char* name,
const BMailAccountSettings& settings)
:
BLooper(_LooperName(name, settings)),
fAccountSettings(settings),
fMailNotifier(NULL)
{
@@ -273,6 +273,20 @@ BMailProtocol::LoadFilters(const BMailProtocolSettings& settings)
}
/*static*/ BString
BMailProtocol::_LooperName(const char* addOnName,
const BMailAccountSettings& settings)
{
BString name = addOnName;
const char* accountName = settings.Name();
if (accountName != NULL && accountName[0] != '\0')
name << " " << accountName;
return name;
}
BMailFilter*
BMailProtocol::_LoadFilter(const BMailAddOnSettings& settings)
{
@@ -374,9 +388,10 @@ BMailProtocol::_NotifyBodyFetched(const entry_ref& ref, BFile& file,
// #pragma mark -
BInboundMailProtocol::BInboundMailProtocol(const BMailAccountSettings& settings)
BInboundMailProtocol::BInboundMailProtocol(const char* name,
const BMailAccountSettings& settings)
:
BMailProtocol(settings)
BMailProtocol(name, settings)
{
LoadFilters(fAccountSettings.InboundSettings());
}
@@ -472,10 +487,10 @@ BInboundMailProtocol::NotiyMailboxSynchronized(status_t status)
// #pragma mark -
BOutboundMailProtocol::BOutboundMailProtocol(
BOutboundMailProtocol::BOutboundMailProtocol(const char* name,
const BMailAccountSettings& settings)
:
BMailProtocol(settings)
BMailProtocol(name, settings)
{
LoadFilters(fAccountSettings.OutboundSettings());
}
@@ -486,12 +501,23 @@ BOutboundMailProtocol::~BOutboundMailProtocol()
}
status_t
BOutboundMailProtocol::SendMessages(const BMessage& files, off_t totalBytes)
{
BMessage message(kMsgSendMessages);
message.Append(files);
message.AddInt64("bytes", totalBytes);
return BMessenger(this).SendMessage(&message);
}
void
BOutboundMailProtocol::MessageReceived(BMessage* message)
{
switch (message->what) {
case kMsgSendMessage:
SendMessages(*message, message->FindInt64("bytes"));
case kMsgSendMessages:
HandleSendMessages(*message, message->FindInt64("bytes"));
break;
default:
+2 -25
View File
@@ -94,25 +94,6 @@ public:
};
class OutboundMessenger : public BMessenger {
public:
OutboundMessenger(BOutboundMailProtocol* protocol)
:
BMessenger(protocol)
{
}
status_t SendMessages(const BMessage& files, off_t totalBytes)
{
BMessage message(kMsgSendMessages);
message.Append(files);
message.AddInt64("bytes", totalBytes);
return SendMessage(&message);
}
};
// #pragma mark -
@@ -498,12 +479,8 @@ MailDaemonApplication::SendPendingMessages(BMessage* msg)
{
BVolumeRoster roster;
BVolume volume;
std::map<int32, send_mails_info> messages;
int32 account = -1;
if (msg->FindInt32("account", &account) != B_OK)
account = -1;
int32 account = msg->GetInt32("account", -1);
if (!msg->HasString("message_path")) {
while (roster.GetNextVolume(&volume) == B_OK) {
@@ -564,7 +541,7 @@ MailDaemonApplication::SendPendingMessages(BMessage* msg)
if (info.bytes == 0)
continue;
OutboundMessenger(protocol).SendMessages(info.files, info.bytes);
protocol->SendMessages(info.files, info.bytes);
}
}