summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/qtmail/app/emailclient.cpp47
-rw-r--r--examples/qtmail/app/emailclient.h3
-rw-r--r--src/libraries/messageserver/qmailmessageservice.cpp10
-rw-r--r--src/libraries/messageserver/qmailmessageservice.h1
-rw-r--r--src/libraries/qtopiamail/qmailmessageserver.cpp13
-rw-r--r--src/libraries/qtopiamail/qmailmessageserver.h1
-rw-r--r--src/libraries/qtopiamail/qmailserviceaction.cpp23
-rw-r--r--src/libraries/qtopiamail/qmailserviceaction.h5
-rw-r--r--src/libraries/qtopiamail/qmailserviceaction_p.h7
-rw-r--r--src/plugins/messageservices/smtp/smtpservice.cpp26
-rw-r--r--src/tools/messageserver/mailmessageclient.cpp2
-rw-r--r--src/tools/messageserver/mailmessageclient.h1
-rw-r--r--src/tools/messageserver/messageserver.cpp2
-rw-r--r--src/tools/messageserver/servicehandler.cpp11
-rw-r--r--src/tools/messageserver/servicehandler.h2
15 files changed, 107 insertions, 47 deletions
diff --git a/examples/qtmail/app/emailclient.cpp b/examples/qtmail/app/emailclient.cpp
index b43eff8d..416f69a1 100644
--- a/examples/qtmail/app/emailclient.cpp
+++ b/examples/qtmail/app/emailclient.cpp
@@ -470,6 +470,7 @@ EmailClient::EmailClient(QWidget *parent, Qt::WindowFlags f)
enableMessageActions(false),
closeAfterTransmissions(false),
closeAfterWrite(false),
+ transmissionFailure(false),
fetchTimer(this),
autoGetMail(false),
initialAction(None),
@@ -1096,10 +1097,7 @@ void EmailClient::enqueueMail(QMailMessage& mail)
mail.setStatus(QMailMessage::TransmitFromExternal, true);
}
- // This message should be marked as a draft, and flagged for transmission
- // Don't use flagMessages - we don't want this to be transmitted to a server
- // as a draft unless transmission fails
- mail.setStatus((QMailMessage::Outbox | QMailMessage::Draft), true);
+ mail.setStatus(QMailMessage::Outbox, true);
bool inserted(false);
if (!mail.id().isValid()) {
@@ -1178,6 +1176,7 @@ void EmailClient::mailResponded()
// each message that belongs to the current found account
void EmailClient::sendAllQueuedMail(bool userRequest)
{
+ transmissionFailure = false;
QMailMessageKey outboxFilter(QMailMessageKey::status(QMailMessage::Outbox));
if (transmitAccountIds.isEmpty()) {
@@ -1214,14 +1213,6 @@ void EmailClient::sendAllQueuedMail(bool userRequest)
setSendingInProgress(true);
transmitAction("Sending messages")->transmitMessages(transmitId);
return;
- } else {
- // Move this account's outbox messages to Drafts
- QMailMessageKey accountFilter(QMailMessageKey::parentAccountId(transmitId));
- QMailMessageIdList unsentIds(QMailStore::instance()->queryMessages(accountFilter & outboxFilter));
-
- moveToStandardFolder(unsentIds,QMailFolder::DraftsFolder);
- flagMessages(unsentIds,QMailMessage::Draft,QMailMessage::Outbox,"Moving messages to drafts");
-
}
}
}
@@ -1410,6 +1401,15 @@ bool EmailClient::verifyAccount(const QMailAccountId &accountId, bool outgoing)
void EmailClient::transmitCompleted()
{
+ // Check for messages that could nto be sent, e.g. due to bad recipients
+ if (transmissionFailure) {
+ transmissionFailure = false;
+ const QMailServiceAction::Status status(m_transmitAction->status());
+ transferFailure(status.accountId,
+ tr("Some messages could not be sent and have been left in the outbox. Verify that recipient addresses are well formed."),
+ QMailServiceAction::Status::ErrInvalidAddress);
+ }
+
// If there are more SMTP accounts to service, continue
if (!transmitAccountIds.isEmpty()) {
sendAllQueuedMail();
@@ -2053,6 +2053,12 @@ void EmailClient::progressChanged(uint progress, uint total)
// emit updateProgress(progress, total);
}
+void EmailClient::messagesFailedTransmission()
+{
+ transmissionFailure = true;
+}
+
+
void EmailClient::flagRetrievalActivityChanged(QMailServiceAction::Activity activity)
{
if (QMailServiceAction *action = static_cast<QMailServiceAction*>(sender())) {
@@ -2547,9 +2553,6 @@ void EmailClient::setSendingInProgress(bool set)
} else {
if (primaryActivity == Sending)
primaryActivity = Inactive;
-
- // Anything we could not send should move back to the drafts folder
- clearOutboxFolder();
}
if (isSending() != set) {
@@ -2594,18 +2597,6 @@ void EmailClient::transferStatusUpdate(int status)
}
-void EmailClient::clearOutboxFolder()
-{
- QMailMessageKey outboxFilter(QMailMessageKey::status(QMailMessage::Outbox));
- QMailMessageIdList unsentIds(QMailStore::instance()->queryMessages(outboxFilter));
-
- // Set any unsent messages back to draft, and remove Outbox status
- if (!unsentIds.isEmpty()) {
- moveToStandardFolder(unsentIds,QMailFolder::DraftsFolder);
- flagMessages(unsentIds, QMailMessage::Draft, QMailMessage::Outbox,"Clearing outbox folder");
- }
-}
-
void EmailClient::contextStatusUpdate()
{
if (isTransmitting())
@@ -2794,6 +2785,8 @@ QMailTransmitAction* EmailClient::transmitAction(const QString& description)
{
m_transmitAction = new QMailTransmitAction(this);
connectServiceAction(m_transmitAction);
+ connect(m_transmitAction, SIGNAL(messagesFailedTransmission(QMailMessageIdList, QMailServiceAction::Status::ErrorCode)),
+ this, SLOT(messagesFailedTransmission()));
}
ServiceActionStatusItem* newItem = new ServiceActionStatusItem(m_transmitAction,description);
diff --git a/examples/qtmail/app/emailclient.h b/examples/qtmail/app/emailclient.h
index b9b8c7d9..d467a1d7 100644
--- a/examples/qtmail/app/emailclient.h
+++ b/examples/qtmail/app/emailclient.h
@@ -213,6 +213,7 @@ protected slots:
void activityChanged(QMailServiceAction::Activity activity);
void statusChanged(const QMailServiceAction::Status &status);
void progressChanged(uint progress, uint total);
+ void messagesFailedTransmission();
void flagRetrievalActivityChanged(QMailServiceAction::Activity activity);
@@ -328,7 +329,6 @@ private:
void transferStatusUpdate(int status);
void setSuspendPermitted(bool y);
- void clearOutboxFolder();
void updateGetMailButton();
void updateGetAccountButton();
@@ -416,6 +416,7 @@ private:
bool closeAfterTransmissions;
bool closeAfterWrite;
+ bool transmissionFailure;
QTimer fetchTimer;
bool autoGetMail;
diff --git a/src/libraries/messageserver/qmailmessageservice.cpp b/src/libraries/messageserver/qmailmessageservice.cpp
index fae7f4c8..0617f10e 100644
--- a/src/libraries/messageserver/qmailmessageservice.cpp
+++ b/src/libraries/messageserver/qmailmessageservice.cpp
@@ -1116,6 +1116,8 @@ QMailMessageSink::~QMailMessageSink()
Successfully transmitted messages should be progressively reported via messagesTransmitted().
+ Messages for which for which an unsuccessful attempt to transmit has been made should be progressively reported via messagesFailedTransmission().
+
Return true if an operation is initiated.
*/
bool QMailMessageSink::transmitMessages(const QMailMessageIdList &ids)
@@ -1139,6 +1141,14 @@ void QMailMessageSink::notImplemented()
Signal emitted by the sink to report the successful transmission of the messages listed in \a ids.
*/
+/*!
+ \fn void QMailMessageSink::messagesFailedTransmission(const QMailMessageIdList &ids, QMailServiceAction::Status::ErrorCode error);
+
+ Signal emitted by the sink to report the failure of an attempt at transmission of the messages listed in \a ids.
+
+ The failure is of type \a error.
+*/
+
/*!
\class QMailMessageService
diff --git a/src/libraries/messageserver/qmailmessageservice.h b/src/libraries/messageserver/qmailmessageservice.h
index 6541a3b2..6be1eed2 100644
--- a/src/libraries/messageserver/qmailmessageservice.h
+++ b/src/libraries/messageserver/qmailmessageservice.h
@@ -204,6 +204,7 @@ public slots:
signals:
void messagesTransmitted(const QMailMessageIdList &ids);
+ void messagesFailedTransmission(const QMailMessageIdList &ids, QMailServiceAction::Status::ErrorCode);
protected:
QMailMessageSink(QMailMessageService *service);
diff --git a/src/libraries/qtopiamail/qmailmessageserver.cpp b/src/libraries/qtopiamail/qmailmessageserver.cpp
index 30bcd446..5870b503 100644
--- a/src/libraries/qtopiamail/qmailmessageserver.cpp
+++ b/src/libraries/qtopiamail/qmailmessageserver.cpp
@@ -198,6 +198,8 @@ QMailMessageServerPrivate::QMailMessageServerPrivate(QMailMessageServer* parent)
parent, SIGNAL(retrievalCompleted(quint64)));
connectIpc(adaptor, MESSAGE(messagesTransmitted(quint64, QMailMessageIdList)),
parent, SIGNAL(messagesTransmitted(quint64, QMailMessageIdList)));
+ connectIpc(adaptor, MESSAGE(messagesFailedTransmission(quint64, QMailMessageIdList, QMailServiceAction::Status::ErrorCode)),
+ parent, SIGNAL(messagesFailedTransmission(quint64, QMailMessageIdList, QMailServiceAction::Status::ErrorCode)));
connectIpc(adaptor, MESSAGE(transmissionCompleted(quint64)),
parent, SIGNAL(transmissionCompleted(quint64)));
connectIpc(adaptor, MESSAGE(matchingMessageIds(quint64, QMailMessageIdList)),
@@ -322,6 +324,17 @@ QMailMessageServerPrivate::~QMailMessageServerPrivate()
*/
/*!
+ \fn void QMailMessageServer::messagesFailedTransmitted(quint64 action, const QMailMessageIdList& list, QMailServiceAction::Status::ErrorCode error);
+
+ Emitted when a failed attempt has been made to transmit messages identified by \a list to the external server,
+ in response to the request identified by \a action.
+
+ The error is described by \a error.
+
+ \sa transmitMessages()
+*/
+
+/*!
\fn void QMailMessageServer::transmissionCompleted(quint64 action);
Emitted when the transmit operation identified by \a action is completed.
diff --git a/src/libraries/qtopiamail/qmailmessageserver.h b/src/libraries/qtopiamail/qmailmessageserver.h
index 7902108f..b36cf098 100644
--- a/src/libraries/qtopiamail/qmailmessageserver.h
+++ b/src/libraries/qtopiamail/qmailmessageserver.h
@@ -84,6 +84,7 @@ signals:
void retrievalCompleted(quint64);
void messagesTransmitted(quint64, const QMailMessageIdList&);
+ void messagesFailedTransmission(quint64, const QMailMessageIdList&, QMailServiceAction::Status::ErrorCode);
void transmissionCompleted(quint64);
void messagesDeleted(quint64, const QMailMessageIdList&);
diff --git a/src/libraries/qtopiamail/qmailserviceaction.cpp b/src/libraries/qtopiamail/qmailserviceaction.cpp
index 445847ac..e9553403 100644
--- a/src/libraries/qtopiamail/qmailserviceaction.cpp
+++ b/src/libraries/qtopiamail/qmailserviceaction.cpp
@@ -912,6 +912,8 @@ QMailTransmitActionPrivate::QMailTransmitActionPrivate(QMailTransmitAction *i)
{
connect(_server, SIGNAL(messagesTransmitted(quint64, QMailMessageIdList)),
this, SLOT(messagesTransmitted(quint64, QMailMessageIdList)));
+ connect(_server, SIGNAL(messagesFailedTransmission(quint64, QMailMessageIdList, QMailServiceAction::Status::ErrorCode)),
+ this, SLOT(messagesFailedTransmission(quint64, QMailMessageIdList, QMailServiceAction::Status::ErrorCode)));
connect(_server, SIGNAL(transmissionCompleted(quint64)),
this, SLOT(transmissionCompleted(quint64)));
@@ -922,31 +924,32 @@ void QMailTransmitActionPrivate::transmitMessages(const QMailAccountId &accountI
{
_server->transmitMessages(newAction(), accountId);
- QMailAccount account(accountId);
- _ids = QMailStore::instance()->queryMessages(QMailMessageKey::parentAccountId(accountId) & QMailMessageKey::status(QMailMessage::Outbox));
-
emitChanges();
}
void QMailTransmitActionPrivate::init()
{
QMailServiceActionPrivate::init();
-
- _ids.clear();
}
void QMailTransmitActionPrivate::messagesTransmitted(quint64 action, const QMailMessageIdList &ids)
{
if (validAction(action)) {
- foreach (const QMailMessageId &id, ids)
- _ids.removeAll(id);
+ emit messagesTransmitted(ids);
+ }
+}
+
+void QMailTransmitActionPrivate::messagesFailedTransmission(quint64 action, const QMailMessageIdList &ids, QMailServiceAction::Status::ErrorCode error)
+{
+ if (validAction(action)) {
+ emit messagesFailedTransmission(ids, error);
}
}
void QMailTransmitActionPrivate::transmissionCompleted(quint64 action)
{
if (validAction(action)) {
- QMailServiceAction::Activity result(_ids.isEmpty() ? QMailServiceAction::Successful : QMailServiceAction::Failed);
+ QMailServiceAction::Activity result(QMailServiceAction::Successful);
setActivity(result);
emitChanges();
}
@@ -983,6 +986,10 @@ void QMailTransmitActionPrivate::transmissionCompleted(quint64 action)
QMailTransmitAction::QMailTransmitAction(QObject *parent)
: QMailServiceAction(new QMailTransmitActionPrivate(this), parent)
{
+ connect(impl(this), SIGNAL(messagesTransmitted(QMailMessageIdList)),
+ this, SIGNAL(messagesTransmitted(QMailMessageIdList)));
+ connect(impl(this), SIGNAL(messagesFailedTransmission(QMailMessageIdList, QMailServiceAction::Status::ErrorCode)),
+ this, SIGNAL(messagesFailedTransmission(QMailMessageIdList, QMailServiceAction::Status::ErrorCode)));
}
/*! \internal */
diff --git a/src/libraries/qtopiamail/qmailserviceaction.h b/src/libraries/qtopiamail/qmailserviceaction.h
index e3f67c82..4a4f80d1 100644
--- a/src/libraries/qtopiamail/qmailserviceaction.h
+++ b/src/libraries/qtopiamail/qmailserviceaction.h
@@ -207,8 +207,13 @@ public:
QMailTransmitAction(QObject *parent = 0);
~QMailTransmitAction();
+signals:
+ void messagesTransmitted(const QMailMessageIdList &ids);
+ void messagesFailedTransmission(const QMailMessageIdList &ids, QMailServiceAction::Status::ErrorCode);
+
public slots:
void transmitMessages(const QMailAccountId &accountId);
+
};
diff --git a/src/libraries/qtopiamail/qmailserviceaction_p.h b/src/libraries/qtopiamail/qmailserviceaction_p.h
index 49a23c96..3330a263 100644
--- a/src/libraries/qtopiamail/qmailserviceaction_p.h
+++ b/src/libraries/qtopiamail/qmailserviceaction_p.h
@@ -155,17 +155,20 @@ public:
void transmitMessages(const QMailAccountId &accountId);
+signals:
+ void messagesTransmitted(const QMailMessageIdList &ids);
+ void messagesFailedTransmission(const QMailMessageIdList &ids, QMailServiceAction::Status::ErrorCode);
+
protected:
virtual void init();
protected slots:
void messagesTransmitted(quint64, const QMailMessageIdList &id);
+ void messagesFailedTransmission(quint64, const QMailMessageIdList &id, QMailServiceAction::Status::ErrorCode);
void transmissionCompleted(quint64);
private:
friend class QMailTransmitAction;
-
- QMailMessageIdList _ids;
};
diff --git a/src/plugins/messageservices/smtp/smtpservice.cpp b/src/plugins/messageservices/smtp/smtpservice.cpp
index bb38ac6f..2a44b746 100644
--- a/src/plugins/messageservices/smtp/smtpservice.cpp
+++ b/src/plugins/messageservices/smtp/smtpservice.cpp
@@ -42,6 +42,7 @@
#include "smtpservice.h"
#include "smtpsettings.h"
#include <QtPlugin>
+#include <QTimer>
namespace { const QString serviceKey("smtp"); }
@@ -70,26 +71,33 @@ private:
bool SmtpService::Sink::transmitMessages(const QMailMessageIdList &ids)
{
- QMailServiceAction::Status::ErrorCode errorCode = QMailServiceAction::Status::ErrNoError;
+ bool messageQueued = false;
+ QMailMessageIdList failedMessages;
QString errorText;
if (!ids.isEmpty()) {
foreach (const QMailMessageId id, ids) {
QMailMessage message(id);
- if ((errorCode = _service->_client.addMail(message)) != QMailServiceAction::Status::ErrNoError) {
- errorText = tr("Unable to addMail");
- break;
+ if (_service->_client.addMail(message) == QMailServiceAction::Status::ErrNoError) {
+ messageQueued = true;
+ } else {
+ failedMessages << id;
}
}
}
+
+ if (failedMessages.count()) {
+ emit messagesFailedTransmission(failedMessages, QMailServiceAction::Status::ErrInvalidAddress);
+ }
- if (errorCode == QMailServiceAction::Status::ErrNoError) {
+ if (messageQueued) {
+ // At least one message could be queued for sending
_service->_client.newConnection();
- return true;
+ } else {
+ // No messages to send, so sending completed successfully
+ QTimer::singleShot(0, this, SLOT(sendCompleted()));
}
-
- _service->errorOccurred(errorCode, errorText);
- return false;
+ return true;
}
void SmtpService::Sink::messageTransmitted(const QMailMessageId &id)
diff --git a/src/tools/messageserver/mailmessageclient.cpp b/src/tools/messageserver/mailmessageclient.cpp
index f141d91a..849bb303 100644
--- a/src/tools/messageserver/mailmessageclient.cpp
+++ b/src/tools/messageserver/mailmessageclient.cpp
@@ -71,6 +71,8 @@ MailMessageClient::MailMessageClient(QObject* parent)
adaptor, MESSAGE(transmissionCompleted(quint64)));
connectIpc(this, SIGNAL(messagesTransmitted(quint64, QMailMessageIdList)),
adaptor, MESSAGE(messagesTransmitted(quint64, QMailMessageIdList)));
+ connectIpc(this, SIGNAL(messagesFailedTransmission(quint64, QMailMessageIdList, QMailServiceAction::Status::ErrorCode)),
+ adaptor, MESSAGE(messagesFailedTransmission(quint64, QMailMessageIdList, QMailServiceAction::Status::ErrorCode)));
connectIpc(this, SIGNAL(retrievalCompleted(quint64)),
adaptor, MESSAGE(retrievalCompleted(quint64)));
connectIpc(this, SIGNAL(messagesDeleted(quint64, QMailMessageIdList)),
diff --git a/src/tools/messageserver/mailmessageclient.h b/src/tools/messageserver/mailmessageclient.h
index 18c3f9fc..b7f008bb 100644
--- a/src/tools/messageserver/mailmessageclient.h
+++ b/src/tools/messageserver/mailmessageclient.h
@@ -115,6 +115,7 @@ signals:
void retrievalCompleted(quint64);
void messagesTransmitted(quint64, const QMailMessageIdList&);
+ void messagesFailedTransmission(quint64, const QMailMessageIdList&, QMailServiceAction::Status::ErrorCode);
void transmissionCompleted(quint64);
void messagesDeleted(quint64, const QMailMessageIdList&);
diff --git a/src/tools/messageserver/messageserver.cpp b/src/tools/messageserver/messageserver.cpp
index 952152e0..a7eb32c9 100644
--- a/src/tools/messageserver/messageserver.cpp
+++ b/src/tools/messageserver/messageserver.cpp
@@ -120,6 +120,8 @@ MessageServer::MessageServer(QObject *parent)
client, SIGNAL(protocolRequestCompleted(quint64)));
connect(handler, SIGNAL(messagesTransmitted(quint64, QMailMessageIdList)),
client, SIGNAL(messagesTransmitted(quint64, QMailMessageIdList)));
+ connect(handler, SIGNAL(messagesFailedTransmission(quint64, QMailMessageIdList, QMailServiceAction::Status::ErrorCode)),
+ client, SIGNAL(messagesFailedTransmission(quint64, QMailMessageIdList, QMailServiceAction::Status::ErrorCode)));
connect(handler, SIGNAL(transmissionCompleted(quint64)),
this, SLOT(transmissionCompleted(quint64)));
diff --git a/src/tools/messageserver/servicehandler.cpp b/src/tools/messageserver/servicehandler.cpp
index 884e1a0a..d84f3b95 100644
--- a/src/tools/messageserver/servicehandler.cpp
+++ b/src/tools/messageserver/servicehandler.cpp
@@ -626,6 +626,8 @@ void ServiceHandler::registerAccountSink(const QMailAccountId &accountId, QMailM
sinkService.insert(sink, service);
connect(sink, SIGNAL(messagesTransmitted(QMailMessageIdList)), this, SLOT(messagesTransmitted(QMailMessageIdList)));
+ connect(sink, SIGNAL(messagesFailedTransmission(QMailMessageIdList, QMailServiceAction::Status::ErrorCode)),
+ this, SLOT(messagesFailedTransmission(QMailMessageIdList, QMailServiceAction::Status::ErrorCode)));
}
QMailMessageSink *ServiceHandler::accountSink(const QMailAccountId &accountId) const
@@ -1948,6 +1950,15 @@ void ServiceHandler::messagesTransmitted(const QMailMessageIdList &messageIds)
}
}
+void ServiceHandler::messagesFailedTransmission(const QMailMessageIdList &messageIds, QMailServiceAction::Status::ErrorCode error)
+{
+ if (QMailMessageSink *sink = qobject_cast<QMailMessageSink*>(sender())) {
+ if (quint64 action = sinkAction(sink)) {
+ emit messagesFailedTransmission(action, messageIds, error);
+ }
+ }
+}
+
void ServiceHandler::availabilityChanged(bool available)
{
if (QMailMessageService *service = qobject_cast<QMailMessageService*>(sender())) {
diff --git a/src/tools/messageserver/servicehandler.h b/src/tools/messageserver/servicehandler.h
index bd37b3dd..0d6d2edf 100644
--- a/src/tools/messageserver/servicehandler.h
+++ b/src/tools/messageserver/servicehandler.h
@@ -102,6 +102,7 @@ signals:
void retrievalCompleted(quint64 action);
void messagesTransmitted(quint64 action, const QMailMessageIdList&);
+ void messagesFailedTransmission(quint64 action, const QMailMessageIdList&, QMailServiceAction::Status::ErrorCode);
void transmissionCompleted(quint64 action);
void messagesDeleted(quint64 action, const QMailMessageIdList&);
@@ -135,6 +136,7 @@ private slots:
void actionCompleted(bool);
void messagesTransmitted(const QMailMessageIdList&);
+ void messagesFailedTransmission(const QMailMessageIdList&, QMailServiceAction::Status::ErrorCode);
void messagesDeleted(const QMailMessageIdList&);
void messagesCopied(const QMailMessageIdList&);