You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdesdk/kbugbuster/backend/mailsender.cpp

213 lines
6.3 KiB

#ifndef TQT_NO_ASCII_CAST
#define TQT_NO_ASCII_CAST
#endif
#include <unistd.h>
#include <stdio.h>
#include <tqtimer.h>
#include <klocale.h>
#include <kstandarddirs.h>
#include <kdebug.h>
#include <kmessagebox.h>
#include <kurl.h>
#include <kapplication.h>
#include <dcopclient.h>
#include <kprocess.h>
#include "mailsender.h"
#include "smtp.h"
MailSender::MailSender(MailClient client,const TQString &smtpServer) :
m_client( client ), m_smtpServer( smtpServer )
{
}
MailSender::~MailSender()
{
}
MailSender *MailSender::clone() const
{
return new MailSender(m_client,m_smtpServer);
}
bool MailSender::send(const TQString &fromName,const TQString &fromEmail,const TQString &to,
const TQString &subject,const TQString &body,bool bcc,
const TQString &recipient)
{
TQString from( fromName );
if ( !fromEmail.isEmpty() )
from += TQString::tqfromLatin1( " <%2>" ).tqarg( fromEmail );
kdDebug() << "MailSender::sendMail():\nFrom: " << from << "\nTo: " << to
<< "\nbccflag:" << bcc
<< "\nRecipient:" << recipient
<< "\nSubject: " << subject << "\nBody: \n" << body << endl;
// ### FIXME: bcc is not supported in direct mode and recipient is not
// supported in sendmail and kmail mode
if (m_client == Sendmail) {
kdDebug() << "Sending per Sendmail" << endl;
bool needHeaders = true;
TQString command = KStandardDirs::findExe(TQString::tqfromLatin1("sendmail"),
TQString::tqfromLatin1("/sbin:/usr/sbin:/usr/lib"));
if (!command.isNull()) command += TQString::tqfromLatin1(" -oi -t");
else {
command = KStandardDirs::findExe(TQString::tqfromLatin1("mail"));
if (command.isNull()) return false; // give up
command.append(TQString::tqfromLatin1(" -s "));
command.append(KProcess::quote(subject));
if (bcc) {
command.append(TQString::tqfromLatin1(" -b "));
command.append(KProcess::quote(from));
}
command.append(" ");
command.append(KProcess::quote(to));
needHeaders = false;
}
FILE * fd = popen(command.local8Bit(),"w");
if (!fd)
{
kdError() << "Unable to open a pipe to " << command << endl;
TQTimer::singleShot( 0, this, TQT_SLOT( deleteLater() ) );
return false;
}
TQString textComplete;
if (needHeaders)
{
textComplete += TQString::tqfromLatin1("From: ") + from + '\n';
textComplete += TQString::tqfromLatin1("To: ") + to + '\n';
if (bcc) textComplete += TQString::tqfromLatin1("Bcc: ") + from + '\n';
textComplete += TQString::tqfromLatin1("Subject: ") + subject + '\n';
textComplete += TQString::tqfromLatin1("X-Mailer: KBugBuster") + '\n';
}
textComplete += '\n'; // end of headers
textComplete += body;
emit status( i18n( "Sending through sendmail..." ) );
fwrite(textComplete.local8Bit(),textComplete.length(),1,fd);
pclose(fd);
} else if ( m_client == KMail ) {
kdDebug() << "Sending per KMail" << endl;
if (!kapp->dcopClient()->isApplicationRegistered("kmail")) {
KMessageBox::error(0,i18n("No running instance of KMail found."));
TQTimer::singleShot( 0, this, TQT_SLOT( deleteLater() ) );
return false;
}
emit status( i18n( "Passing mail to KDE email program..." ) );
if (!kMailOpenComposer(to,"", (bcc ? from : ""), subject,body,0,KURL())) {
TQTimer::singleShot( 0, this, TQT_SLOT( deleteLater() ) );
return false;
}
} else if ( m_client == Direct ) {
kdDebug() << "Sending Direct" << endl;
TQStringList recipients;
if ( !recipient.isEmpty() )
recipients << recipient;
else
recipients << to;
TQString message = TQString::tqfromLatin1( "From: " ) + from +
TQString::tqfromLatin1( "\nTo: " ) + to +
TQString::tqfromLatin1( "\nSubject: " ) + subject +
TQString::tqfromLatin1( "\nX-Mailer: KBugBuster" ) +
TQString::tqfromLatin1( "\n\n" ) + body;
Smtp *smtp = new Smtp( fromEmail, recipients, message, m_smtpServer );
connect( smtp, TQT_SIGNAL( status( const TQString & ) ),
this, TQT_SIGNAL( status( const TQString & ) ) );
connect( smtp, TQT_SIGNAL( success() ),
this, TQT_SLOT( smtpSuccess() ) );
connect( smtp, TQT_SIGNAL( error( const TQString &, const TQString & ) ),
this, TQT_SLOT( smtpError( const TQString &, const TQString & ) ) );
smtp->insertChild( this ); // die when smtp dies
} else {
kdDebug() << "Invalid mail client setting." << endl;
}
if (m_client != Direct)
{
emit finished();
TQTimer::singleShot( 0, this, TQT_SLOT( deleteLater() ) );
}
return true;
}
void MailSender::smtpSuccess()
{
if ( tqparent() != sender() || !tqparent()->inherits( "Smtp" ) )
return;
static_cast<Smtp *>( tqparent() )->quit();
emit finished();
}
void MailSender::smtpError(const TQString &_command, const TQString &_response)
{
if ( tqparent() != sender() || !tqparent()->inherits( "Smtp" ) )
return;
TQString command = _command;
TQString response = _response;
Smtp *smtp = static_cast<Smtp *>( tqparent() );
smtp->removeChild( this );
delete smtp;
KMessageBox::error( TQT_TQWIDGET(tqApp->activeWindow()),
i18n( "Error during SMTP transfer.\n"
"command: %1\n"
"response: %2" ).tqarg( command ).tqarg( response ) );
emit finished();
TQTimer::singleShot( 0, this, TQT_SLOT( deleteLater() ) );
}
int MailSender::kMailOpenComposer(const TQString& arg0,const TQString& arg1,
const TQString& arg2,const TQString& arg3,const TQString& arg4,int arg5,
const KURL& arg6)
{
int result = 0;
TQByteArray data, replyData;
TQCString replyType;
TQDataStream arg( data, IO_WriteOnly );
arg << arg0;
arg << arg1;
arg << arg2;
arg << arg3;
arg << arg4;
arg << arg5;
arg << arg6;
if (kapp->dcopClient()->call("kmail","KMailIface","openComposer(TQString,TQString,TQString,TQString,TQString,int,KURL)", data, replyType, replyData ) ) {
if ( replyType == "int" ) {
TQDataStream _reply_stream( replyData, IO_ReadOnly );
_reply_stream >> result;
} else {
kdDebug() << "kMailOpenComposer() call failed." << endl;
}
} else {
kdDebug() << "kMailOpenComposer() call failed." << endl;
}
return result;
}
#include "mailsender.moc"