mirror of https://github.com/sipwise/sems.git
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.
169 lines
3.8 KiB
169 lines
3.8 KiB
/*
|
|
* $Id$
|
|
*
|
|
* Copyright (C) 2002-2003 Fhg Fokus
|
|
*
|
|
* This file is part of sems, a free SIP media server.
|
|
*
|
|
* sems is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version
|
|
*
|
|
* For a license to use the ser software under conditions
|
|
* other than those described here, or to purchase support for this
|
|
* software, please contact iptel.org by e-mail at the following addresses:
|
|
* info@iptel.org
|
|
*
|
|
* sems is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#include "AmMail.h"
|
|
#include "AmSmtpClient.h"
|
|
#include "AmConfig.h"
|
|
#include "AmUtils.h"
|
|
#include "log.h"
|
|
|
|
#include <stdio.h>
|
|
#include <errno.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
|
|
|
|
AmMail::AmMail(const string& _from, const string& _subject,
|
|
const string& _to, const string& _body,
|
|
const string& _header)
|
|
: from(_from), subject(_subject), body(_body), header(_header),
|
|
to(_to), clean_up(0), error_count(0)
|
|
{
|
|
}
|
|
|
|
AmMail::~AmMail()
|
|
{
|
|
for(Attachements::iterator it = attachements.begin();
|
|
it != attachements.end(); it++){
|
|
|
|
fclose(it->fp);
|
|
}
|
|
};
|
|
|
|
AmMailDeamon* AmMailDeamon::_instance=0;
|
|
|
|
AmMailDeamon* AmMailDeamon::instance()
|
|
{
|
|
if(!_instance)
|
|
_instance = new AmMailDeamon();
|
|
return _instance;
|
|
}
|
|
|
|
void AmMailDeamon::on_stop()
|
|
{
|
|
}
|
|
|
|
int AmMailDeamon::sendQueued(AmMail* mail)
|
|
{
|
|
if(mail->from.empty() || mail->to.empty()){
|
|
ERROR("mail.from('%s') or mail.to('%s') is empty\n",mail->from.c_str(),mail->to.c_str());
|
|
return -1;
|
|
}
|
|
|
|
// FILE* tst_fp;
|
|
// for( Attachements::const_iterator att_it = mail->attachements.begin();
|
|
// att_it != mail->attachements.end(); ++att_it ){
|
|
|
|
// if(!(tst_fp = fopen(att_it->fullname.c_str(),"r"))){
|
|
// ERROR("%s\n",strerror(errno));
|
|
// return -1;
|
|
// }
|
|
// else
|
|
// fclose(tst_fp);
|
|
// }
|
|
|
|
event_fifo_mut.lock();
|
|
event_fifo.push(mail);
|
|
event_fifo_mut.unlock();
|
|
_run_cond.set(true);
|
|
return 0;
|
|
}
|
|
|
|
void AmMailDeamon::run()
|
|
{
|
|
queue<AmMail*> n_event_fifo;
|
|
while(1){
|
|
|
|
_run_cond.wait_for();
|
|
sleep(5);
|
|
|
|
string server_address = get_ip_from_name(AmConfig::SmtpServerAddress);
|
|
if(server_address.empty()){
|
|
WARN("Mail deamon could not resolv SMTP server address <%s>\n",
|
|
AmConfig::SmtpServerAddress.c_str());
|
|
continue;
|
|
}
|
|
|
|
AmSmtpClient smtp;
|
|
if (smtp.connect(server_address,AmConfig::SmtpServerPort)) {
|
|
|
|
WARN("Mail deamon could not connect to SMTP server at <%s:%i>\n",
|
|
server_address.c_str(),AmConfig::SmtpServerPort);
|
|
continue;
|
|
}
|
|
|
|
event_fifo_mut.lock();
|
|
DBG("Mail deamon starting its work\n");
|
|
|
|
while(!event_fifo.empty()){
|
|
|
|
AmMail* cur_mail = event_fifo.front();
|
|
event_fifo.pop();
|
|
|
|
event_fifo_mut.unlock();
|
|
|
|
bool err = true;
|
|
try{
|
|
err = smtp.send(*cur_mail);
|
|
}
|
|
catch(...){}
|
|
|
|
if(err && (cur_mail->error_count < 3)){
|
|
n_event_fifo.push(cur_mail);
|
|
cur_mail->error_count++;
|
|
}
|
|
else {
|
|
if(cur_mail->clean_up)
|
|
(*(cur_mail->clean_up))(cur_mail);
|
|
delete cur_mail;
|
|
}
|
|
event_fifo_mut.lock();
|
|
}
|
|
|
|
event_fifo_mut.unlock();
|
|
smtp.disconnect();
|
|
smtp.close();
|
|
|
|
if(n_event_fifo.empty()){
|
|
_run_cond.set(false);
|
|
}
|
|
else {
|
|
while(!n_event_fifo.empty())
|
|
n_event_fifo.pop();
|
|
}
|
|
|
|
DBG("Mail deamon finished\n");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|