Обновление заголовка электронной почты "To:" в цикле while в python - PullRequest
0 голосов
/ 10 февраля 2019

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

import time
    from time import sleep

    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    import smtplib

    uname = #testmail@gmail.com
    name = "KTester"
    password = #password1
    server = smtplib.SMTP('smtp.gmail.com: 587')
    server.starttls()
    server.login(uname, password)
    message="Test"

    msg = MIMEMultipart('Alternative')
    f= open("list.txt","r")clear

    if f.mode == "r":
      cont = f.read().splitlines()
      for x in cont:
        print time.ctime()

        msg['Subject'] = "Test Mail - cripted Sample"
        msg['To'] = x
        msg['From'] = name+"\x0A\x0D"+uname
        msg.attach(MIMEText(message, 'html'))

        print "successfully sent email to %s:" % (msg['To'])

    f.close()
    server.quit()

ВЫХОД: enter image description here

В этом случаеПервая компиляция - это ожидаемый результат, который мы можем получить, если использовать print "successfully sent email to %s:" % (x)

Переменная 'x' меняет свое значение в конце каждой итерации.

Однако msg ['To'] = x не принимает значения из второй итерации цикла (второй код запускается выше).

Операция присваивания не работает с объектом сообщения.

Пожалуйста, помогите с ошибками,Спасибо!

Ответы [ 3 ]

0 голосов
/ 10 февраля 2019

Основная проблема в вашем скрипте состоит в том, что вы определили msg = MIMEMultipart ('Alternative') снаружи для цикла .Попробуйте определить msg = MIMEMultipart ('Alternative') внутри для цикла .

Решение такое же, как для @ Daniel Sims но я сделал ваш сценарий более читабельным, чтобы все могли понять

Я отредактировал ваш код по-своему, что для меня сработало.Попробуйте:

[КОД]

import time
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

# credentials    
uname = 'your email address'
name = "KTester"
password = 'password'

# Connecting to gmail server and logging to your gmail account
server = smtplib.SMTP('smtp.gmail.com: 587')
server.starttls()
server.login(uname, password)

message = "Test"  # Your message

with open('list.txt', 'r') as lst:
    lines = lst.readlines()  # Reading files to get emails

    for line in lines:  # Getting each email from list of emails
        msg = MIMEMultipart('Alternative')   # This line is added here(which if you have did outside of the for loop)
        msg['Subject'] = "Test Mail - cripted Sample"
        msg['To'] = line
        msg['From'] = '{}{}{}'.format(name, "\x0A\x0D", uname)
        msg.attach(MIMEText(message, 'html'))

        print(time.ctime())
        print("successfully sent email to {}".format(msg['To']))

 server.quit()
0 голосов
/ 11 февраля 2019

Такое поведение является заданным.

Переназначение на msg['to'] не перезаписывает существующий заголовок почты, а добавляет другой.Чтобы отправить существующее сообщение на новый адрес, перед его настройкой необходимо удалить заголовок «to».

del msg['to']
msg['to'] = 'spam@example.com'

Это относится и к другим заголовкам.Из документов для Message.__setitem__:

Обратите внимание, что это не перезаписывает и не удаляет любой существующий заголовок с тем же именем.Если вы хотите убедиться, что новый заголовок является единственным присутствующим в сообщении с именем имени поля, сначала удалите поле, например:

del msg['subject']

msg['subject'] = 'Python roolz!'

0 голосов
/ 10 февраля 2019

(Редактирование исходного ответа после уточнения вывода вопроса)

Попробуйте переместить следующую строку в цикл for:

msg = MIMEMultipart('Alternative')

Чтобы выглядеть следующим образом:

for x in cont:
    msg = MIMEMultipart('Alternative')
    print time.ctime()

    msg['Subject'] = "Test Mail - cripted Sample"
    msg['To'] = x
    msg['From'] = name+"\x0A\x0D"+uname
    msg.attach(MIMEText(message, 'html'))

    print "successfully sent email to %s:" % (msg['To'])

Я думаю, что сообщение должно быть новым в каждой итерации.

Мое тестирование дало точно такие же результаты - похоже, отправлять на один и тот же адрес электронной почты снова и снова.Потому что заголовки msg просто добавляются.Цикл for создавал несколько заголовков to :, но печать выявляла только первое.Ниже показано, как это выглядит при отладке:

Заголовок To: строка оригинала для цикла

Вывод оригинала для цикла

После добавления экземпляра msg в цикл for вывод был, как и ожидалось, с разными именами на каждой итерации.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...