Еще один подход к возврату значения из асинхронной функции - передать объект, который сохранит результат от асинхронной функции.
Вот пример того же:
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
для хранения значения во время асинхронной операции. Это позволяет получить результат даже после асинхронного задания.
Я использую этот подход много. Мне было бы интересно узнать, насколько хорошо этот подход работает, когда задействован результат обратно через последовательные модули.
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")
Вам нужно понять разницу между видимым адресом электронной почты и доставкой .
msg["To"]
- это, по сути, то, что напечатано на письме. На самом деле это не имеет никакого эффекта. За исключением того, что ваш почтовый клиент, как и обычный почтовый сотрудник, предположит, что это тот, кому вы хотите отправить электронное письмо.
Фактическая доставка, однако, может работать совсем по-другому. Таким образом, вы можете отбросить электронную почту (или копию) в почтовый ящик кого-то совершенно другого.
Для этого есть разные причины. Например, переадресация . Поле заголовка To:
не изменяется при пересылке, однако письмо отправляется в другой почтовый ящик.
Теперь команда smtp.sendmail
выполняет доставку фактического . email.Message
- это содержимое только буквы, а не доставка.
В низкоуровневом SMTP
вам необходимо дать получателям по одному, поэтому список адресов ( не включая имена!) - это разумный API.
Для заголовка он может также содержать, например, имя, например To: First Last <email@addr.tld>, Other User <other@mail.tld>
. Поэтому ваш пример кода не рекомендуется, так как он не сможет доставить эту почту, поскольку, просто разделив его на ,
, у вас все еще не будут действительные адреса!
Ну, метод в этот метод asnwer не работал для меня. Я не знаю, может быть, это Python3 (я использую версию 3.4) или связанную с Gmail проблему, но после некоторых попыток решение, которое сработало для меня, было линией
s.send_message(msg)
вместо of
s.sendmail(sender, recipients, msg.as_string())
Это работает для меня.
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())
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.
Я делаю это так:
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())
Я понял это несколько месяцев назад, и сообщил об этом . Резюме:
Если вы хотите использовать smtplib для отправки электронной почты нескольким получателям, используйте email.Message.add_header('To', eachRecipientAsString)
, чтобы добавить их, а затем, когда вы вызываете метод sendmail, use email.Message.get_all('To')
отправите сообщение всем их. То же самое для получателей Cc и Bcc.
Я придумал эту функцию импортного модуля. В этом примере используется почтовый сервер 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()
Я использую python 3.6, и для меня работает следующий код
email_send = 'xxxxx@xxx.xxx,xxxx@xxx.xxx'
server.sendmail(email_user,email_send.split(','),text)
вы можете попробовать это, когда пишете письма получателя в текстовом файле
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')
Это действительно работает, я потратил много времени на несколько вариантов.
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())
В действительности проблема заключается в том, что 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())
Я попробовал ниже, и он работал как шарм:)
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())