Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to send Email from my application?
Forum Update on Tuesday, May 27th 2025

How to send Email from my application?

Scheduled Pinned Locked Moved Solved General and Desktop
25 Posts 6 Posters 4.2k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • JonBJ JonB

    @Long-Vu-Ngoc
    At least your new example is correct HTML now. I don't know where you copied the previous HTML you had from.
    In Outlook you have a setting as to whether to display emails as plain text or HTML. Have you set that to allow it to show as HTML?

    L Offline
    L Offline
    Long Vu Ngoc
    wrote on last edited by
    #14

    @JonB I already set that but it still not work.
    ca29604d-57d6-46b8-ab7b-ec373f4d72ec-image.png
    8aa96929-319f-4e32-9e0b-4b9b0e54174c-image.png

    JonBJ 1 Reply Last reply
    0
    • L Long Vu Ngoc

      @JonB I already set that but it still not work.
      ca29604d-57d6-46b8-ab7b-ec373f4d72ec-image.png
      8aa96929-319f-4e32-9e0b-4b9b0e54174c-image.png

      JonBJ Offline
      JonBJ Offline
      JonB
      wrote on last edited by
      #15

      @Long-Vu-Ngoc
      That is actually the setting for whether to send messages in HTML. I thought there was one for whether to display in HTML received messages, but maybe not.

      I have never used a command line like

      Outlook.exe /c ipm.note /m user@contoso.com?subject=Test&body="HERE YOUR HTML"
      

      It is possible that this body=... argument automatically means send as text not HTML, I don't know.

      On the message received in the inbox, can you display the source and see what it looks like. I think you right-click in an empty area of the body when showing a message and select View Source. Let's see whether it looks like it has sent any HTML.

      L 1 Reply Last reply
      0
      • JonBJ JonB

        @Long-Vu-Ngoc
        That is actually the setting for whether to send messages in HTML. I thought there was one for whether to display in HTML received messages, but maybe not.

        I have never used a command line like

        Outlook.exe /c ipm.note /m user@contoso.com?subject=Test&body="HERE YOUR HTML"
        

        It is possible that this body=... argument automatically means send as text not HTML, I don't know.

        On the message received in the inbox, can you display the source and see what it looks like. I think you right-click in an empty area of the body when showing a message and select View Source. Let's see whether it looks like it has sent any HTML.

        L Offline
        L Offline
        Long Vu Ngoc
        wrote on last edited by
        #16

        @JonB said in How to send Email from my application?:

        It is possible that this body=... argument automatically means send as text not HTML, I don't know.

        You said right. I check source and it is Plain text,
        Here is source: </head>
        <body lang="EN-US" link="#0563C1" vlink="#954F72">
        <div class="WordSection1">
        <p class="MsoPlainText"><html><head></head><body>Hello World<h1>Hello World</h1><p>Hello World</p></body></html><o:p></o:p></p>
        </div>
        <br>
        <span style="font-size: 8pt; font-family: Arial, sans-serif, serif, EmojiFont; color: rgb(115, 115, 115);"><i>***********************************************************************
        <br>

        JonBJ 1 Reply Last reply
        0
        • L Long Vu Ngoc

          @JonB said in How to send Email from my application?:

          It is possible that this body=... argument automatically means send as text not HTML, I don't know.

          You said right. I check source and it is Plain text,
          Here is source: </head>
          <body lang="EN-US" link="#0563C1" vlink="#954F72">
          <div class="WordSection1">
          <p class="MsoPlainText"><html><head></head><body>Hello World<h1>Hello World</h1><p>Hello World</p></body></html><o:p></o:p></p>
          </div>
          <br>
          <span style="font-size: 8pt; font-family: Arial, sans-serif, serif, EmojiFont; color: rgb(115, 115, 115);"><i>***********************************************************************
          <br>

          JonBJ Offline
          JonBJ Offline
          JonB
          wrote on last edited by
          #17

          @Long-Vu-Ngoc
          Yeah. I did have a Google around a looked quite a bit, not one example of this command line being used to send HTML (as opposed to plain) text, and not one person asking.

          IIRC, when you type into Outlook UI for rich text it does something like sends a message which has both HTML and plain text versions embedded in it, as "alternatives". For whatever reason I'm thinking you can't make it send as HTML from command-line body=... argument.

          L 1 Reply Last reply
          0
          • JonBJ JonB

            @Long-Vu-Ngoc
            Yeah. I did have a Google around a looked quite a bit, not one example of this command line being used to send HTML (as opposed to plain) text, and not one person asking.

            IIRC, when you type into Outlook UI for rich text it does something like sends a message which has both HTML and plain text versions embedded in it, as "alternatives". For whatever reason I'm thinking you can't make it send as HTML from command-line body=... argument.

            L Offline
            L Offline
            Long Vu Ngoc
            wrote on last edited by
            #18

            @JonB Do you have any suggestions for that? I want to open a mail app (outlook) and attach the html file in the body

            JonBJ C 2 Replies Last reply
            0
            • L Long Vu Ngoc

              @JonB Do you have any suggestions for that? I want to open a mail app (outlook) and attach the html file in the body

              JonBJ Offline
              JonBJ Offline
              JonB
              wrote on last edited by JonB
              #19

              @Long-Vu-Ngoc
              If you really wanted to do this, given we can't find how to do it you would need to use VBA. Google if you don't know this. Qt has QAxObject as entry point to this. It's going to be a lot more code. Or you may be able to run Powershell as external command passing it parameters, that allows you to access this level.

              I would be looking at sending via SMTP instead, as @ChrisW67 mentioned above. But that too is some work, and you need to connect to an SMTP server available to you.

              1 Reply Last reply
              0
              • L Long Vu Ngoc

                @JonB Do you have any suggestions for that? I want to open a mail app (outlook) and attach the html file in the body

                C Offline
                C Offline
                ChrisW67
                wrote on last edited by ChrisW67
                #20

                @Long-Vu-Ngoc. @JonB

                The mailto: syntax used in the Outlook command line allows only for plain text messages. That syntax predates HTML/rich text email by a long margin.

                To send an HTML body via Outlook you could use a variation of the Powershell script found here. Something like:

                # File blah.ps1
                param (
                    [string]$to = "default@default.com",
                    [string]$cc = "default@default.com",
                    [string]$subject = "default subject",
                    [string]$body = "body content",
                    [switch]$html = $false
                )
                
                $ol = New-Object -comObject Outlook.Application
                
                $mail = $ol.CreateItem(0)
                $mail.To = $to
                $mail.Cc = $cc
                $mail.Subject = $subject
                if($html) {
                    $mail.HTMLBody = $body
                } else {
                    $mail.Body = $body
                }
                
                $mail.Send
                

                Launch Powershell using QProcess in much the same sort of way. IMHO all emails should contain a usable text-only part along with any rich text format. Outlook's interface seems to actively fight this (setting HTMLBody mangles Body).

                Edit: If you are going to use Powershell then you should look at Send-MailMessage. This avoids Outlook client altogether, but requires an SMTP server (which may be a Microsoft mail server).

                You may have to deal with restrictions on running Powershell scripts.

                Have a look at Qutlook example to see how you might automate the application more directly.

                1 Reply Last reply
                1
                • L Long Vu Ngoc

                  I have a Pdf fle in my application. I want to send this file by email when user press send via email button in my app. It will send a Email Notification like that.
                  e84d8f51-df3a-4d05-8d58-b6c0488c3c1a-image.png
                  Do you have any idea to do that?
                  Thank you!

                  Ronel_qtmasterR Offline
                  Ronel_qtmasterR Offline
                  Ronel_qtmaster
                  wrote on last edited by
                  #21

                  @Long-Vu-Ngoc it is simple.sendind emails is through the SMTP protocol

                  1.Go a read about the smtp protocol and commands
                  2.Create a Tcp socket and connect to the smtp server
                  3.Write hello to the server and see if the connection is successful.
                  4. In your mail account you should grant access of your application
                  5. Use Switch structure to Switch between the differences responses of the server, in order to now which info you should send( title, body, attachements etc...)

                  this is an exemple of code i used for tests.However it is not complete.Hope that it helps.

                  main.cpp
                  #include <QCoreApplication>
                  #include <QDebug>
                  #include <QString>
                  #include <iostream>
                  #include <QHostAddress>
                  #include <QTextStream>
                  #include "smtp.h"

                  QString command;
                  QString password;
                  QString email;
                  QString host;
                  qint16 port;
                  using namespace std;
                  int main(int argc, char *argv[])
                  {

                  QCoreApplication a(argc, argv);
                  smtp client;
                  command ="";
                  qDebug()<<"----------------------";
                  qDebug()<<"MailSender 2.0\r\n";
                  qDebug()<<"----------------------";
                  qDebug()<<"serverName: stmp.mail.yahoo.com";
                  qDebug()<<"port: 25";
                  qDebug()<<"CommandList -->";
                  qDebug()<<"HELO";
                   qDebug () <<"EHLO";
                  qDebug()<<"AUTH LOGIN";
                  qDebug()<<"MAIL FROM";
                  qDebug () <<"RCPT TO";
                   qDebug () <<"TURN";
                    qDebug () <<"ATRN";
                     qDebug () <<"SIZE";
                      qDebug () <<"ETRN";
                     qDebug () <<"PIPELINING";
                      qDebug () <<"CHUNKING";
                       qDebug () <<"DATA";
                      qDebug () <<"DSN";
                       qDebug () <<"RSET";
                        qDebug () <<"VRFY";
                         qDebug () <<"HELP";
                  qDebug () <<"QUIT";
                  qDebug()<<"----------------------";
                  client.socket->connectToHost("smtp.mail.yahoo.com", 25);
                  qDebug()<<"connecting";
                  
                  return a.exec();
                  

                  }
                  smtp.h

                  #ifndef SMTP_H
                  #define SMTP_H

                  #include <QObject>
                  #include <QTcpSocket>

                  class smtp : public QObject
                  {
                  Q_OBJECT

                  public:
                  explicit smtp(QObject *parent = 0);
                  ~smtp();
                  QTcpSocket *socket;
                  QString last;
                  int state;
                  int c;
                  enum states{
                  HELLO,
                  AUTH_LOGIN,
                  USER,
                  PASSWORD

                  };
                  protected:

                  private slots:
                  void stateChanged(QAbstractSocket::SocketState socketState);
                  void errorReceived(QAbstractSocket::SocketError socketError);

                  void disconnected();
                  void connected();
                  void readyread();
                  void enteraCommand(QString instruction);
                  

                  };

                  #endif // SMTP_H

                  smtp.cpp

                  #include "smtp.h"
                  #include <QTextStream>
                  #include <QString>
                  #include <QTimer>
                  #include <QTime>
                  #include <stdio.h>
                  #include <iostream>
                  #include <QTime>
                  #include <QHostAddress>

                  using namespace std;
                  QString c;
                  smtp::smtp(QObject *parent) :
                  QObject(parent)
                  {
                  socket = new QTcpSocket(this);
                  connect(socket,SIGNAL(connected()), this, SLOT(connected()));
                  connect(socket,SIGNAL(disconnected()), this, SLOT(disconnected()));
                  connect(socket,SIGNAL(readyRead()), this, SLOT(readyread()));
                  connect(socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)),this, SLOT(stateChanged(QAbstractSocket::SocketState)));
                  connect(socket,SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(errorReceived(QAbstractSocket::SocketError)));
                  last = "";
                  state = HELLO;
                  c =0;

                  }

                  smtp::~smtp()
                  {

                  }

                  void smtp::connected()
                  {
                  qDebug()<<"connected";
                  socket->write("HELO yahoo.com\r\n");

                  }
                  void smtp::disconnected()
                  {
                  qDebug()<<"disconnected";
                  qDebug()<<socket->errorString();

                  qDebug()<<"1= Try again";
                  
                  
                  QString response;
                  QTextStream stream(stdin);
                  stream >> response;
                  if(response == "1")
                  {
                      socket->connectToHost("smtp.mail.yahoo.com", 25);
                      qDebug() <<"connecting to smtp.mail.yahoo.com";
                  
                  }
                  else
                  {
                      qDebug()<<"invalid command";
                  
                  }
                  

                  }
                  void smtp::readyread()
                  {
                  while (!socket->atEnd()) {
                  QString line = socket->readLine();
                  qDebug()<< line;
                  if(line.startsWith("220"))
                  {
                  QString instruction = "enter the command AUTH LOGIN";
                  enteraCommand(instruction);
                  }
                  else if(line.startsWith("250"))
                  {
                  qDebug()<<line;
                  enteraCommand("entrez une commande");
                  }
                  else
                  if(line.startsWith("334"))
                  {
                  if(c == 1)
                  {
                  enteraCommand("password");
                  }
                  else
                  {
                  enteraCommand("email");
                  }
                  }
                  else
                  {
                  qDebug()<<line;
                  enteraCommand("entrez une commande");
                  }

                  }
                  }

                  void smtp::stateChanged(QAbstractSocket::SocketState socketState)
                  {
                  qDebug()<<socketState;
                  }
                  void smtp::errorReceived(QAbstractSocket::SocketError socketError)
                  {
                  qDebug()<< socketError;

                  }
                  void smtp::enteraCommand(QString instruction)
                  {
                  QString command;
                  qDebug()<<instruction;
                  QTextStream stream(stdin);
                  stream >> command;
                  if(instruction == "password" || instruction == "email")
                  {
                  socket->write(command.toLatin1().toBase64());
                  }else
                  {
                  socket->write(command.toLatin1());
                  }

                  }

                  smtp.ui

                  <?xml version='1.0'?>
                  <ui version="4.0">
                  <author/>
                  <comment/>
                  <exportmacro/>
                  <class>smtp</class>
                  <widget name="smtp" class="QWidget">
                  <property name="geometry">
                  <rect>
                  <x>0</x>
                  <y>0</y>
                  <width>640</width>
                  <height>480</height>
                  </rect>
                  </property>
                  <property name="windowTitle">
                  <string>Form</string>
                  </property>
                  </widget>
                  <pixmapfunction/>
                  <connections/>
                  </ui>

                  smtp.pro

                  QT += core network
                  QT -= gui

                  CONFIG += c++11

                  TARGET = mailSender_conso
                  CONFIG += console
                  CONFIG -= app_bundle

                  TEMPLATE = app

                  SOURCES += main.cpp
                  smtp.cpp

                  HEADERS +=
                  smtp.h

                  JonBJ 1 Reply Last reply
                  0
                  • Ronel_qtmasterR Ronel_qtmaster

                    @Long-Vu-Ngoc it is simple.sendind emails is through the SMTP protocol

                    1.Go a read about the smtp protocol and commands
                    2.Create a Tcp socket and connect to the smtp server
                    3.Write hello to the server and see if the connection is successful.
                    4. In your mail account you should grant access of your application
                    5. Use Switch structure to Switch between the differences responses of the server, in order to now which info you should send( title, body, attachements etc...)

                    this is an exemple of code i used for tests.However it is not complete.Hope that it helps.

                    main.cpp
                    #include <QCoreApplication>
                    #include <QDebug>
                    #include <QString>
                    #include <iostream>
                    #include <QHostAddress>
                    #include <QTextStream>
                    #include "smtp.h"

                    QString command;
                    QString password;
                    QString email;
                    QString host;
                    qint16 port;
                    using namespace std;
                    int main(int argc, char *argv[])
                    {

                    QCoreApplication a(argc, argv);
                    smtp client;
                    command ="";
                    qDebug()<<"----------------------";
                    qDebug()<<"MailSender 2.0\r\n";
                    qDebug()<<"----------------------";
                    qDebug()<<"serverName: stmp.mail.yahoo.com";
                    qDebug()<<"port: 25";
                    qDebug()<<"CommandList -->";
                    qDebug()<<"HELO";
                     qDebug () <<"EHLO";
                    qDebug()<<"AUTH LOGIN";
                    qDebug()<<"MAIL FROM";
                    qDebug () <<"RCPT TO";
                     qDebug () <<"TURN";
                      qDebug () <<"ATRN";
                       qDebug () <<"SIZE";
                        qDebug () <<"ETRN";
                       qDebug () <<"PIPELINING";
                        qDebug () <<"CHUNKING";
                         qDebug () <<"DATA";
                        qDebug () <<"DSN";
                         qDebug () <<"RSET";
                          qDebug () <<"VRFY";
                           qDebug () <<"HELP";
                    qDebug () <<"QUIT";
                    qDebug()<<"----------------------";
                    client.socket->connectToHost("smtp.mail.yahoo.com", 25);
                    qDebug()<<"connecting";
                    
                    return a.exec();
                    

                    }
                    smtp.h

                    #ifndef SMTP_H
                    #define SMTP_H

                    #include <QObject>
                    #include <QTcpSocket>

                    class smtp : public QObject
                    {
                    Q_OBJECT

                    public:
                    explicit smtp(QObject *parent = 0);
                    ~smtp();
                    QTcpSocket *socket;
                    QString last;
                    int state;
                    int c;
                    enum states{
                    HELLO,
                    AUTH_LOGIN,
                    USER,
                    PASSWORD

                    };
                    protected:

                    private slots:
                    void stateChanged(QAbstractSocket::SocketState socketState);
                    void errorReceived(QAbstractSocket::SocketError socketError);

                    void disconnected();
                    void connected();
                    void readyread();
                    void enteraCommand(QString instruction);
                    

                    };

                    #endif // SMTP_H

                    smtp.cpp

                    #include "smtp.h"
                    #include <QTextStream>
                    #include <QString>
                    #include <QTimer>
                    #include <QTime>
                    #include <stdio.h>
                    #include <iostream>
                    #include <QTime>
                    #include <QHostAddress>

                    using namespace std;
                    QString c;
                    smtp::smtp(QObject *parent) :
                    QObject(parent)
                    {
                    socket = new QTcpSocket(this);
                    connect(socket,SIGNAL(connected()), this, SLOT(connected()));
                    connect(socket,SIGNAL(disconnected()), this, SLOT(disconnected()));
                    connect(socket,SIGNAL(readyRead()), this, SLOT(readyread()));
                    connect(socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)),this, SLOT(stateChanged(QAbstractSocket::SocketState)));
                    connect(socket,SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(errorReceived(QAbstractSocket::SocketError)));
                    last = "";
                    state = HELLO;
                    c =0;

                    }

                    smtp::~smtp()
                    {

                    }

                    void smtp::connected()
                    {
                    qDebug()<<"connected";
                    socket->write("HELO yahoo.com\r\n");

                    }
                    void smtp::disconnected()
                    {
                    qDebug()<<"disconnected";
                    qDebug()<<socket->errorString();

                    qDebug()<<"1= Try again";
                    
                    
                    QString response;
                    QTextStream stream(stdin);
                    stream >> response;
                    if(response == "1")
                    {
                        socket->connectToHost("smtp.mail.yahoo.com", 25);
                        qDebug() <<"connecting to smtp.mail.yahoo.com";
                    
                    }
                    else
                    {
                        qDebug()<<"invalid command";
                    
                    }
                    

                    }
                    void smtp::readyread()
                    {
                    while (!socket->atEnd()) {
                    QString line = socket->readLine();
                    qDebug()<< line;
                    if(line.startsWith("220"))
                    {
                    QString instruction = "enter the command AUTH LOGIN";
                    enteraCommand(instruction);
                    }
                    else if(line.startsWith("250"))
                    {
                    qDebug()<<line;
                    enteraCommand("entrez une commande");
                    }
                    else
                    if(line.startsWith("334"))
                    {
                    if(c == 1)
                    {
                    enteraCommand("password");
                    }
                    else
                    {
                    enteraCommand("email");
                    }
                    }
                    else
                    {
                    qDebug()<<line;
                    enteraCommand("entrez une commande");
                    }

                    }
                    }

                    void smtp::stateChanged(QAbstractSocket::SocketState socketState)
                    {
                    qDebug()<<socketState;
                    }
                    void smtp::errorReceived(QAbstractSocket::SocketError socketError)
                    {
                    qDebug()<< socketError;

                    }
                    void smtp::enteraCommand(QString instruction)
                    {
                    QString command;
                    qDebug()<<instruction;
                    QTextStream stream(stdin);
                    stream >> command;
                    if(instruction == "password" || instruction == "email")
                    {
                    socket->write(command.toLatin1().toBase64());
                    }else
                    {
                    socket->write(command.toLatin1());
                    }

                    }

                    smtp.ui

                    <?xml version='1.0'?>
                    <ui version="4.0">
                    <author/>
                    <comment/>
                    <exportmacro/>
                    <class>smtp</class>
                    <widget name="smtp" class="QWidget">
                    <property name="geometry">
                    <rect>
                    <x>0</x>
                    <y>0</y>
                    <width>640</width>
                    <height>480</height>
                    </rect>
                    </property>
                    <property name="windowTitle">
                    <string>Form</string>
                    </property>
                    </widget>
                    <pixmapfunction/>
                    <connections/>
                    </ui>

                    smtp.pro

                    QT += core network
                    QT -= gui

                    CONFIG += c++11

                    TARGET = mailSender_conso
                    CONFIG += console
                    CONFIG -= app_bundle

                    TEMPLATE = app

                    SOURCES += main.cpp
                    smtp.cpp

                    HEADERS +=
                    smtp.h

                    JonBJ Offline
                    JonBJ Offline
                    JonB
                    wrote on last edited by
                    #22

                    @Ronel_qtmaster
                    Hi there. Your code may be fine, but would benefit from enclosing inside forum's Code tags (icon </> when posting, or ``` (3 backticks) above & below code block.

                    The problem for the OP is that (a) he needs to have some external email account to do this and (b) your code may work with smtp.mail.yahoo.com but, say, gmail's one long since stopped users from doing this and require user to be logged in or use some other form of authentication before they allow it these days. It's only fair to bring this to OP's attention.

                    V 1 Reply Last reply
                    0
                    • L Offline
                      L Offline
                      Long Vu Ngoc
                      wrote on last edited by
                      #23

                      @ChrisW67 @JonB Thank you for your support. I have already solved it.

                      1 Reply Last reply
                      0
                      • L Long Vu Ngoc has marked this topic as solved on
                      • JonBJ JonB

                        @Ronel_qtmaster
                        Hi there. Your code may be fine, but would benefit from enclosing inside forum's Code tags (icon </> when posting, or ``` (3 backticks) above & below code block.

                        The problem for the OP is that (a) he needs to have some external email account to do this and (b) your code may work with smtp.mail.yahoo.com but, say, gmail's one long since stopped users from doing this and require user to be logged in or use some other form of authentication before they allow it these days. It's only fair to bring this to OP's attention.

                        V Offline
                        V Offline
                        Volker75
                        wrote on last edited by
                        #24

                        @JonB I am using https://github.com/cutelyst/simple-mail
                        It also works with google. But not by default. You must enable in google SMTP, 2FA and set a password. Then it is working fine with gmail.

                        JonBJ 1 Reply Last reply
                        1
                        • V Volker75

                          @JonB I am using https://github.com/cutelyst/simple-mail
                          It also works with google. But not by default. You must enable in google SMTP, 2FA and set a password. Then it is working fine with gmail.

                          JonBJ Offline
                          JonBJ Offline
                          JonB
                          wrote on last edited by
                          #25

                          @Volker75 said in How to send Email from my application?:

                          2FA and set a password

                          That's the bit I meant. You didn't used to have to do that, now one has all this complication, that's all.

                          Glad you found a library for Qt to do SMTP.

                          1 Reply Last reply
                          0

                          • Login

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Categories
                          • Recent
                          • Tags
                          • Popular
                          • Users
                          • Groups
                          • Search
                          • Get Qt Extensions
                          • Unsolved