smtplib.SMTPRecipientsRefused: Как исправить ошибку smtplib в Python? [Дубликат]

Еще один подход к возврату значения из асинхронной функции - передать объект, который сохранит результат от асинхронной функции.

Вот пример того же:

var async = require("async");

// This wires up result back to the caller
var result = {};
var asyncTasks = [];
asyncTasks.push(function(_callback){
    // some asynchronous operation
    $.ajax({
        url: '...',
        success: function(response) {
            result.response = response;
            _callback();
        }
    });
});

async.parallel(asyncTasks, function(){
    // result is available after performing asynchronous operation
    console.log(result)
    console.log('Done');
});

Я использую объект result для хранения значения во время асинхронной операции. Это позволяет получить результат даже после асинхронного задания.

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

138
задан Martey 29 April 2015 в 03:26
поделиться

13 ответов

msg['To'] должна быть строкой:

msg['To'] = "a@b.com, b@b.com, c@b.com"

Хотя recipients в sendmail(sender, recipients, message) должен быть списком:

sendmail("a@a.com", ["a@b.com", "b@b.com", "c@b.com"], "Howdy")
113
ответ дан Adrian Petrescu 26 August 2018 в 14:55
поделиться

Вам нужно понять разницу между видимым адресом электронной почты и доставкой .

msg["To"] - это, по сути, то, что напечатано на письме. На самом деле это не имеет никакого эффекта. За исключением того, что ваш почтовый клиент, как и обычный почтовый сотрудник, предположит, что это тот, кому вы хотите отправить электронное письмо.

Фактическая доставка, однако, может работать совсем по-другому. Таким образом, вы можете отбросить электронную почту (или копию) в почтовый ящик кого-то совершенно другого.

Для этого есть разные причины. Например, переадресация . Поле заголовка To: не изменяется при пересылке, однако письмо отправляется в другой почтовый ящик.

Теперь команда smtp.sendmail выполняет доставку фактического . email.Message - это содержимое только буквы, а не доставка.

В низкоуровневом SMTP вам необходимо дать получателям по одному, поэтому список адресов ( не включая имена!) - это разумный API.

Для заголовка он может также содержать, например, имя, например To: First Last <email@addr.tld>, Other User <other@mail.tld>. Поэтому ваш пример кода не рекомендуется, так как он не сможет доставить эту почту, поскольку, просто разделив его на ,, у вас все еще не будут действительные адреса!

33
ответ дан Anony-Mousse 26 August 2018 в 14:55
поделиться

Ну, метод в этот метод asnwer не работал для меня. Я не знаю, может быть, это Python3 (я использую версию 3.4) или связанную с Gmail проблему, но после некоторых попыток решение, которое сработало для меня, было линией

s.send_message(msg)

вместо of

s.sendmail(sender, recipients, msg.as_string())
1
ответ дан Community 26 August 2018 в 14:55
поделиться

Это работает для меня.

import smtplib
from email.mime.text import MIMEText

s = smtplib.SMTP('smtp.uk.xensource.com')
s.set_debuglevel(1)
msg = MIMEText("""body""")
sender = 'me@example.com'
recipients = 'john.doe@example.com,john.smith@example.co.uk'
msg['Subject'] = "subject line"
msg['From'] = sender
msg['To'] = recipients
s.sendmail(sender, recipients.split(','), msg.as_string())
12
ответ дан coolguy 26 August 2018 в 14:55
поделиться
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

def sender(recipients): 

    body = 'Your email content here'
    msg = MIMEMultipart()

    msg['Subject'] = 'Email Subject'
    msg['From'] = 'your.email@gmail.com'
    msg['To'] = (', ').join(recipients.split(','))

    msg.attach(MIMEText(body,'plain'))

    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    server.login('your.email@gmail.com', 'yourpassword')
    server.send_message(msg)
    server.quit()

if __name__ == '__main__':
    sender('email_1@domain.com,email_2@domain.com')

Он работал только для меня с функцией send_message и использовал функцию соединения в списке с получателями, python 3.6.

0
ответ дан Guilherme Henrique Mendes 26 August 2018 в 14:55
поделиться

Я делаю это так:

def send_mail
    msg['Subject'] = subject
    msg['From']    = sender
    msg['To']      = [email1@to.de,email2@to.de]
    msg['Cc']      = [email3@cc.de,email4@cc.de]
    msg['Bcc']     = [email5@bcc.de,email6@bcc.de]
    recips  = [email1@to.de,email2@to.de,email3@cc.de,email4@cc.de,email5@bcc.de,email6@bcc.de]
    sendmail(sender, recips, msg.as_string())


msg['From']    = sender
msg['To']      = [email1@to.de,email2@to.de]
msg['Cc']      = [email3@cc.de,email4@cc.de]
msg['Bcc']     = [email5@bcc.de,email6@bcc.de]
recips  = [email1@to.de,email2@to.de,email3@cc.de,email4@cc.de,email5@bcc.de,email6@bcc.de]
sendmail(sender, recips, msg.as_string())
-2
ответ дан guneysus 26 August 2018 в 14:55
поделиться

Я понял это несколько месяцев назад, и сообщил об этом . Резюме:

Если вы хотите использовать smtplib для отправки электронной почты нескольким получателям, используйте email.Message.add_header('To', eachRecipientAsString), чтобы добавить их, а затем, когда вы вызываете метод sendmail, use email.Message.get_all('To') отправите сообщение всем их. То же самое для получателей Cc и Bcc.

6
ответ дан miken32 26 August 2018 в 14:55
поделиться

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

import smtplib

def send_alert(subject=""):

    to = ['email@one.com', 'email2@another_email.com', 'a3rd@email.com']
    gmail_user = 'me@gmail.com'
    gmail_pwd = 'my_pass'
    smtpserver = smtplib.SMTP("smtp.gmail.com", 587)
    smtpserver.ehlo()
    smtpserver.starttls()
    smtpserver.ehlo
    smtpserver.login(gmail_user, gmail_pwd)
    header = 'To:' + ", ".join(to) + '\n' + 'From: ' + gmail_user + '\n' + 'Subject: ' + subject + '\n'
    msg = header + '\n' + subject + '\n\n'
    smtpserver.sendmail(gmail_user, to, msg)
    smtpserver.close()
6
ответ дан radtek 26 August 2018 в 14:55
поделиться

Я использую python 3.6, и для меня работает следующий код

email_send = 'xxxxx@xxx.xxx,xxxx@xxx.xxx'
server.sendmail(email_user,email_send.split(','),text)    
1
ответ дан Robie 26 August 2018 в 14:55
поделиться

вы можете попробовать это, когда пишете письма получателя в текстовом файле

from email.mime.text import MIMEText
from email.header import Header
import smtplib

f =  open('emails.txt', 'r').readlines()
for n in f:
     emails = n.rstrip()
server = smtplib.SMTP('smtp.uk.xensource.com')
server.ehlo()
server.starttls()
body = "Test Email"
subject = "Test"
from = "me@example.com"
to = emails
msg = MIMEText(body,'plain','utf-8')
msg['Subject'] = Header(subject, 'utf-8')
msg['From'] =  Header(from, 'utf-8')
msg['To'] = Header(to, 'utf-8')
text = msg.as_string()
try:
   server.send(from, emails, text)
   print('Message Sent Succesfully')
except:
   print('There Was An Error While Sending The Message')
0
ответ дан Skiller Dz 26 August 2018 в 14:55
поделиться

Это действительно работает, я потратил много времени на несколько вариантов.

import smtplib
from email.mime.text import MIMEText

s = smtplib.SMTP('smtp.uk.xensource.com')
s.set_debuglevel(1)
msg = MIMEText("""body""")
sender = 'me@example.com'
recipients = ['john.doe@example.com', 'john.smith@example.co.uk']
msg['Subject'] = "subject line"
msg['From'] = sender
msg['To'] = ", ".join(recipients)
s.sendmail(sender, recipients, msg.as_string())
225
ответ дан sorin 26 August 2018 в 14:55
поделиться

В действительности проблема заключается в том, что SMTP.sendmail и email.MIMEText нуждаются в двух разных вещах.

email.MIMEText устанавливает заголовок «To:» для тела сообщения электронной почты. Он ТОЛЬКО используется для отображения результата для человека на другом конце и, как и все заголовки электронной почты, должен быть одной строкой. (Обратите внимание, что это фактически не должно иметь ничего общего с людьми, которые действительно получают сообщение.)

SMTP.sendmail, с другой стороны, настраивает «конверт» сообщения для Протокол SMTP. Для этого нужен список строк Python, каждый из которых имеет один адрес.

Итак, вам нужно сделать COMBINE два полученных вами ответа. Установите msg ['To'] в одну строку, но передайте исходный список sendmail:

emails = ['a.com','b.com', 'c.com']
msg['To'] = ', '.join( emails ) 
....
s.sendmail( msg['From'], emails, msg.as_string())
1
ответ дан Syscall 26 August 2018 в 14:55
поделиться

Я попробовал ниже, и он работал как шарм:)

rec_list =  ['first@example.com', 'second@example.com']
rec =  ', '.join(rec_list)

msg['To'] = rec

send_out = smtplib.SMTP('localhost')
send_out.sendmail(me, rec_list, msg.as_string())
6
ответ дан TopSecret_007 26 August 2018 в 14:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: