После того, как вы создадите, затем создайте файл с именем sendgmail.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# =============================================================================
# Created By : Jeromie Kirchoff
# Created Date: Mon Aug 02 17:46:00 PDT 2018
# =============================================================================
# Imports
# =============================================================================
import smtplib
# =============================================================================
# SET EMAIL LOGIN REQUIREMENTS
# =============================================================================
gmail_user = 'THEFROM@gmail.com'
gmail_app_password = 'YOUR-GOOGLE-APPLICATION-PASSWORD!!!!'
# =============================================================================
# SET THE INFO ABOUT THE SAID EMAIL
# =============================================================================
sent_from = gmail_user
sent_to = ['THE-TO@gmail.com', 'THE-TO@gmail.com']
sent_subject = "Where are all my Robot Women at?"
sent_body = ("Hey, what's up? friend!\n\n"
"I hope you have been well!\n"
"\n"
"Cheers,\n"
"Jay\n")
email_text = """\
From: %s
To: %s
Subject: %s
%s
""" % (sent_from, ", ".join(sent_to), sent_subject, sent_body)
# =============================================================================
# SEND EMAIL OR DIE TRYING!!!
# Details: http://www.samlogic.net/articles/smtp-commands-reference.htm
# =============================================================================
try:
server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
server.ehlo()
server.login(gmail_user, gmail_app_password)
server.sendmail(sent_from, sent_to, email_text)
server.close()
print('Email sent!')
except Exception as exception:
print("Error: %s!\n\n" % exception)
Итак, если вы успешны, вы увидите следующее изображение:
Я протестировал, отправив электронное письмо от и для себя.
Примечание. У меня включена двухэтапная аутентификация в моей учетной записи. Пароль приложения работает с этим!
Этот параметр недоступен для учетных записей с включенной двухэтапной аутентификацией. Для таких учетных записей требуется пароль для конкретного приложения для доступа к менее безопасным приложениям.
Мы используем Сборку Команды Сервера Основы Команды и добавили блок к TFSBuild.proj's AfterCompile
, цель для инициирования ClickOnce публикует с нашим числом предпочтительной версии:
<MSBuild Projects="$(SolutionRoot)\MyProject\Myproject.csproj"
Properties="PublishDir=$(OutDir)\myProjectPublish\;
ApplicationVersion=$(PublishApplicationVersion);
Configuration=$(Configuration);Platform=$(Platform)"
Targets="Publish" />
PublishApplicationVersion
переменная сгенерирована пользовательской задачей MSBuild использовать TFS Changeset число, но Вы могли использовать Ваша собственная задача или существующее решение получить номер версии из файла AssemblyInfo.
Это могло теоретически быть сделано в Вашем файле проекта (который является просто сценарием MSBuild так или иначе), но я рекомендовал бы против развертывания от машины разработчика.
я уверен другой непрерывная интеграция (CI), решения могут обработать это так же.
<час>Редактирование: Извините, получил Ваш вопрос назад. Движение от номера версии ClickOnce до файла AssemblyInfo должно быть выполнимым. Я уверен, что Задачи Сообщества MSBuild (ссылка выше) имеют задачу для обновления файла AssemblyInfo, таким образом, Вам просто была бы нужна пользовательская задача вытянуть номер версии от конфигурации ClickOnce XML.
Однако можно также полагать, что изменение сообщения об ошибке для включения ClickOnce публикует версию также:
if (System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
{
Debug.WriteLine(System.Deployment.Application.ApplicationDeployment.
CurrentDeployment.CurrentVersion);
}
Шаги:
-v
и -mv
переключатели). BTW, хорошая премия - то, что, каждый раз, когда Вы автоматически публикуете более новую версию развертывания ClickOnce с помощью сценария интеграции, если Вы также определяете минимальную версию к mage.exe (то же как версия), тогда каждый пользователь будет обновлен автоматически на следующем запуске приложения.
Необходимо будет, вероятно, создать часть кода, который обновляет AssemblyInfo.cs согласно номеру версии, сохраненному в .csproj файле. (ClickOnce развертываются, версия хранится в XML-тэге.)
Вы тогда изменили бы свой .csproj файл для выполнения этого бита кода, когда сборка Publish|Release выполняется. Люди MSBuild вели блог о том, как выполнить пользовательские действия во время определенных типов сборки; проверьте блог .
команды MSBuildЯ реализовал это недавно использующее некоторые пользовательские задачи. Проблема, которую я нашел с реализацией этого с ClickOnce, - то, что все Ваши файлы DLL обновляются. Это заставляет обновление ClickOnce загружать все файлы приложения каждое обновление. Это обходит на хороших функций развертывания ClickOnce, где только измененные файлы повторно загружаются в обновлении.
Просто что-то для размышления о при реализации чего-то вроде этого с ClickOnce.