2016-09-04 1 views
0

Я пытаюсь отправить образец электронной почту, но получает следующее сообщение об ошибке:электронной почты с дополнительными заголовками ошибками

>>> import smtplib 
>>> from email.mime.text import MIMEText 
>>> def send_email(subj, msg, from_addr, *to, host="localhost", port=1025, **headers): 
... email = MIMEText(msg) 
... email['Subject'] = subj 
... email['From'] = from_addr 
... for h, v in headers.items(): 
...  print("Headers - {} Value {} ".format(h, v)) 
...  email[h] = v 
... sender = smtplib.SMTP(host,port) 
... for addr in to: 
...  del email['To'] 
...  email['To'] = addr 
...  sender.sendmail(from_addr, addr, email.as_string()) 
... sender.quit() 
... 
>>> headers={'Reply-To': '[email protected]'} 
>>> send_email("first email", "test", "[email protected]", ("[email protected]", "[email protected]"), headers=headers) 
Headers - headers Value {'Reply-To': '[email protected]'} 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 12, in send_email 
    File "/usr/lib/python3.5/email/message.py", line 159, in as_string 
    g.flatten(self, unixfrom=unixfrom) 
    File "/usr/lib/python3.5/email/generator.py", line 115, in flatten 
    self._write(msg) 
    File "/usr/lib/python3.5/email/generator.py", line 195, in _write 
    self._write_headers(msg) 
    File "/usr/lib/python3.5/email/generator.py", line 222, in _write_headers 
    self.write(self.policy.fold(h, v)) 
    File "/usr/lib/python3.5/email/_policybase.py", line 322, in fold 
    return self._fold(name, value, sanitize=True) 
    File "/usr/lib/python3.5/email/_policybase.py", line 360, in _fold 
    parts.append(h.encode(linesep=self.linesep, 
AttributeError: 'dict' object has no attribute 'encode' 

Когда я опускаю дополнительный словарь заголовка, то электронная почта успешно отправлена. Для параметра ** param необходим словарь, это правильно? Может ли кто-нибудь предложить средство для устранения ошибки?

ответ

1

Вы недопонимаете, как *args и **kwargs работы. Они захватывают дополнительные аргументы positional и keyword, в то время как вы передаете дополнительный кортеж и дополнительный словарь как (...) и headers=headers соответственно.

Это означает, что to теперь установлено в (("[email protected]", "[email protected]"),) (кортеж, содержащий единственный кортеж), и headers установлен в {'headers': {'Reply-To': '[email protected]'}} (словарь, содержащий другой словарь).

Вы видите последний в вашем выводе:

Headers - headers Value {'Reply-To': '[email protected]'} 

Это headers ключ, ссылаясь на словарь.

Pass в to значений как отдельные аргументы и использовать **kwargsПОЗВОНИТЕ синтаксис для передачи в заголовках:

headers={'Reply-To': '[email protected]'} 
send_email("first email", "test", 
      "[email protected]", "[email protected]", "[email protected]", 
      **headers) 

**headers применяет каждую пару ключ-значение в этом словаре в качестве отдельного ключевого слова аргумент.

+0

Выход электронной почты для 'send_email (« Тема модели »,« Содержание сообщения »,« [email protected] »,« [email protected] »,« [email protected] »,« Ответ на вопрос » "," [email protected] ")' is '---------- СООБЩЕНИЕ ПОСЛЕДУЕТ ---------- Content-Type: text/plain; кодировка = "US-ASCII" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Тема: Модель Заголовок От: [email protected] To: [email protected] X-Peer: 127,0. 0.1', что не то, что я хочу, так как Reply-To: [email protected] не отображается Кроме того, список неверен. – alortimor

+0

@alortimor: Это не выражение, которое я использовал в своем ответе. Вы отправляете электронное письмо (среди прочих), «Reply-to» и «[email protected]»), потому что это позиционные параметры. Поскольку вы не можете использовать 'Reply-To' в качестве аргумента прямого ключевого слова (этот заголовок не является допустимым идентификатором Python), используйте только' ** {'Reply-To': '[email protected]'} 'или отдельный словарь и '** headers', как я использовал в своем ответе, передадут эту пару ключ-значение в словарь' headers' в этой функции. –

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