2015-08-20 5 views
-1

Я нашел следующий код с сайта, объясняющий, как отправлять электронные письма (Hotmail/live) с помощью python. Я могу понять некоторые из кода, но большинство из них совершенно сбивает с толку. Например, что такое, s.starttls() mean/do, а также msg.as_string(); было определено раньше или что оно делает? Пожалуйста, помогите мне, потому что я хочу понять этот код (я хочу скоро сделать версию приложения gui).Может кому-то объяснить этот код мне (Python [Отправка писем])

Направляйте меня через это пожалуйста ....

P.S -> Мне всего 16, поэтому, пожалуйста, сделайте это как можно более понятным.

Кодекс:

import email 
import smtplib 

msg = email.message_from_string('warning') 
msg['From'] = "[email protected]" 
msg['To'] = "[email protected]" 
msg['Subject'] = "helOoooOo" 
s = smtplib.SMTP("smtp.live.com",587) 
s.ehlo() 
s.starttls() 
s.ehlo() 
s.login('[email protected]', 'pass') 
s.sendmail("[email protected]", "[email protected]", msg.as_string()) 
s.quit() 
+0

Чтобы узнать о s.starttls, обратите внимание, что s определяется как smtplib.SMTP(), поэтому я googled 'smtplib.SMTP' и в первом хите (https://docs.python.org/2/library/ smtplib.html) искал «starttls», пока не нашел свое определение на https://docs.python.org/2/library/smtplib.html#smtplib.SMTP.starttls и в котором говорится: «Поместите SMTP-соединение в TLS (Transport Layer Безопасный режим. Все последующие команды SMTP будут зашифрованы. ' Тот же процесс может узнать об «email.message_from_string» - просто перейдите к нему, сделайте первый или второй удар и выполните поиск по этой функции. –

ответ

6

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

... Я был там, изучая код в вашем возрасте в то время, когда Интернет был лишь небольшой частью того, чем он является сегодня. Поэтому позвольте мне дать вам прозрение и указатели.

Код, который вы вставили, - очень простой, учитывая, что вы знаете немного программирования и понимаете протокол SMTP.

При отправке почты вы выполняете TCP-соединение с сервером - обычно - порт 25 (но 587 в вашем случае). Там вы должны следовать точному протоколу, чтобы сервер понял, что вы хотите сделать. Этот протокол был определен RFC821.

Так же, как вы следуете протоколу, когда вы встречаетесь с кем-то (это как «привет!», Затем пожимайте друг другу руки, а затем говорите «как дела?»), Прежде чем задавать вопрос, сервер делает то же самое:

EHLO example.org 
MAIL FROM [email protected] 
RCPT TO [email protected] 
DATA 
Date: Fri, 21 Aug 2015 23:12:29 +0000 
From: Alice <[email protected]> 
To: Bob <[email protected]> 

Go RTFM! 

-- 
Bob 
. 

Где вы говорите серверу:

  • Привет! Я Алиса!
  • Хочу отправить сообщение Бобу!
  • Можете ли вы сказать ему, чтобы он отправился на RTFM?

Это то, что вы на самом деле делаете в своем коде.

Теперь давайте перейдем к программированию. Прежде всего, вы импортировать модули, один для обработки электронной почты другой для подключения Smtp:

import email 
import smtplib 

, чтобы понять, как использовать его, вы можете запустить питон REPL в командной строке и сделать dir(email) чтобы показать свои объекты, и help(email) получить интегрированную помощь:

python 
>>> import email 
>>> dir(email) 
['Charset', 'Encoders', 'Errors', 'FeedParser', 'Generator', 'Header', 'Iterators', 'LazyImporter', 'MIMEAudio', 'MIMEBase', 'MIMEImage', 'MIMEMessage', 'MIMEMultipart', 'MIMENonMultipart', 'MIMEText', 'Message', 'Parser', 'Utils', '_LOWERNAMES', '_MIMENAMES', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '__version__', '_name', 'base64MIME', 'email', 'importer', 'message_from_file', 'message_from_string', 'mime', 'quopriMIME', 'sys'] 
>>> help(email) 
Help on package email: 

NAME 
    email - A package for parsing, handling, and generating email messages. 

FILE 
    /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/email/__init__.py 

MODULE DOCS 
    http://docs.python.org/library/email 
… 

объекты являются все действия и объекты, разрабатываемой сообществом, которые вы можете использовать. И помощь дает немного больше информации, а также URL, который вы хотите посетить, чтобы узнать больше о том, что вы можете с ним сделать, а также примеры.

Затем создается почтовое сообщение:

msg = email.message_from_string('warning') 
msg['From'] = "[email protected]" 
msg['To'] = "[email protected]" 
msg['Subject'] = "helOoooOo" 

, на котором вы настроите Subject, From и To линии, а также тело, в протоколе SMTP, который будет выглядеть как:

From: [email protected] 
To: [email protected] 
Subject: helOoooOo 

warning 
. 

Затем вы открываете соединение с SMTP-сервером Live.com:

s = smtplib.SMTP("smtp.live.com",587) 

Это соединение дает объекту, зная подробности того, где вы подключаетесь, и предлагает методы, которые вы можете применить к этому соединению. Методы - действия, которые вы можете сделать на нем, например:

Вы говорите «привет!».

s.ehlo() 

Затем вы начинаете зашифровать сообщение:

s.starttls() 

это делает протокол «Шифрование квитирования» на подключение к SMTP, так что дальнейшее общение теперь «безопасный», то есть никто не может читать ваш пароль, просмотрев пакеты между вашим компьютером и сервером.

Вы можете прочитать больше о нем:

https://docs.python.org/3/library/smtplib.html#smtplib.SMTP.starttls

И вы можете прочитать его исходный код здесь:

https://hg.python.org/cpython/file/3.4/Lib/smtplib.py#l654

Вы говорите, что " Здравствуй!" опять же, не только потому, что ты очень вежлив, но потому, что вы перешли от незашифрованном в зашифрованном виде, почтовый сервер ожидает вас, чтобы сказать привет снова:

s.ehlo() 

Вы отождествляете себя, так что жить.ком знает, что ты, кто ты prentending быть:

s.login('[email protected]', 'pass') 

так что вы хотите изменить адрес электронной почты вашего фактического счета и пароль

Затем вы отправляете почту в/из примера @ hotmail.fr:

s.sendmail("[email protected]", "[email protected]", msg.as_string()) 

в первой части моего ответа, я говорил вам о протоколе «SMTP», где вы должны сказать, кто вы есть и кем вы хотите поговорить? хорошо, вот что вы здесь делаете. Этот метод переведет:

MAIL FROM [email protected] 
RCPT TO [email protected] 

И тогда, ваш почтовый объект является питон «экземпляр», который не имеет никакого смысла для вашего SMTP-сервера. Вы должны перевести его из формы, которую может понять почтовый сервер, который является полным текстом. Вы можете взглянуть на то, что это делать в питона РЕПЛ:

python 
>>> import email 
>>> msg = email.message_from_string('warning') 
>>> msg['From'] = "[email protected]" 
>>> msg['To'] = "[email protected]" 
>>> msg['Subject'] = "helOoooOo" 
>>> print(msg) 
<email.message.Message instance at 0x10dcb1560> 

, что означает «питон знает объект под названием тзд, который сделан благодаря классу email.message.Message и живет на адрес памяти 0x10dcb1560 ".

Но если вы сделаете следующее, то вы получите почту вы будете посылать:

>>> print(msg.as_string()) 
From: [email protected] 
To: [email protected] 
Subject: helOoooOo 

warning 

Что и на самом деле вы даете экземпляр обработчика SMTP, который заботится о направлении его правильно.

И потому, что вы вежливы, вы говорите серверу, что вы уходите, говоря «пока», вместо того, чтобы молча уйти.

s.quit() 

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

Вот несколько советов:

Вы можете следить онлайн-курсы, а также:

просто дать несколько из них.

Как ваш код предлагает, похоже, что вы можете быть французским, тогда я могу посоветовать вам прочитать превосходную книгу по алгоритмике, написанную бывшим учителем, которой я занимался, которая учит принципам программирования и мышления, не будучи привязанным к язык программирования:

НТН

+0

Спасибо, что было очень информативно! Я достаточно понимаю код для написания приложения GUI. Также я не французский, я английский (канадский). Но спасибо в любом случае! –

+0

Аргументы 'MAIL FROM' и' RCPT TO' должны корректно находиться в ''. – tripleee

1

Так message_from_string('warning') принимает строку и помещает в структуру объекта сообщения. Затем вы устанавливаете From, To, Subject. Затем вы определяете адрес SMTP и порт, который он использует. ehlo() просто сообщает серверу, что вы собираетесь отправлять ему сообщение. starttls() говорит, что с этого момента все отправленные данные будут отправлены через TLS, поэтому все ваши пароли будут безопасными и зашифрованными. Вы входите в систему, отправляете почту и получаете сообщение, которое вы предварительно задали для первой строки, назад как строка для отправки. Затем вы закрываете SMTP-соединение.

1

Все ресурсы, необходимые можно найти в стандартной библиотеке Python: 18.1 Email d 20.12 smtplib.

Я сделаю строковое объяснение, сосредоточившись на двух указанных вами линиях. (Пропуская импорт)

msg = email.message_from_string('warning') 

Создание объекта сообщения со значением "предупреждение"

msg['From'] = "[email protected]" 
msg['To'] = "[email protected]" 
msg['Subject'] = "helOoooOo"  

Обозначает Sender, Ресивер и Предмет сообщения

s = smtplib.SMTP("smtp.live.com",587) 

Это устанавливает (в частности, объект сеанса клиента SMTP), который может отправлять почту на любой интернет-компьютер с помощью SMTP или ESMTP-слушателя.
(Это включает в себя все большие сообщения электронной почты, как Gmail, Yahoo, AOL и т.д.)

s.ehlo() 

Это идентифицирует вас в качестве сервера с помощью EHLO и устанавливает много атрибутов по умолчанию, необходимые для отправки сообщения.

s.starttls() 

Установите SMTP-соединение в режим TLS (Transport Layer Security). Все последующие команды SMTP будут зашифрованы.

s.ehlo() 

Хорошая практика для установки после предыдущей команды, поскольку информация теперь зашифрована.

s.login('[email protected]', 'pass') 

Журналы в с (имя пользователя, пароль)

s.sendmail("[email protected]", "[email protected]", msg.as_string()) 

Посылает сообщение (From, To, Msg). Msg.as_string() просто означает, что формат сообщения должен быть строкой.

s.quit() 

Завершение сеанса.

Смежные вопросы