00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
#include <unistd.h>
00026
#include <stdio.h>
00027
00028
#include <klocale.h>
00029
#include <kstandarddirs.h>
00030
#include <kdebug.h>
00031
#include <kmessagebox.h>
00032
#include <kurl.h>
00033
#include <kapplication.h>
00034
#include <dcopclient.h>
00035
#include <kprocess.h>
00036
00037
#include <libkcal/event.h>
00038
#include <libkcal/todo.h>
00039
00040
#include <libkdepim/email.h>
00041
00042
#include "version.h"
00043
#include "koprefs.h"
00044
00045
#include "komailclient.h"
00046
00047 KOMailClient::KOMailClient()
00048 {
00049 }
00050
00051 KOMailClient::~KOMailClient()
00052 {
00053 }
00054
00055
bool KOMailClient::mailAttendees(IncidenceBase *incidence,
const QString &attachment)
00056 {
00057 Attendee::List attendees = incidence->attendees();
00058
if (attendees.count() == 0)
return false;
00059
00060
const QString from = incidence->organizer();
00061
const QString organizerEmail = KPIM::getEmailAddr( incidence->organizer() );
00062
QStringList toList;
00063
for(uint i=0; i<attendees.count();++i) {
00064
const QString email = (*attendees.at(i))->email();
00065
00066
00067
00068
if( organizerEmail != email )
00069 toList << email;
00070 }
00071
if( toList.count() == 0 )
00072
00073
return false;
00074
QString to = toList.join(
", " );
00075
00076
QString subject;
00077
if(incidence->type()!=
"FreeBusy") {
00078 Incidence *inc = static_cast<Incidence *>(incidence);
00079 subject = inc->summary();
00080 }
else {
00081 subject =
"Free Busy Object";
00082 }
00083
00084
QString body = createBody(incidence);
00085
00086
bool bcc = KOPrefs::instance()->mBcc;
00087
00088
return send(from,to,subject,body,bcc,attachment);
00089 }
00090
00091
bool KOMailClient::mailOrganizer(IncidenceBase *incidence,
const QString &attachment)
00092 {
00093
QString to = incidence->organizer();
00094
00095
QString from = KOPrefs::instance()->email();
00096
00097
QString subject;
00098
if(incidence->type()!=
"FreeBusy") {
00099 Incidence *inc = static_cast<Incidence *>(incidence);
00100 subject = inc->summary();
00101 }
else {
00102 subject =
"Free Busy Message";
00103 }
00104
00105
QString body = createBody(incidence);
00106
00107
bool bcc = KOPrefs::instance()->mBcc;
00108
00109
return send(from,to,subject,body,bcc,attachment);
00110 }
00111
00112
bool KOMailClient::mailTo(IncidenceBase *incidence,
const QString &recipients,
00113
const QString &attachment)
00114 {
00115
QString from = KOPrefs::instance()->email();
00116
QString subject;
00117
if(incidence->type()!=
"FreeBusy") {
00118 Incidence *inc = static_cast<Incidence *>(incidence);
00119 subject = inc->summary();
00120 }
else {
00121 subject =
"Free Busy Message";
00122 }
00123
QString body = createBody(incidence);
00124
bool bcc = KOPrefs::instance()->mBcc;
00125 kdDebug () <<
"KOMailClient::mailTo " << recipients << endl;
00126
return send(from,recipients,subject,body,bcc,attachment);
00127 }
00128
00129
bool KOMailClient::send(
const QString &from,
const QString &to,
00130
const QString &subject,
const QString &body,
bool bcc,
00131
const QString &attachment)
00132 {
00133 kdDebug(5850) <<
"KOMailClient::sendMail():\nFrom: " << from <<
"\nTo: " << to
00134 <<
"\nSubject: " << subject <<
"\nBody: \n" << body
00135 <<
"\nAttachment:\n" << attachment << endl;
00136
00137
if (KOPrefs::instance()->mMailClient == KOPrefs::MailClientSendmail) {
00138
bool needHeaders =
true;
00139
00140
QString command = KStandardDirs::findExe(QString::fromLatin1(
"sendmail"),
00141 QString::fromLatin1(
"/sbin:/usr/sbin:/usr/lib"));
00142
if (!command.isNull()) command += QString::fromLatin1(
" -oi -t");
00143
else {
00144 command = KStandardDirs::findExe(QString::fromLatin1(
"mail"));
00145
if (command.isNull())
return false;
00146
00147 command.append(QString::fromLatin1(
" -s "));
00148 command.append(KProcess::quote(subject));
00149
00150
if (bcc) {
00151 command.append(QString::fromLatin1(
" -b "));
00152 command.append(KProcess::quote(from));
00153 }
00154
00155 command.append(
" ");
00156 command.append(KProcess::quote(to));
00157
00158 needHeaders =
false;
00159 }
00160
00161 FILE * fd = popen(command.local8Bit(),
"w");
00162
if (!fd)
00163 {
00164 kdError() <<
"Unable to open a pipe to " << command << endl;
00165
return false;
00166 }
00167
00168
QString textComplete;
00169
if (needHeaders)
00170 {
00171 textComplete += QString::fromLatin1(
"From: ") + from +
'\n';
00172 textComplete += QString::fromLatin1(
"To: ") + to +
'\n';
00173
if (bcc) textComplete += QString::fromLatin1(
"Bcc: ") + from +
'\n';
00174 textComplete += QString::fromLatin1(
"Subject: ") + subject +
'\n';
00175 textComplete += QString::fromLatin1(
"X-Mailer: KOrganizer") + korgVersion +
'\n';
00176 }
00177 textComplete +=
'\n';
00178 textComplete += body;
00179 textComplete +=
'\n';
00180 textComplete += attachment;
00181
00182 fwrite(textComplete.local8Bit(),textComplete.length(),1,fd);
00183
00184 pclose(fd);
00185 }
else {
00186
if (!kapp->dcopClient()->isApplicationRegistered(
"kmail")) {
00187
if (KApplication::startServiceByDesktopName(
"kmail")) {
00188 KMessageBox::error(0,i18n(
"No running instance of KMail found."));
00189
return false;
00190 }
00191 }
00192
00193
if (attachment.isEmpty()) {
00194
if (!kMailOpenComposer(to,
"",bcc ? from :
"",subject,body,0,KURL()))
return false;
00195 }
else {
00196
QString meth;
00197
int idx = attachment.find(
"METHOD");
00198
if (idx>=0) {
00199 idx = attachment.find(
':',idx)+1;
00200 meth = attachment.mid(idx,attachment.find(
'\n',idx)-idx);
00201 meth = meth.lower();
00202 }
else {
00203 meth =
"publish";
00204 }
00205
if (!kMailOpenComposer(to,
"",bcc ? from :
"",subject,body,0,
"cal.ics",
"7bit",
00206 attachment.utf8(),
"text",
"calendar",
"method",meth,
00207
"attachment",
"utf-8"))
return false;
00208 }
00209 }
00210
return true;
00211 }
00212
00213
int KOMailClient::kMailOpenComposer(
const QString& arg0,
const QString& arg1,
00214
const QString& arg2,
const QString& arg3,
const QString& arg4,
int arg5,
00215
const KURL& arg6)
00216 {
00217
00218
00219
00220
int result = 0;
00221
00222
QByteArray data, replyData;
00223
QCString replyType;
00224
QDataStream arg( data, IO_WriteOnly );
00225 arg << arg0;
00226 arg << arg1;
00227 arg << arg2;
00228 arg << arg3;
00229 arg << arg4;
00230 arg << arg5;
00231 arg << arg6;
00232
#if KDE_IS_VERSION( 3, 2, 90 )
00233
kapp->updateRemoteUserTimestamp(
"kmail" );
00234
#endif
00235
if (kapp->dcopClient()->call(
"kmail",
"KMailIface",
"openComposer(QString,QString,QString,QString,QString,int,KURL)", data, replyType, replyData ) ) {
00236
if ( replyType ==
"int" ) {
00237
QDataStream _reply_stream( replyData, IO_ReadOnly );
00238 _reply_stream >> result;
00239 }
else {
00240 kdDebug(5850) <<
"kMailOpenComposer() call failed." << endl;
00241 }
00242 }
else {
00243 kdDebug(5850) <<
"kMailOpenComposer() call failed." << endl;
00244 }
00245
return result;
00246 }
00247
00248
int KOMailClient::kMailOpenComposer(
const QString& arg0,
const QString& arg1,
00249
const QString& arg2,
const QString& arg3,
00250
const QString& arg4,
int arg5,
const QString& arg6,
00251
const QCString& arg7,
const QCString& arg8,
00252
const QCString& arg9,
const QCString& arg10,
00253
const QCString& arg11,
const QString& arg12,
00254
const QCString& arg13,
const QCString& arg14 )
00255 {
00256
00257
00258
00259
00260
00261
00262
00263
int result = 0;
00264
00265
QByteArray data, replyData;
00266
QCString replyType;
00267
QDataStream arg( data, IO_WriteOnly );
00268 arg << arg0;
00269 arg << arg1;
00270 arg << arg2;
00271 arg << arg3;
00272 arg << arg4;
00273 arg << arg5;
00274 arg << arg6;
00275 arg << arg7;
00276 arg << arg8;
00277 arg << arg9;
00278 arg << arg10;
00279 arg << arg11;
00280 arg << arg12;
00281 arg << arg13;
00282 arg << arg14;
00283
#if KDE_IS_VERSION( 3, 2, 90 )
00284
kapp->updateRemoteUserTimestamp(
"kmail");
00285
#endif
00286
if ( kapp->dcopClient()->call(
"kmail",
"KMailIface",
00287
"openComposer(QString,QString,QString,QString,QString,int,QString,QCString,QCString,QCString,QCString,QCString,QString,QCString,QCString)", data, replyType, replyData ) ) {
00288
if ( replyType ==
"int" ) {
00289
QDataStream _reply_stream( replyData, IO_ReadOnly );
00290 _reply_stream >> result;
00291 }
else {
00292 kdDebug(5850) <<
"kMailOpenComposer() call failed." << endl;
00293 }
00294 }
else {
00295 kdDebug(5850) <<
"kMailOpenComposer() call failed." << endl;
00296 }
00297
return result;
00298 }
00299
00300
00301
QString KOMailClient::createBody(IncidenceBase *incidence)
00302 {
00303
QString CR = (
"\n");
00304
00305
QString body;
00306
00307
00308
if (incidence->type()==
"Event") {
00309 Event *selectedEvent = static_cast<Event *>(incidence);
00310
QString recurrence[]= {i18n(
"no recurrence",
"None"),
00311 i18n(
"Minutely"), i18n(
"Hourly"), i18n(
"Daily"),
00312 i18n(
"Weekly"), i18n(
"Monthly Same Day"), i18n(
"Monthly Same Position"),
00313 i18n(
"Yearly"), i18n(
"Yearly"), i18n(
"Yearly")};
00314
00315
if (!selectedEvent->organizer().isEmpty()) {
00316 body += i18n(
"Organizer: %1").arg(selectedEvent->organizer());
00317 body += CR;
00318 }
00319 body += i18n(
"Summary: %1").arg(selectedEvent->summary());
00320 body += CR;
00321
if (!selectedEvent->location().isEmpty()) {
00322 body += i18n(
"Location: %1").arg(selectedEvent->location());
00323 body += CR;
00324 }
00325 body += i18n(
"Start Date: %1").arg(selectedEvent->dtStartDateStr());
00326 body += CR;
00327
if (!selectedEvent->doesFloat()) {
00328 body += i18n(
"Start Time: %1").arg(selectedEvent->dtStartTimeStr());
00329 body += CR;
00330 }
00331
if ( selectedEvent->dtStart()!=selectedEvent->dtEnd() ) {
00332 body += i18n(
"End Date: %1").arg(selectedEvent->dtEndDateStr());
00333 body += CR;
00334 }
00335
if (!selectedEvent->doesFloat()) {
00336 body += i18n(
"End Time: %1").arg(selectedEvent->dtEndTimeStr());
00337 body += CR;
00338 }
00339
if (selectedEvent->doesRecur()) {
00340 body += i18n(
"Recurs: %1")
00341 .arg(recurrence[selectedEvent->recurrence()->doesRecur()]);
00342 body += CR;
00343
00344
00345
00346
00347
00348
if (selectedEvent->recurrence()->duration() > 0 ) {
00349 body += i18n (
"Repeats %1 times")
00350 .arg(QString::number(selectedEvent->recurrence()->duration()));
00351 body += CR;
00352 }
else {
00353
if (selectedEvent->recurrence()->duration() != -1) {
00354
00355 body += i18n(
"End Date: %1")
00356 .arg(selectedEvent->recurrence()->endDateStr());
00357 body += CR;
00358 }
else {
00359 body += i18n(
"Repeats forever");
00360 body += CR;
00361 }
00362 }
00363 }
00364
QString details = selectedEvent->description();
00365
if (!details.isEmpty()) {
00366 body += i18n(
"Details:");
00367 body += CR;
00368 body += details;
00369 body += CR;
00370 }
00371 }
00372
00373
00374
if (incidence->type()==
"Todo") {
00375 Todo *selectedEvent = static_cast<Todo *>(incidence);
00376
if (!selectedEvent->organizer().isEmpty()) {
00377 body += i18n(
"Organizer: %1").arg(selectedEvent->organizer());
00378 body += CR;
00379 }
00380 body += i18n(
"Summary: %1").arg(selectedEvent->summary());
00381 body += CR;
00382
if (!selectedEvent->location().isEmpty()) {
00383 body += i18n(
"Location: %1").arg(selectedEvent->location());
00384 body += CR;
00385 }
00386
if (selectedEvent->hasStartDate()) {
00387 body += i18n(
"Start Date: %1").arg(selectedEvent->dtStartDateStr());
00388 body += CR;
00389
if (!selectedEvent->doesFloat()) {
00390 body += i18n(
"Start Time: %1").arg(selectedEvent->dtStartTimeStr());
00391 body += CR;
00392 }
00393 }
00394
if (selectedEvent->hasDueDate()) {
00395 body += i18n(
"Due Date: %1").arg(selectedEvent->dtDueDateStr());
00396 body += CR;
00397
if (!selectedEvent->doesFloat()) {
00398 body += i18n(
"Due Time: %1").arg(selectedEvent->dtDueTimeStr());
00399 body += CR;
00400 }
00401 }
00402
QString details = selectedEvent->description();
00403
if (!details.isEmpty()) {
00404 body += i18n(
"Details:");
00405 body += CR;
00406 body += details;
00407 body += CR;
00408 }
00409 }
00410
00411
00412
if(incidence->type()==
"FreeBusy") {
00413 body = i18n(
"This is a Free Busy Object");
00414 }
00415
00416
00417
if(incidence->type()==
"Journal") {
00418 Incidence *inc = static_cast<Incidence *>(incidence);
00419 body = inc->summary();
00420 body += CR;
00421 body += inc->description();
00422 body += CR;
00423 }
00424
00425
return body;
00426 }