Как пропустить и перейти к следующему почтовому ящику в smtplib python

написал небольшой скрипт по отправке сообщений, если ящик не доступен и ответ сервера 550 сообщение не было принято, то выдаёт такую вот ошибку: введите сюда описание изображения

Вот сам скрипт:

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

ipad = ('C:/Users/user/Desktop/file.txt')
login = input('Введите вашу почту: ')
password = input('Введите пароль от вашей почты: ')
url = 'smtp.mail.ru'
topic = input('Тема: ')
message = ('текст письма')

mailladres = open(ipad, 'r')
lisst = [*mailladres]
rg = len(lisst)

def send_mail():
    for b in range(0, rg):
        toaddr = lisst[b]

        msg = MIMEMultipart()

        msg['Subject'] = topic
        msg['From'] = login
        body = message
        msg.attach(MIMEText(body, 'plain'))

        server = root.SMTP_SSL(url, 465)
        server.login(login, password)
        server.sendmail(login, toaddr, msg.as_string())

        num = (b + 1)
        print(num)

send_mail()

Вот адрес почты: [email protected] из-за которой падает скрипт.

Подскажите как можно реализовать примерно такой сценарий: "если выдается эта ошибка или ответ от сервера 550, то переходим к следующему email по списку."


Ответы (2 шт):

Автор решения: Roman Konoval

Заверните вызов в try ... except и игнорируйте исключение если код 550 приблизительно так:

  
    for b in range(0, rg):
        toaddr = lisst[b]

        msg = MIMEMultipart()

        msg['Subject'] = topic
        msg['From'] = login
        body = message
        msg.attach(MIMEText(body, 'plain'))

        server = root.SMTP_SSL(url, 465)
        server.login(login, password)
        try:
          server.sendmail(login, toaddr, msg.as_string())
        except root.SMTPDataError as e:
          print('Error code={} msg={}'.format(e.code, e.msg))
          if e.code == 550: # можно сюда добавить и анализ e.msg
            print('skipping address={}'.format(toaddr))
            continue
          else:
            raise
        num = (b + 1)
        print(num)
  
→ Ссылка
Автор решения: LOliPoPPOP

Для будущих читателей, вот простое решение.

for b in range(0, rg):
    toaddr = lisst[b]

    msg = MIMEMultipart()

    msg['Subject'] = topic
    msg['From'] = login
    body = message
    msg.attach(MIMEText(body, 'plain'))

    server = root.SMTP_SSL(url, 465)
    server.login(login, password)
    try:
        server.sendmail(login, toaddr, msg.as_string())
        
        num = (b + 1)
        print(num)
    except:
        b += 1
→ Ссылка