LINUX.ORG.RU

Не понимаю Python. Объект MIMEMultipart. Присвоение значения свойству срабатывает один раз.

 


0

1

Вот пример кода, в котором перебираются элементы кортежа reportMail:

# -*- coding: utf-8 -*-
import os
from subprocess import Popen, PIPE

import smtplib
from email import Encoders
from email.MIMEBase import MIMEBase
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.Utils import formatdate

import time
import datetime

# Емайл для отправки отчетов
reportMail=( 'alice@mail.ru', 'bob@mail.ru' )

msg = MIMEMultipart()
msg["From"] = "Monitoring script"
msg["Subject"] = "Monitoring"
msg['Date']    = formatdate(localtime=True)

msg.add_header('From', 'Monitoring')
msg.add_header('Reply-To', 'Monitoring')
msg.add_header('X-Mailer', 'Python')
msg.add_header('Content-type', 'text/html charset=utf-8')

# Добавление текста сообщения
msg.attach(MIMEText("Это текст письма"))

# Перебор значений кортежа
for currentReportMail in reportMail:
 print "Почтовый ящик "+currentReportMail+"\n"
 msg["To"] = currentReportMail

print "А в конце "+msg["To"]+"\n"

Я ожидаю, что в конце будет показан e-mail Боба.

А на деле лог такой:

Почтовый ящик alice@mail.ru
Почтовый ящик bob@mail.ru
А в конце alice@mail.ru

Почему так? Почему в msg[«To»] волшебным образом оказывается старое значение?

Перемещено true_admin из web-development

★★★★★

Потому что документацию читать надо:

Note that this does not overwrite or delete any existing header with the same name. If you want to ensure that the new header is the only one present in the message with field name name, delete the field first

thriller ★★ ()

Почему в msg[«To»] волшебным образом оказывается старое значение?

Оно не старое, их там несколько.

$ python
Python 2.7.3 (default, Dec 18 2014, 19:10:20)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> from email.MIMEMultipart import MIMEMultipart
>>>
>>> reportMail=( 'alice@mail.ru', 'bob@mail.ru' )
>>> msg = MIMEMultipart()
>>>
>>> for currentReportMail in reportMail:
...     msg['To'] = currentReportMail
...
>>> print msg['To']
alice@mail.ru
>>>
>>> msg.items()
[('Content-Type', 'multipart/mixed'), ('MIME-Version', '1.0'), ('To', 'alice@mail.ru'), ('To', 'bob@mail.ru')]
>>>

Если ты хочешь сделать несколько адресатов, то цикл не нужен:

msg['To'] = ', '.join(reportMail)
shrub ★★★★★ ()
Ответ на: комментарий от shrub

убив бы за это переопределение смысла оператора равно.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.