begin process at 2013 05 26 03:38:18
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > [QT] ENVOI AUTO DE MAIL HEBDOMADAIRE

[QT] ENVOI AUTO DE MAIL HEBDOMADAIRE


 Information sur la source

Note :
Aucune note
Catégorie :Réseaux & Internet Classé sous :Qt, SMTP, Horloge, Hebdomaire Niveau :Initié Date de création :13/06/2012 Vu / téléchargé :2 545 / 121

Auteur : rob57530

Ecrire un message privé
Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Ce programme permet d'envoyer un mail de façon hebdomadaire.
Il est basé sur le framework Qt (exécutable compilé sous Gnome, Qt 4.8).

Il utilise le protocole ASMTP, aussi connu sous le nom de SMTP AUTH (Simple Mail Transfert Protocol with Authentification) pour envoyer le mail (facilement modifiable pour utiliser simplement le protocole SMTP sans authentification). Le protocole est implémenté à l'aide de QTcpSocket. Ce protocole permet l'ajout d'une pièce jointe. Les données (sujet, corps et pièce jointe du mail) sont encodés en base64. Le mail est donc envoyé en "multipart" (voir les MIME-Type pour plus d'infos). Le programme prend en charge du texte riche pour le corps du message.

L'horloge est réalisée avec un QTimer, avec un timeout de 1 seconde. Un widget permet de connaitre l'état de l'envoi du mail,les erreurs, ou simplement le temps restant avant l'envoi du mail.

Il est possible de tester les identifiants du compte mail, et d'envoyer un mail de test. L'adresse mail de départ nécessite un mot de passe.

PS: Il s'agit de la première source que je publie, donc soyez critique si ça ne va pas ;)

Sources:
Qt
Icones: http://www.softicons.com/

Source

  • #include "mainwindow.h"
  • #include "ui_mainwindow.h"
  • MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
  • {
  • ui->setupUi(this);
  • srand(QDateTime::currentDateTime().toTime_t());
  • set=new QSettings("options.ini", QSettings::IniFormat, this);
  • tray=new QSystemTrayIcon(QIcon(":/Mail.png"), this);
  • tray->show();
  • connect(tray, SIGNAL(messageClicked()), this, SLOT(show()));
  • connect(tray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(trayActivated(QSystemTrayIcon::ActivationReason)));
  • tray->setContextMenu(new QMenu("Menu", this));
  • connect(tray->contextMenu()->addAction("Afficher"), SIGNAL(triggered()), this, SLOT(show()));
  • connect(tray->contextMenu()->addAction("Quitter"), SIGNAL(triggered()), qApp, SLOT(quit()));
  • widStatus=new WidStatus();
  • setupUI();
  • show();
  • QTimer* timer=new QTimer(this);
  • timer->setInterval(1000);
  • connect(timer, SIGNAL(timeout()), this, SLOT(checkTime()));
  • timer->start();
  • }
  • MainWindow::~MainWindow()
  • {
  • delete ui;
  • delete set;
  • delete tray;
  • delete widStatus;
  • }
  • void MainWindow::readyRead()
  • {
  • QTcpSocket* socket=(QTcpSocket*)sender();
  • buffer+=socket->readAll();
  • if(!buffer.endsWith("\n"))
  • return;
  • if(status==Send::HELO)
  • {
  • if(buffer.startsWith("220"))
  • {
  • status=Send::AUTH;
  • buffer.clear();
  • socket->write("HELO there\n");
  • }
  • else
  • showError("Réponse inconnue du serveur (1)", socket);
  • return;
  • }
  • else if(status==Send::AUTH)
  • {
  • if(buffer.startsWith("250"))
  • {
  • status=Send::MAIL_FROM;
  • buffer.clear();
  • widStatus->showStatus("Connecté. Authentification...");
  • socket->write("auth plain "+QByteArray(QByteArray("\x00", 1)+user().toStdString().c_str()+QByteArray("\x00", 1)+pass().toStdString().c_str()).toBase64()+"\n");
  • }
  • else
  • showError("Réponse inconnue du serveur (2)", socket);
  • return;
  • }
  • else if(status==Send::MAIL_FROM)
  • {
  • if(buffer.startsWith("235"))
  • {
  • buffer.clear();
  • if(sendType!=Send::TEST_PARAMS)
  • {
  • status=Send::RCPT_TO;
  • if(sendType!=Send::SEND_ME_RCPT)
  • widStatus->showStatus("Authentifié. Envoi du mail...");
  • else if(sendType==Send::SEND_ME_RCPT)
  • widStatus->showStatus("Authentifié. Envoi des mails...");
  • socket->write(QString("MAIL FROM:<"+user()+">\n").toStdString().c_str());
  • }
  • else if(sendType==Send::TEST_PARAMS)
  • {
  • status=Send::DISCO;
  • widStatus->showStatus("Compte mail OK");
  • socket->write("quit\n");
  • }
  • }
  • else
  • showError("Mauvais mail ou mot de passe", socket);
  • return;
  • }
  • else if(status==Send::RCPT_TO)
  • {
  • if(buffer.startsWith("250"))
  • {
  • status=Send::DATA;
  • buffer.clear();
  • if(sendType==Send::SEND_RCPT)
  • socket->write(QString("RCPT TO:<"+rcpt()+">\n").toStdString().c_str());
  • else if(sendType==Send::SEND_ME)
  • socket->write(QString("RCPT TO:<"+user()+">\n").toStdString().c_str());
  • else if(sendType==Send::SEND_ME_RCPT)
  • socket->write(QString("RCPT TO:<"+rcpt()+">\nRCPT TO:<"+user()+">\n").toStdString().c_str());
  • }
  • else
  • showError("Expediteur non valide", socket);
  • return;
  • }
  • else if(status==Send::DATA)
  • {
  • if(buffer.startsWith("250"))
  • {
  • status=Send::SENDING_DATA;
  • buffer.clear();
  • socket->write("DATA\n");
  • }
  • else
  • showError("Destinataire on valide", socket);
  • return;
  • }
  • else if(status==Send::SENDING_DATA)
  • {
  • if(buffer.startsWith("354"))
  • {
  • buffer.clear();
  • QString bound=boundary(15);
  • QString sjt_enc="=?UTF-8?B?"+sjt().toUtf8().toBase64()+"?=";
  • QString body_enc=body().toUtf8().toBase64();
  • socket->write(QString("Subject: "+sjt_enc+"\r\n").toStdString().c_str());
  • socket->write(QString("From: <"+user()+">\r\n").toStdString().c_str());
  • if(sendType==Send::SEND_RCPT)
  • socket->write(QString("To: <"+rcpt()+">\r\n").toStdString().c_str());
  • else if(sendType==Send::SEND_ME)
  • socket->write(QString("To: <"+user()+">\r\n").toStdString().c_str());
  • else if(sendType==Send::SEND_ME_RCPT)
  • socket->write(QString("To: <"+rcpt()+"> <"+user()+">\r\n").toStdString().c_str());
  • socket->write("MIME-Version: 1.0\r\n");
  • socket->write(QString("Content-Type: multipart/mixed; boundary=\""+bound+"\"\r\n").toStdString().c_str());
  • socket->write(QString("Date: "+QDateTime::currentDateTime().toString("ddd, d MMM yyyy hh:mm:ss +0200")+"\r\n").toStdString().c_str());
  • socket->write("\r\n");
  • socket->write(QString("--"+bound+"\r\n").toStdString().c_str());
  • socket->write("Content-Type: text/html; charset=\"UTF-8\"\r\n");
  • socket->write("Content-Transfer-Encoding: base64\r\n");
  • socket->write("\r\n");
  • socket->write(QString(body_enc+"\r\n").toStdString().c_str());
  • socket->write("\r\n");
  • QFile file(filePath().replace("\\", "/"));
  • if(file.exists()&&file.open(QIODevice::ReadOnly))
  • {
  • widStatus->showStatus("Envoi de la pièce jointe: 0%...");
  • socket->write(QString("--"+bound+"\r\n").toStdString().c_str());
  • QString filePath_enc="=?UTF-8?B?"+filePath().split("/").last().toUtf8().toBase64()+"?=";
  • QString mime="application/octet-stream";
  • if(filePath().contains(QRegExp("\\.xls[x]{0,1}$")))
  • mime="application/vnd.ms-excel";
  • if(filePath().contains(QRegExp("\\.doc[x]{0,1}$")))
  • mime="application/vnd.msword";
  • if(filePath().contains(QRegExp("\\.pdf$")))
  • mime="application/pdf";
  • socket->write(QString("Content-Type: "+mime+"\r\n").toStdString().c_str());
  • socket->write("Content-Transfer-Encoding: base64\r\n");
  • socket->write(QString("Content-Disposition: attachment; filename=\""+filePath_enc+"\"\r\n").toStdString().c_str());
  • socket->write("\r\n");
  • int p=0;
  • QByteArray data=file.readAll();
  • data=data.toBase64();
  • for(int i=0;i<data.size();i++)
  • {
  • if(i*100/data.size()!=p)
  • {
  • p=i*100/data.size();
  • widStatus->showStatus("Envoi de la pièce jointe: "+QString::number(p)+"%...");
  • }
  • socket->write(QByteArray().append(data.at(i)));
  • while(socket->waitForBytesWritten(50))
  • qApp->processEvents();
  • }
  • socket->write("\r\n\r\n");
  • }
  • else
  • {
  • showError("Fichier imossible à ouvrir", socket);
  • return;
  • }
  • socket->write(QString("--"+bound+"--\r\n").toStdString().c_str());
  • status=Send::QUIT;
  • socket->write(".\r\n");
  • }
  • else if(sendType==Send::SEND_ME_RCPT)
  • {
  • if(!buffer.startsWith("250"))
  • showError("Expediteur non valide", socket);
  • buffer.clear();
  • }
  • else
  • showError("Impossible d'envoyer le corps du mail", socket);
  • return;
  • }
  • else if(status==Send::QUIT)
  • {
  • if(buffer.startsWith("250"))
  • {
  • status=Send::DISCO;
  • buffer.clear();
  • if(sendType!=Send::SEND_ME_RCPT)
  • widStatus->showStatus("Mail envoyé. Déconnection...");
  • else if(sendType==Send::SEND_ME_RCPT)
  • widStatus->showStatus("Mails envoyés. Déconnection...");
  • socket->write("quit\n");
  • }
  • else
  • showError("Données invalides envoyées", socket);
  • return;
  • }
  • else if(status==Send::DISCO)
  • {
  • if(buffer.startsWith("221"))
  • {
  • setEnabled(true);
  • if(sendType==Send::TEST_PARAMS)
  • widStatus->showSuccess("Compte mail valide");
  • else if(sendType==Send::SEND_ME_RCPT)
  • widStatus->showSuccess("Mails tests envoyés");
  • else
  • widStatus->showSuccess("Mail test envoyé");
  • buffer.clear();
  • socket->disconnect();
  • socket->deleteLater();
  • }
  • else
  • showError("Commande de déconnection refusée", socket);
  • return;
  • }
  • }
  • void MainWindow::error(QAbstractSocket::SocketError)
  • {
  • widStatus->show();
  • widStatus->showError(((QTcpSocket*)sender())->errorString());
  • }
  • QString MainWindow::boundary(int lenght)
  • {
  • QString chars="AZERTYUIOPQSDFGHJKLMWXCVBNazertyuiopqsdfghjklmwxcvbn0123456789";
  • QString b="";
  • for(int l=0;l<lenght;l++)
  • b+=chars.at(qMax(qMin(((double)chars.size()-1), ((double)rand())*chars.size()/RAND_MAX), (double)0));
  • return "_"+b+"_";
  • }
  • void MainWindow::trayActivated(QSystemTrayIcon::ActivationReason r)
  • {
  • if(r!=QSystemTrayIcon::Context)
  • show();
  • }
  • void MainWindow::on_grpFilePath_toggled(bool arg1)
  • {
  • if(!arg1)
  • ui->lineFilePath->clear();
  • }
  • void MainWindow::on_btnBrowseFilePath_clicked()
  • {
  • QString file=QFileDialog::getOpenFileName(this, "Fichier à joindre...");
  • if(!file.isEmpty())
  • ui->lineFilePath->setText(file);
  • }
  • void MainWindow::on_buttonBox_accepted()
  • {
  • set->setValue("User", ui->lineUser->text());
  • set->setValue("Pass", ui->linePass->text());
  • set->setValue("Rcpt", ui->lineRcpt->text());
  • set->setValue("FilePath", ui->lineFilePath->text());
  • set->setValue("Sjt", ui->lineSjt->text());
  • set->setValue("Body", ui->lineBody->toHtml());
  • set->setValue("Day", ui->comboDay->currentIndex());
  • set->setValue("Hour", ui->lineHour->time());
  • }
  • void MainWindow::send()
  • {
  • if(!isEnabled())
  • return;
  • setEnabled(false);
  • widStatus->show();
  • widStatus->showStatus("Connection...");
  • status=Send::HELO;
  • QTcpSocket* sock=new QTcpSocket(this);
  • connect(sock, SIGNAL(readyRead()), this, SLOT(readyRead()));
  • connect(sock, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error(QAbstractSocket::SocketError)));
  • sock->connectToHost("smtpauth.orange.fr", 25);
  • }
  • void MainWindow::setupUI()
  • {
  • ui->lineUser->setText(user());
  • ui->linePass->setText(pass());
  • ui->lineRcpt->setText(rcpt());
  • ui->lineFilePath->setText(filePath());
  • ui->lineSjt->setText(sjt());
  • ui->lineBody->setHtml(body());
  • ui->grpFilePath->setChecked(!filePath().isEmpty());
  • ui->comboDay->setCurrentIndex(day());
  • ui->lineHour->setTime(hour());
  • }
  • void MainWindow::on_buttonBox_rejected()
  • {
  • setupUI();
  • }
  • void MainWindow::closeEvent(QCloseEvent *e)
  • {
  • if(!qApp->arguments().contains("-indev"))
  • {
  • e->ignore();
  • hide();
  • }
  • else
  • e->accept();
  • }
  • void MainWindow::keyPressEvent(QKeyEvent *e)
  • {
  • if(e->key()==Qt::Key_Return||e->key()==Qt::Key_Enter)
  • on_buttonBox_accepted();
  • }
  • void MainWindow::checkTime()
  • {
  • QDateTime next=QDateTime::currentDateTime();
  • while(next.date().dayOfWeek()!=day()+1)
  • next=next.addDays(1);
  • if(QDateTime::currentDateTime().time()>hour())
  • next=next.addDays(7);
  • next.setTime(hour());
  • int remaining=QDateTime::currentDateTime().secsTo(next);
  • QTime re;
  • re=re.addSecs(remaining);
  • if(remaining==3599)
  • widStatus->show();
  • if(remaining<=3599&&remaining>3585)
  • widStatus->showRemainingTime(re);
  • else if(remaining==3585)
  • widStatus->hide();
  • else if(remaining==1800)
  • widStatus->show();
  • if(remaining<=1800&&remaining>1785)
  • widStatus->showRemainingTime(re);
  • else if(remaining==1785)
  • widStatus->hide();
  • else if(remaining==600)
  • widStatus->show();
  • if(remaining<=600)
  • {
  • widStatus->showRemainingTime(re);
  • if(remaining==0)
  • {
  • sendType=Send::SEND_RCPT;
  • send();
  • }
  • }
  • //qDebug()<<"Current:"<<QDateTime::currentDateTime()<<"Next:"<<remaining;
  • }
  • void MainWindow::showError(QString erreur, QTcpSocket *socket)
  • {
  • qDebug()<<"ERREUR:"<<buffer;
  • setEnabled(true);
  • widStatus->show();
  • widStatus->showError(erreur);
  • socket->disconnect();
  • socket->deleteLater();
  • buffer.clear();
  • }
  • void MainWindow::on_btnTestUser_clicked()
  • {
  • on_buttonBox_accepted();
  • sendType=Send::TEST_PARAMS;
  • send();
  • }
  • void MainWindow::on_btnTestMail_clicked()
  • {
  • on_buttonBox_accepted();
  • DlgMailTest* test=new DlgMailTest(this);
  • if(test->exec()==QDialog::Accepted)
  • {
  • if(test->getUi()->radioMe->isChecked())
  • sendType=Send::SEND_ME;
  • else if(test->getUi()->radioMeRcpt->isChecked())
  • sendType=Send::SEND_ME_RCPT;
  • else if(test->getUi()->radioRcpt->isChecked())
  • sendType=Send::SEND_RCPT;
  • send();
  • }
  • }
  • void MainWindow::on_lblBody_linkActivated(const QString &link)
  • {
  • if(link=="richText")
  • {
  • DlgRichText* t=new DlgRichText(this);
  • t->setText(ui->lineBody->toHtml());
  • if(t->exec()==QDialog::Accepted)
  • ui->lineBody->setHtml(t->getText());
  • t->deleteLater();
  • }
  • }
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    srand(QDateTime::currentDateTime().toTime_t());

    set=new QSettings("options.ini", QSettings::IniFormat, this);

    tray=new QSystemTrayIcon(QIcon(":/Mail.png"), this);
    tray->show();
    connect(tray, SIGNAL(messageClicked()), this, SLOT(show()));
    connect(tray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(trayActivated(QSystemTrayIcon::ActivationReason)));
    tray->setContextMenu(new QMenu("Menu", this));
    connect(tray->contextMenu()->addAction("Afficher"), SIGNAL(triggered()), this, SLOT(show()));
    connect(tray->contextMenu()->addAction("Quitter"), SIGNAL(triggered()), qApp, SLOT(quit()));

    widStatus=new WidStatus();


    setupUI();
    show();

    QTimer* timer=new QTimer(this);
    timer->setInterval(1000);
    connect(timer, SIGNAL(timeout()), this, SLOT(checkTime()));
    timer->start();
}

MainWindow::~MainWindow()
{
    delete ui;
    delete set;
    delete tray;
    delete widStatus;
}

void MainWindow::readyRead()
{
    QTcpSocket* socket=(QTcpSocket*)sender();
    buffer+=socket->readAll();
    if(!buffer.endsWith("\n"))
        return;
    if(status==Send::HELO)
    {
        if(buffer.startsWith("220"))
        {
            status=Send::AUTH;
            buffer.clear();
            socket->write("HELO there\n");
        }
        else
            showError("Réponse inconnue du serveur (1)", socket);
        return;
    }
    else if(status==Send::AUTH)
    {
        if(buffer.startsWith("250"))
        {
            status=Send::MAIL_FROM;
            buffer.clear();
            widStatus->showStatus("Connecté. Authentification...");
            socket->write("auth plain "+QByteArray(QByteArray("\x00", 1)+user().toStdString().c_str()+QByteArray("\x00", 1)+pass().toStdString().c_str()).toBase64()+"\n");
        }
        else
            showError("Réponse inconnue du serveur (2)", socket);
        return;
    }
    else if(status==Send::MAIL_FROM)
    {
        if(buffer.startsWith("235"))
        {
            buffer.clear();
            if(sendType!=Send::TEST_PARAMS)
            {
                status=Send::RCPT_TO;
                if(sendType!=Send::SEND_ME_RCPT)
                    widStatus->showStatus("Authentifié. Envoi du mail...");
                else if(sendType==Send::SEND_ME_RCPT)
                    widStatus->showStatus("Authentifié. Envoi des mails...");
                socket->write(QString("MAIL FROM:<"+user()+">\n").toStdString().c_str());
            }
            else if(sendType==Send::TEST_PARAMS)
            {
                status=Send::DISCO;
                widStatus->showStatus("Compte mail OK");
                socket->write("quit\n");
            }
        }
        else
            showError("Mauvais mail ou mot de passe", socket);
        return;
    }
    else if(status==Send::RCPT_TO)
    {
        if(buffer.startsWith("250"))
        {
            status=Send::DATA;
            buffer.clear();
            if(sendType==Send::SEND_RCPT)
                socket->write(QString("RCPT TO:<"+rcpt()+">\n").toStdString().c_str());
            else if(sendType==Send::SEND_ME)
                socket->write(QString("RCPT TO:<"+user()+">\n").toStdString().c_str());
            else if(sendType==Send::SEND_ME_RCPT)
                socket->write(QString("RCPT TO:<"+rcpt()+">\nRCPT TO:<"+user()+">\n").toStdString().c_str());
        }
        else
            showError("Expediteur non valide", socket);
        return;
    }
    else if(status==Send::DATA)
    {
        if(buffer.startsWith("250"))
        {
            status=Send::SENDING_DATA;
            buffer.clear();
            socket->write("DATA\n");
        }
        else
            showError("Destinataire on valide", socket);
        return;
    }
    else if(status==Send::SENDING_DATA)
    {
        if(buffer.startsWith("354"))
        {
            buffer.clear();
            QString bound=boundary(15);
            QString sjt_enc="=?UTF-8?B?"+sjt().toUtf8().toBase64()+"?=";
            QString body_enc=body().toUtf8().toBase64();

            socket->write(QString("Subject: "+sjt_enc+"\r\n").toStdString().c_str());
            socket->write(QString("From: <"+user()+">\r\n").toStdString().c_str());
            if(sendType==Send::SEND_RCPT)
                socket->write(QString("To: <"+rcpt()+">\r\n").toStdString().c_str());
            else if(sendType==Send::SEND_ME)
                socket->write(QString("To: <"+user()+">\r\n").toStdString().c_str());
            else if(sendType==Send::SEND_ME_RCPT)
                socket->write(QString("To: <"+rcpt()+"> <"+user()+">\r\n").toStdString().c_str());
            socket->write("MIME-Version: 1.0\r\n");
            socket->write(QString("Content-Type: multipart/mixed; boundary=\""+bound+"\"\r\n").toStdString().c_str());
            socket->write(QString("Date: "+QDateTime::currentDateTime().toString("ddd, d MMM yyyy hh:mm:ss +0200")+"\r\n").toStdString().c_str());
            socket->write("\r\n");

            socket->write(QString("--"+bound+"\r\n").toStdString().c_str());
            socket->write("Content-Type: text/html; charset=\"UTF-8\"\r\n");
            socket->write("Content-Transfer-Encoding: base64\r\n");
            socket->write("\r\n");
            socket->write(QString(body_enc+"\r\n").toStdString().c_str());
            socket->write("\r\n");

            QFile file(filePath().replace("\\", "/"));

            if(file.exists()&&file.open(QIODevice::ReadOnly))
            {
                widStatus->showStatus("Envoi de la pièce jointe: 0%...");
                socket->write(QString("--"+bound+"\r\n").toStdString().c_str());
                QString filePath_enc="=?UTF-8?B?"+filePath().split("/").last().toUtf8().toBase64()+"?=";
                QString mime="application/octet-stream";
                if(filePath().contains(QRegExp("\\.xls[x]{0,1}$")))
                    mime="application/vnd.ms-excel";
                if(filePath().contains(QRegExp("\\.doc[x]{0,1}$")))
                    mime="application/vnd.msword";
                if(filePath().contains(QRegExp("\\.pdf$")))
                    mime="application/pdf";


                socket->write(QString("Content-Type: "+mime+"\r\n").toStdString().c_str());
                socket->write("Content-Transfer-Encoding: base64\r\n");
                socket->write(QString("Content-Disposition: attachment; filename=\""+filePath_enc+"\"\r\n").toStdString().c_str());
                socket->write("\r\n");
                int p=0;
                QByteArray data=file.readAll();
                data=data.toBase64();
                for(int i=0;i<data.size();i++)
                {
                    if(i*100/data.size()!=p)
                    {
                        p=i*100/data.size();
                        widStatus->showStatus("Envoi de la pièce jointe: "+QString::number(p)+"%...");
                    }
                    socket->write(QByteArray().append(data.at(i)));
                    while(socket->waitForBytesWritten(50))
                        qApp->processEvents();

                }
                socket->write("\r\n\r\n");

            }
            else
            {
                showError("Fichier imossible à ouvrir", socket);
                return;
            }
            socket->write(QString("--"+bound+"--\r\n").toStdString().c_str());

            status=Send::QUIT;
            socket->write(".\r\n");
        }
        else if(sendType==Send::SEND_ME_RCPT)
        {
            if(!buffer.startsWith("250"))
                showError("Expediteur non valide", socket);
            buffer.clear();
        }
        else
            showError("Impossible d'envoyer le corps du mail", socket);
        return;
    }
    else if(status==Send::QUIT)
    {
        if(buffer.startsWith("250"))
        {
            status=Send::DISCO;
            buffer.clear();
            if(sendType!=Send::SEND_ME_RCPT)
                widStatus->showStatus("Mail envoyé. Déconnection...");
            else if(sendType==Send::SEND_ME_RCPT)
                widStatus->showStatus("Mails envoyés. Déconnection...");
            socket->write("quit\n");
        }
        else
            showError("Données invalides envoyées", socket);
        return;
    }
    else if(status==Send::DISCO)
    {
        if(buffer.startsWith("221"))
        {
            setEnabled(true);
            if(sendType==Send::TEST_PARAMS)
                widStatus->showSuccess("Compte mail valide");
            else if(sendType==Send::SEND_ME_RCPT)
                widStatus->showSuccess("Mails tests envoyés");
            else
                widStatus->showSuccess("Mail test envoyé");
            buffer.clear();
            socket->disconnect();
            socket->deleteLater();
        }
        else
            showError("Commande de déconnection refusée", socket);
        return;
    }
}

void MainWindow::error(QAbstractSocket::SocketError)
{
    widStatus->show();
    widStatus->showError(((QTcpSocket*)sender())->errorString());
}

QString MainWindow::boundary(int lenght)
{
    QString chars="AZERTYUIOPQSDFGHJKLMWXCVBNazertyuiopqsdfghjklmwxcvbn0123456789";
    QString b="";
    for(int l=0;l<lenght;l++)
        b+=chars.at(qMax(qMin(((double)chars.size()-1), ((double)rand())*chars.size()/RAND_MAX), (double)0));

    return "_"+b+"_";
}

void MainWindow::trayActivated(QSystemTrayIcon::ActivationReason r)
{
    if(r!=QSystemTrayIcon::Context)
        show();
}

void MainWindow::on_grpFilePath_toggled(bool arg1)
{
    if(!arg1)
        ui->lineFilePath->clear();

}

void MainWindow::on_btnBrowseFilePath_clicked()
{
    QString file=QFileDialog::getOpenFileName(this, "Fichier à joindre...");
    if(!file.isEmpty())
        ui->lineFilePath->setText(file);
}

void MainWindow::on_buttonBox_accepted()
{
    set->setValue("User", ui->lineUser->text());
    set->setValue("Pass", ui->linePass->text());
    set->setValue("Rcpt", ui->lineRcpt->text());
    set->setValue("FilePath", ui->lineFilePath->text());
    set->setValue("Sjt", ui->lineSjt->text());
    set->setValue("Body", ui->lineBody->toHtml());
    set->setValue("Day", ui->comboDay->currentIndex());
    set->setValue("Hour", ui->lineHour->time());
}

void MainWindow::send()
{
    if(!isEnabled())
        return;
    setEnabled(false);
    widStatus->show();
    widStatus->showStatus("Connection...");
    status=Send::HELO;
    QTcpSocket* sock=new QTcpSocket(this);
    connect(sock, SIGNAL(readyRead()), this, SLOT(readyRead()));
    connect(sock, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error(QAbstractSocket::SocketError)));
    sock->connectToHost("smtpauth.orange.fr", 25);
}

void MainWindow::setupUI()
{
    ui->lineUser->setText(user());
    ui->linePass->setText(pass());
    ui->lineRcpt->setText(rcpt());
    ui->lineFilePath->setText(filePath());
    ui->lineSjt->setText(sjt());
    ui->lineBody->setHtml(body());
    ui->grpFilePath->setChecked(!filePath().isEmpty());
    ui->comboDay->setCurrentIndex(day());
    ui->lineHour->setTime(hour());
}

void MainWindow::on_buttonBox_rejected()
{
    setupUI();
}

void MainWindow::closeEvent(QCloseEvent *e)
{
    if(!qApp->arguments().contains("-indev"))
    {
        e->ignore();
        hide();
    }
    else
        e->accept();
}

void MainWindow::keyPressEvent(QKeyEvent *e)
{
    if(e->key()==Qt::Key_Return||e->key()==Qt::Key_Enter)
        on_buttonBox_accepted();
}

void MainWindow::checkTime()
{
    QDateTime next=QDateTime::currentDateTime();
    while(next.date().dayOfWeek()!=day()+1)
        next=next.addDays(1);
    if(QDateTime::currentDateTime().time()>hour())
        next=next.addDays(7);
    next.setTime(hour());

    int remaining=QDateTime::currentDateTime().secsTo(next);
    QTime re;
    re=re.addSecs(remaining);
    if(remaining==3599)
        widStatus->show();
    if(remaining<=3599&&remaining>3585)
        widStatus->showRemainingTime(re);
    else if(remaining==3585)
        widStatus->hide();

    else if(remaining==1800)
        widStatus->show();
    if(remaining<=1800&&remaining>1785)
        widStatus->showRemainingTime(re);
    else if(remaining==1785)
        widStatus->hide();

    else if(remaining==600)
        widStatus->show();
    if(remaining<=600)
    {
        widStatus->showRemainingTime(re);
        if(remaining==0)
        {
            sendType=Send::SEND_RCPT;
            send();
        }
    }

    //qDebug()<<"Current:"<<QDateTime::currentDateTime()<<"Next:"<<remaining;
}

void MainWindow::showError(QString erreur, QTcpSocket *socket)
{
    qDebug()<<"ERREUR:"<<buffer;
    setEnabled(true);
    widStatus->show();
    widStatus->showError(erreur);
    socket->disconnect();
    socket->deleteLater();
    buffer.clear();
}

void MainWindow::on_btnTestUser_clicked()
{
    on_buttonBox_accepted();
    sendType=Send::TEST_PARAMS;
    send();
}

void MainWindow::on_btnTestMail_clicked()
{
    on_buttonBox_accepted();
    DlgMailTest* test=new DlgMailTest(this);
    if(test->exec()==QDialog::Accepted)
    {
        if(test->getUi()->radioMe->isChecked())
            sendType=Send::SEND_ME;
        else if(test->getUi()->radioMeRcpt->isChecked())
            sendType=Send::SEND_ME_RCPT;
        else if(test->getUi()->radioRcpt->isChecked())
            sendType=Send::SEND_RCPT;
        send();
    }
}

void MainWindow::on_lblBody_linkActivated(const QString &link)
{
    if(link=="richText")
    {
        DlgRichText* t=new DlgRichText(this);
        t->setText(ui->lineBody->toHtml());
        if(t->exec()==QDialog::Accepted)
            ui->lineBody->setHtml(t->getText());
        t->deleteLater();
    }
}

 Conclusion

Cette source peut donc servir de base pour implémenter le protocole (A)SMTP, ou simplement une action hebdomadaire.
En espérant que ça aide quelqu'un ;)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources de la même categorie

Source avec Zip LINUX: UTILISATION ETHTOOL (TEST DU LIEN ETHERNET, VITESSE, ... par Twinuts
Source avec Zip GESTIONNAIRE_FTP(CLIENT+SERVEUR) par cyberntique
Source avec Zip Source avec une capture MINI SERVEUR HTTP [WINDOWS] par ganjarasta
Source avec Zip Source avec une capture CLIENT DE TEST MODBUS TCP par brunovan
Source avec Zip Source avec une capture SCANIP [ARP / ICMP] par ganjarasta

 Sources en rapport avec celle ci

Source avec une capture TRACE ROUTE AVEC QT par LoVerMaKi
Source avec une capture PING SUR QT par LoVerMaKi
Source avec Zip Source avec une capture QL-CHATROOM V 1.0 par mature
Source avec Zip Source avec une capture GEOLOCALISATION par ganjarasta
Source avec Zip Source avec une capture CONTACTS MANAGER par eapaceinfo

Commentaires et avis

Commentaire de caribert le 12/07/2012 10:25:10

Bonjour,

Merci pour ce code, mais la tentative d' installation que j'ai pu faire ne semble pas fonctionner...
Même en tentant le test sur expéditeur ou destinataire.
Windows 7
Qtcreator 2.4.1
Qt 4.8.0

La connexion et timeout....

Merci pour votre réponse.

Commentaire de rob57530 le 12/07/2012 23:05:17

Bonjour, le problème vient surement du fait que le serveur smtp est hardcoded, si tu n'est pas chez orange, c'est presque normal que ça ne fonctionne pas, les parefeu des box bloquent les serveurs smtp qui ne sont pas les leurs. Il suffit simplement de changer l'adresse du serveur à la ligne 307 ==> smtpauth.orange.fr, en la remplacant par votre FAI, dispo ici: http://www.commentcamarche.net/faq/893-adresses-des-serveurs-pop-et-smtp-des-principaux-fai

Commentaire de caribert le 13/07/2012 07:53:38

Bonjour et merci pour ta réponse. En effet je suis chez Free et il bloque visiblement l' accès à un autre smtp. Mon objectif est de créer une application d' envoi d' Email différents et en nombre ( < 500000/mois ). Pas du spam bien entendu, mais la nuance semble difficile à démontrer aux différents filtres du réseau. Une expérience dans ce domaine ? sachant  que je n'ai pas de serveur dédié.

Commentaire de rob57530 le 13/07/2012 16:26:53

Bah, ça fait beaucoup tout ça^^ tu risque effectivement de te faire kick, soit par un parfeu, ou un filtre anti-spam... Etant donné que cet exemple utilise ASMTP, et pas juste SMTP, il est cependant possible que ça passe, après, pour ta liste de 'contact', là, c'est toi qui gère ;)

Commentaire de kulopi le 21/08/2012 17:41:28

Bonjour, j'ai essayer mail avec Gmail en modifiant la ligne 307, en utilisant "smtp.gmail.com" mais malheureusement je m'ai pas de réponse lorsque je teste l'adresse.

Commentaire de rob57530 le 22/08/2012 10:21:13

Bonjour,
Le problème est que gmail (ainsi que d'autres) force à utiliser une connexion sécurisé SSL, la seule chose à changer (a priori) serait de changer la ligne 304, et remplacer new QTcpSocket par new QSslSocket, et bien évidemment, l'adresse du serveur :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

SMTP.... [ par B2K ] Bonjour,J'aimerais savoir comment peut-on envoyer un mail, en C++J'ai essayé avec les sources que j'ai trouvé dans "Réseau Internet" mais ça ne marche QT Designer [ par BisonFute ] Bon sa serais juste pour savoir si qqu'un s'y connais en QT Designer car j'arrive pas a faire plusieurs truc donc si qqu'un a le courage de m'aider et bases de l'utilisation de VC++ (suis nul et je pige pas) [ par lmondeil ] Light. Je suis nul mais je me soigne!salut tout le monde. J'ai un souci avec la manipulation de Visual C++ 6 :Je dois bosser sout VC++ en utilisant QT Information Serveur Smtp [ par Kotei ] Je cherche des info. pour creer un serveur STMP, quelqu'un a une idee pour en faire unMerci ca fais 1 semaine ke je sui dessus snif Horloge [ par djamine ] Bonjour a tout le mondeje suis entrain de faire un programme trés anncien en Cc'est d'afficher l'heure comme ça (hh.mn.sc) quand les secondes atteindr programmation qt [ par vedder ] Bonjour jje develope actuellement une application linux sous kdevelop et j'aimerais faire fonctionner deux fonctionnalites :1/ j'aimerais afficher une recuperation du nom du serveur SMTP local non virtuel de IIS [ par godmajestic ] SalutJ'aimerais recuperer le nom du serveur SMTP de la machine local, pour faire un envoi de mail a patir de celui ci!La plupart des programmes d'envo api multicast [ par NADA114 ] Bonjour, Je veux faire une diffusion de message entre serveurs et clients en C++(plus plus) et en utilisant QT . Cependant QT ne supporte ni le mul Programmation QT, besoin d'aide URGENT!!! [ par D1m3x ] Salut tout le monde,est-ce que quelqu'un sait me dire où je peux trouver de l'aide QT en français??? car j'ai fait un projet et grace à ce bout de cod QT win32 et vc++6.0 [ par MoDDiB ] J'ai cree une dialogbox avec une editbox dedans grace au ressource de vc++.J'obtiens donc un id (IDC_PASS par ex)Mais le blem c'est que lorsque je veu


Nos sponsors


Sondage...

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,842 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales