0 / 0 / 0
Регистрация: 24.08.2016
Сообщений: 4

Отправка email средствами SMTP виде HTML

24.08.2016, 01:23. Показов 4254. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, ребята! Первый раз регистрируюсь на форуме, первый раз задаю вопрос, так что не обессудьте) Задача чисто практическая и туповатая, но ответа не нашел ни тут, ни на остальных просторах..(скорее всего плохо искал(((

Реализую отправку email средствами QTcpSocket и QTextStream (известный пример в сети "smtp")

Вот код
emailsender.h

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#ifndef EMAILSENDER_H
#define EMAILSENDER_H
 
#include "message.h"
 
#include <QTcpSocket>
#include <QDateTime>
 
class EMailSender : public QObject
{
    Q_OBJECT
public:
    EMailSender(const QString &host, const QString &login, const QString &password, int timeout = 3000, QObject *parent = 0);
    bool sendMessage(const Message &message, const QString &from, const QString &to);
 
signals:
    void signalConnected();
    void signalDisconnected();
    void signalLog(const QString &log);
    void signalSendResult(bool isOk);
 
protected:
    QString mailTimestamp() const;
    QString readLine();
    QString exchangeMessages(const QString &sendData);
    QString checkedExchangeMessage(const QString &message);
    int responseCode(const QString &message);
 
    QString mSmtpHost;
    QString mLogin;
    QString mPassword;
 
    QTcpSocket *pSocket;
    QTextStream *pSocketStream;
    int mTimeout;
 
    static const int CONNECT_PORT = 25;
};
 
#endif // EMAILSENDER_H
emailsender.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include "emailsender.h"
 
EMailSender::EMailSender(const QString &host, const QString &login, const QString &password, int timeout, QObject *parent)
    : QObject(parent), mSmtpHost(host), mLogin(login), mPassword(password), mTimeout(timeout)
{
 
    pSocket = new QTcpSocket(this);
    connect(pSocket, SIGNAL(connected()), SIGNAL(signalConnected()));
    connect(pSocket, SIGNAL(disconnected()), SIGNAL(signalDisconnected()));
}
 
bool EMailSender::sendMessage(const Message &message, const QString &from, const QString &to)
{
 
    QString m_sMessage;
    m_sMessage = mailTimestamp() + "\n";
    m_sMessage.append("User-Agent: Clever Alloy 1.0.0 (WinXP)\n");
    m_sMessage.append("X-Accept-Language: en-us, en\n");
    m_sMessage.append("MIME-Version: 1.0\n");
    m_sMessage.append("To: " + to + "\n");
    m_sMessage.append("From: " + from + " <" + from + ">\n");
    m_sMessage.append("Subject: " + message.subject + "\n");
    m_sMessage.append("Content-Type: text/html; charset=UTF-8;\n");
    m_sMessage.append("Content-transfer-encoding: 7BIT\n\n\n\n");
    m_sMessage=message.body;
    m_sMessage.replace(QString::fromLatin1("\n"), QString::fromLatin1("\r\n"));
    m_sMessage.replace(QString::fromLatin1("\r\n.\r\n"),QString::fromLatin1("\r\n..\r\n"));
 
    pSocket->connectToHost(mSmtpHost, CONNECT_PORT);
    pSocket->waitForConnected();
    pSocketStream = new QTextStream(pSocket);
 
    QString recv = readLine();
    int code = responseCode(recv);
    emit signalLog(QString("### Connection status: %1").arg(QString::number(code)));
    if (code != 220) {
        pSocket->disconnectFromHost();
        return false;
    }
 
    recv = checkedExchangeMessage("ehlo localhost");
    if (recv.isEmpty()) {
        return false;
    }
 
    recv = checkedExchangeMessage("AUTH LOGIN");
    if (recv.isEmpty()) {
        return false;
    }
 
    recv = checkedExchangeMessage(mLogin.toUtf8().toBase64());
    if (recv.isEmpty()) {
        return false;
    }
 
    recv = checkedExchangeMessage(mPassword.toUtf8().toBase64());
    if (recv.isEmpty() || !recv.contains("ok", Qt::CaseInsensitive)) {
        return false;
    }
 
    recv = checkedExchangeMessage("MAIL FROM: " + from);
    if (recv.isEmpty()) {
        return false;
    }
 
    recv = checkedExchangeMessage("RCPT TO: " + to);
    if (recv.isEmpty()) {
        return false;
    }
 
 
    recv = checkedExchangeMessage("DATA");
    if (recv.contains("not", Qt::CaseInsensitive)) {
        return false;
    }
 
    recv = checkedExchangeMessage(m_sMessage + "\r\n.");
    if (recv.size() && recv.contains("ok", Qt::CaseInsensitive)) {
        pSocket->disconnectFromHost();
        return true;
    }
 
    return false;
}
 
QString EMailSender::mailTimestamp() const
{
    QDate timecute;
    const QDateTime dt = QDateTime::currentDateTime();
    const QString day_en = timecute.shortDayName(timecute.day());
    const QString month_en = timecute.shortMonthName(timecute.month());
    const QString last = dt.toString("yyyy hh:mm:ss");
    return QString( "Date: %1, %2 %3 %4 +0200" ).arg(day_en, QString::number(timecute.day()), month_en, last);
}
 
QString EMailSender::readLine()
{
    QString sIncommingData;
    if (pSocket->waitForReadyRead(mTimeout))
    {
        while (!pSocketStream->atEnd())
        {
            const QString sOpera = pSocketStream->readLine();
            sIncommingData = sOpera + "\n" + sIncommingData;
            emit signalLog("### Recv: " + sIncommingData);
        }
    }
    return sIncommingData;
}
 
QString EMailSender::exchangeMessages(const QString &sendData)
{
    emit signalLog("### Send " + sendData);
    *pSocketStream << sendData << "\r\n";
    pSocketStream->flush();
    return readLine();
}
 
QString EMailSender::checkedExchangeMessage(const QString &message)
{
    QString response = exchangeMessages(message);
    if (response.isEmpty()) {
        pSocket->disconnectFromHost();
    }
    return response;
}
 
int EMailSender::responseCode(const QString &message)
{
    return message.left(3).toInt();
}
и, наконец, message.h

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef MESSAGE_H
#define MESSAGE_H
 
#include <QString>
 
struct Message
{
    QString body;
    QString subject;
};
 
#endif // MESSAGE_H
Так вот, при реализации
C++ (Qt)
1
2
3
4
        Message msg;
        msg.subject = "test";
        msg.body = "It works";
        mSender->sendMessage(msg, "name@gmail.com", MailAddress);
на принимающей стороне все четко, в теле письма тот самый текст "It works", а вот при реализации
C++ (Qt)
1
2
3
4
        Message msg;
        msg.subject = "test";
        msg.body = "<p><font style="background-color:#ff0000;">Super</font></p>";
        mSender->sendMessage(msg, "name@gmail.com", MailAddress);
на той же принимающей стороне html-текст, а не слово Super красным шрифтом. Вопрос, как Вы понимаете, как намекнуть smtp-серверу, что надо преобразовывать из html-кода в красивый текст) Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.08.2016, 01:23
Ответы с готовыми решениями:

Отправка email-сообщения на smtp сервер с ssl
Помогите написать программу на c++, отправляющую email сообщение на smtp сервер с ssl.

Отправка email на через smtp сервер mx1.mirohost.net из своей программы
Не получается отправить email через smtp сервер mx1.mirohost.net из своей программы if (comboBox1.SelectedItem is MailServer) ...

HTML код в картинку и отправка по SMTP
Доброго времени суток! :) Есть необходимость преобразовать html строку в картинку и отправить полученное изображение почтой через...

3
 Аватар для Горбаг
184 / 176 / 57
Регистрация: 25.09.2014
Сообщений: 834
24.08.2016, 16:28
Отправил строку. Принял строку. В чем еще вопрос то?
Если ты хочешь, чтобы из принятой строки формировалась красотулька, пользуйся тем, что сможет превратить твою строку в красотульку. Логично же. Попробуй после получения строки скормить ее, например, WebView или чему-то аналогичному.
Ну или если ты пытаешься вывести результат в какой-нибудь обычный lineEdit, который, вроде как, не умеет html, то придется самому ручками проверять входную строку и выставлять соответствующие стили тексту.
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.08.2016, 22:42
nikifor511,
1. Стоит использовать SSL сокеты ибо обычно современные почтовые сервисы работают только с шифрованием.
2. Письмо с html это письмо mime-типа т.е. состоящие из частей. Так что читай про multipart/mixed, идр multipart/*

Добавлено через 7 минут
https://blogs.technet.microsof... 6/06/1453/
http://citforum.ck.ua/internet... 1521.shtml
https://tools.ietf.org/html/rfc2392
1
0 / 0 / 0
Регистрация: 24.08.2016
Сообщений: 4
25.08.2016, 23:01  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Стоит использовать SSL сокеты
Тут согласен, поэтому считаю удобней воспользоваться сторонней библиотекой, например я эту нашел https://github.com/bluetiger9/SmtpClient-for-Qt. И мой вопрос решает и SSL в поддержке.
Цитата Сообщение от Avazart Посмотреть сообщение
Письмо с html это письмо mime-типа т.е. состоящие из частей. Так что читай про multipart/mixed, идр multipart/*
Спасибо, познавательно)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.08.2016, 23:01
Помогаю со студенческими работами здесь

Отправка Email с HTML
Выручайте. Уже кучу примеров перебрал, но не работает. Отправляю email командой mail(), письмо приходит, но как обычный текст. Пробовал уже...

Отправка SMTP сообщений, HTML и несвязанные вложения
Доброго времени суток. Прошу помочь. Не получается отправить почтовое сообщение, а точнее сказать группу прикрепленных файлов. При...

Отправка писем с HTML-разметкой средствами WSH
Отправляю письмо из WSH, используя CDO.Message В тексте письма использую HTML-разметку, но все теги отображаются в виде теста. Как я...

Отправка письма в виде HTML
При отправке почты по TCP/IP протоколу не получается отправить в HTML виде. Как ни пытался любая почтовая программа все мои преобразования...

Отправка файлов по имени (email.pdf) на email
Всем привет! Есть куча файлов (около 160) каждый файл называется именем e-maila на который должен быть отправлен. Как быстро их все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru