Aspose.Email  для C++

Отправка электронных писем 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 позволяет вам точно настраивать список получателей, получателей в копии и скрытой копии. Вы можете отправить электронное письмо с 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 и сохранять все необходимые данные, полученные от сервера авторизации. RefreshToken играет ключевую роль здесь. Это дополнительный токен, выданный сервером авторизации, вместе с AccessToken. Их различие заключается в том, что AccessToken, как правило, действителен только в течение определенного периода времени. В то время как RefreshToken действителен намного дольше или даже бессрочно (пока пользователь его не отзовет). Благодаря RefreshToken класс TokenProvider может всегда обновлять AccessToken, если последний больше не действителен.

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

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

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

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