Aspose.Email  для С++

Отправить электронное письмо C++

Как использовать C++ и SMTP для отправки электронной почты с вложением или iCalendar

  Скачать бесплатную пробную версию

Как правило, для отправки сообщений электронной почты используется протокол SMTP. Для отправки сообщения необходим доступ к SMTP-серверу. Вам необходимо найти адрес SMTP-сервера в сети, определить порт и тип шифрования, способ входа и авторизации. Некоторые поставщики услуг электронной почты также требуют разрешить доступ к SMTP-серверу в настройках учетной записи. Кроме того, если вам неудобно внедрять авторизацию OAuth в своем программном обеспечении, вы можете попробовать создать отдельный пароль для приложения в настройках своей учетной записи.

Итак, если вы выполнили всю подготовительную работу, самое время начать отправлять сообщения. Для этого вы можете использовать библиотеку Aspose.Email для C++. Рассмотрим самый простой пример:

auto smtpClient = MakeObject<SmtpClient>(u"smtp.gmail.com", u"login", u"password", SecurityOptions::SSLAuto);
smtpClient->Send(u"login@gmail.com", u"to@gmail.com", u"subject", u"body");

Используйте эту опцию, если хотите отправить простое текстовое электронное письмо.

Отправка электронной почты с вложениями с помощью C++

Если вам нужно отправить сложное электронное сообщение с помощью C++, класс MailMessage определенно пригодится. Например, чтобы отправить сообщение, похожее на предыдущее:

auto message = MakeObject<MailMessage>(u"login@gmail.com", u"to@aspose.com", u"subject", u"body");
smtpClient->Send(message);

Класс MailMessage — отличный инструмент. Он позволяет отправлять сообщения, хранящиеся в форматах файлов EML и MSG (формат сообщений Outlook). Этот формат также можно использовать для отправки вложений или даже объектов iCalendar для настройки или подтверждения посещаемости. MailMessage позволяет точно настроить список получателей, получателей Cc и Bcc. Вы можете отправить электронное письмо с HTML-разметкой. Вы также можете пометить сообщение различными флагами перед отправкой, добавить метаданные, зашифровать его и т. д.

Почему люди выбирают Aspose.Email для C++ для отправки электронной почты?

Да, Aspose.Email для C++ — это не просто утилита для отправки сообщений электронной почты. Это комплексное решение, обеспечивающее всестороннюю поддержку различных задач, связанных с отправкой, получением, хранением и обработкой электронной почты. И вы можете быть уверены, что при выполнении этих задач вы не столкнетесь с ограничениями библиотеки. Мы изучаем эту тему уже много лет и постоянно расширяем ее функциональность.

Вероятно, вы сталкивались с небольшими библиотеками, которые появились относительно недавно. Они легко и непринужденно решают простую проблему, с которой сталкиваются многие пользователи. Но стоит немного отойти в сторону, как вы поймете, что, продолжая использовать эту простенькую библиотеку, вы вынуждены постоянно огораживать костыли, какие-то модули для обхода библиотечных ограничений, адаптеры, призванные подружить вашу маленькую библиотеку с другой маленькой библиотекой, и т. д. И теперь ваше маленькое изящное решение уже не так уж и хорошо. Более того, вы отправляете его на сервер, где он регулярно и последовательно стреляет себе в ногу, потому что до вас никто не тестировал такой зоопарк костылей и интеграций. И как бы вы ни старались, рано или поздно вы все равно столкнетесь с ограничениями этой библиотеки. И вам нужно искать что-то новое. Итак, когда дело доходит до работы с электронной почтой, вам, возможно, стоит обратить внимание на Aspose.Email для C++!

Мы предлагаем вам не просто клиент для работы с SMTP. Во-первых, это далеко не единственный протокол для отправки писем на языке C++. С помощью нашего продукта вы можете отправлять электронные письма с помощью Exchange EWS и Microsoft Graph!

Мы уже рассказывали вам о возможностях MailMessage в этой статье. Но это далеко не единственный инструмент для подготовки писем к отправке. Вы можете:

  • генерировать письма из шаблона с помощью TemplateEngine;
  • распаковывайте контейнеры с письмами благодаря поддержке форматов OST, PST и MBOX;
  • загрузка писем из почтового ящика, используя поддержку протоколов IMAP, POP3, Exchange EWS и WebDAV, а также Microsoft Graph;
  • конвертируйте электронные письма из одного формата в другой.

Вы можете легко получить письмо с помощью протокола Exchange EWS. Оно будет в формате MAPI. Но вы можете легко преобразовать его в формат EML, что позволит вам отправить его позже по протоколу SMTP. В то же время вы можете изменить список получателей или отправителя письма в любое время.

Как работает отправка электронной почты с использованием C++ и SMTP?

Конфигурация SMTP

В тот момент, когда вы создаете экземпляр класса SmtpClient, ничего особенного не происходит. Вы просто указываете количество настроек, которые позволят вам в будущем подключаться к SMTP-серверу для отправки сообщений. Все волшебство происходит при первом звонке на send метод. Что происходит в данный момент?

На самом деле все зависит от того, какие настройки вы указали. Давайте рассмотрим несколько вариантов. Допустим, вы указали хост сервера, но не указали порт и тип шифрования. В этом случае запустится механизм автоматического выбора настроек. Этот механизм состоит из последовательных попыток подключения к SMTP-серверу с использованием стандартных портов и соответствующих алгоритмов шифрования. Сначала делается попытка подключиться к серверу по зашифрованному каналу. Но в случае неудачи механизм попытается установить незашифрованное соединение. Если вы не хотите использовать незашифрованную версию протокола, укажите SecurityOptions.SSL_AUTO настройка. Этот параметр также позволяет выбирать параметры сервера, но проверяет только зашифрованные каналы.

Если удалось установить соединение с сервером, то делается попытка авторизации. Если авторизация не удалась, код ошибки сохраняется на будущее. Сопоставитель попытается подключиться другими способами. Сообщение будет отправлено, если вы сможете подключиться и войти в систему. В случае сбоя соединения пользователь получит код ошибки авторизации (если он был сохранен во время выбора). Таким образом, пользователь сможет понять, что он ввел неправильный пароль или допустил другую ошибку. Если ни один из вариантов портов и типов шифрования не подходит и мы даже не дошли до попытки авторизации, пользователь получит сообщение об ошибке с уведомлением о неправильных настройках сервера.

Кстати, следует отметить, что наш SmtpClient (как и все другие клиенты нашей библиотеки) может подключаться к SMTP-серверу через прокси-сервер. Вы также можете указать настройки прокси-сервера во время инициализации.

Авторизация SMTP-клиента

SmtpClient поддерживает больше, чем просто разные способы подключения. Он также поддерживает различные методы авторизации. Например, вы можете использовать механизм OAuth. Для этого мы предоставляем сразу несколько инструментов.

Прежде всего, это TokenProvider. Это класс, содержащий все необходимые данные для хранения и обновления токена OAuth. В этом случае вы должны самостоятельно выполнить авторизацию OAuth и сохранить всю необходимую информацию, полученную с сервера OAuth. RefreshToken играет здесь ключевую роль. Это дополнительный токен, выпущенный сервером авторизации вместе с AccessToken. Их отличие в том, что AccessToken, как правило, действует только в течение определенного периода времени. В то время как RefreshToken действует гораздо дольше или даже бессрочно (пока пользователь его не отзовет). Благодаря RefreshToken класс TokenProvider всегда может обновить AccessToken, если последний больше не действителен.

Другой вариант — интерфейс iTokenProvider. В этом случае вы можете не только самостоятельно реализовать механизм OAuth, но и передать его SmtpClient, чтобы он сам использовал его по мере необходимости.

Следует отметить, что механизм OAuth не всегда необходим. Иногда гораздо проще войти в систему с именем пользователя и паролем. И для этого совсем не нужно перенастраивать учетную запись электронной почты, отказываться от двухфакторной авторизации и т. д. Есть более безопасное решение — это отдельный пароль для приложения. Чтобы воспользоваться этой функцией, вам следует заглянуть в настройки учетной записи электронной почты. Скорее всего, пароль для приложения будет сгенерирован автоматически, когда вы настроите его в своей учетной записи. Не забудьте сохранить его где-нибудь. Мы также рекомендуем максимально ограничить разрешения вашего приложения во время настройки. Конечно, если злоумышленник получит доступ к этому паролю, он не сможет взломать вашу учетную запись, но он все равно может сделать много неприятных вещей. И здесь ничего не поделаешь, потому что пароль — это единственное, что защищает ваши данные от злоумышленников. В целом инструмент очень удобный, но снижает безопасность вашего аккаунта, используйте его на свой страх и риск.

Отправка электронной почты через SMTP с помощью C++

Итак, соединение с сервером установлено, и авторизация прошла успешно. Пришло время отправлять письма. Для отправки используется объект класса MailMessage. Технически вы можете просто передать все необходимые данные методу отправки. Но на самом деле они все равно будут собраны в объекте MailMessage. Далее, благодаря возможности класса MailMessage сериализоваться в формат EML, мы получаем необходимый поток данных, который можно передать на наш SMTP-сервер. Таким образом, мы даем серверу команду отправить письмо и перенести на него все содержимое письма в виде текстовых данных. Если в письме передаются двоичные данные, например, в виде вложенных файлов, эти данные кодируются в формате Base64, а метаданные письма указывают на то, что получателю нужно будет декодировать его обратно. SMTP-сервер может проверить правильность полученного сообщения (например, проверить поле FROM с учетной записью отправителя на сервере), а также дополнить метаданные сообщения по своему усмотрению. Затем сервер отправит письмо получателям, список которых он также получит из метаданных письма.