2015-03-18 3 views
2

В настоящее время я использую Python 2.7 и пытаюсь отправить сырое электронное письмо с вложением (точнее, CSV) на несколько адресов с Boto SES. Я могу отправить обычный адрес электронной почты с send_email(), но я все время получаю сообщение об ошибке при попытке отправить нескольким людям через send_raw_email().Отправить Raw Email (с приложением) нескольким получателям

Это ошибка, которую я получаю с разделителями-запятыми строку получателей:

Error sending email: SESIllegalAddressError: 400 Illegal address 
<ErrorResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/"> 
    <Error> 
    <Type>Sender</Type> 
    <Code>InvalidParameterValue</Code> 
    <Message>Illegal address</Message> 
    </Error> 
    <RequestId>[the request ID]</RequestId> 
</ErrorResponse> 

Вот с помощью этого кода:

to_emails = "[email protected], [email protected]" 

# create raw email 
msg = MIMEMultipart() 
msg['Subject'] = 'Email subject' 
msg['From'] = '[email protected]' 
msg['To'] = to_emails 

part = MIMEText('Attached is an important CSV') 
msg.attach(part) 

part = MIMEApplication(open(fname, 'rb').read()) 
part.add_header('Content-Disposition', 'attachment', filename=fname) 
msg.attach(part) 
# end create raw email 

conn = boto.ses.connect_to_region(
    '[my region]', 
    aws_access_key_id=s3_access_key, 
    aws_secret_access_key=s3_secret_key 
    ) 
conn.send_raw_email(msg.as_string(), 
    source=msg['From'], 
    destinations=msg['To'] 
    ) 

Кроме того, здесь ошибка, я получаю от использования массив строк для получателей:

Error sending email: 'list' object has no attribute 'lstrip' 

Он отлично работает, если у меня есть только один получатель, так что просто выдает ошибку, когда у меня есть массив получателей и строка получателей, разделенная запятыми. У кого-нибудь есть опыт?

+0

У меня этот же вопрос. Можете ли вы взглянуть на свой код и сказать мне, передаете ли вы 'to_emails' в пункты назначения или' msg ['To'] '? В чем разница между тем, что у вас здесь (созданием массива), или объявлением его вначале? – Jared

ответ

5

Я закончил это, получив его после просмотра некоторых документов и еще нескольких пробных ошибок &. Оказывается, мне просто пришлось присоединиться к массиву строк электронной почты для msg['To'], а затем мне удалось передать в массиве электронной почты параметр destinations.

Вот что я сделал:

to_emails = "[email protected], [email protected]" 

COMMASPACE = ', ' 

# create raw email 
msg = MIMEMultipart() 
msg['Subject'] = 'Email subject' 
msg['From'] = '[email protected]' 
msg['To'] = COMMASPACE.join(to_emails) ## joined the array of email strings 
# edit: didn't end up using this^

part = MIMEText('Attached is an important CSV') 
msg.attach(part) 

part = MIMEApplication(open(fname, 'rb').read()) 
part.add_header('Content-Disposition', 'attachment', filename=fname) 
msg.attach(part) 
# end create raw email 

conn = boto.ses.connect_to_region(
    '[my region]', 
    aws_access_key_id=s3_access_key, 
    aws_secret_access_key=s3_secret_key 
    ) 
conn.send_raw_email(msg.as_string(), 
    source=msg['From'], 
    destinations=to_emails ## passed in an array 
    ) 
+0

Я имея эту же проблему. Можете ли вы взглянуть на свой код и сказать мне, передаете ли вы 'to_emails' в пункты назначения или' msg ['To'] '? В чем разница между тем, что у вас здесь (создания массива), или объявлением – Jared

+0

Хороший улов. В моем последнем коде я даже не закончил использовать 'msg ['To']', поэтому 'to_emails' является просто строка писем, разделенных запятыми. – Bryce

2

Я верю вместо строки с запятыми с вашими получателями, вам нужно использовать список строк.

Recipients = ['[email protected]', '[email protected]'] 

conn.send_raw_email(msg.as_string(), 
source=msg['From'], 
destinations= Recipients) 

Так что-то вдоль этих линий.

Источник: http://boto.readthedocs.org/en/latest/ref/ses.html?highlight=send_raw_email#boto.ses.connection.SESConnection.send_raw_email

Официальная документация говорит список строк или просто строку. Вот почему он работает только с одним получателем.

Вторая попытка ::

to_emails = ['[email protected]', '[email protected]'] 

# create raw email 
msg = MIMEMultipart() 
msg['Subject'] = 'Email subject' 
msg['From'] = '[email protected]' 
msg['To'] = to_emails 


conn.send_raw_email(msg.as_string(), 
source=msg['From'], 
destinations=msg['To']) 

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

+0

Я просто пробовал этот точный подход, и он дал мне эту ошибку: 'Ошибка отправки электронной почты: SESIllegalAddressError: 400 Недопустимый адрес Sender InvalidParameterValue Illegal адрес [запрос ID] ' – Bryce

+0

Заканчивать мой редактировать – Chronicler

1

Решение установить строку через запятую в заголовке и списка в поле пунктов назначения.

Что-то вроде:

to_emails = ['[email protected]', '[email protected]'] 

msg['To'] = ', '.join(to_emails ) 

и

... 
conn.send_raw_email(msg.as_string(), 
source=msg['From'], 
destinations=to_emails ## passed in an array 
) 
Смежные вопросы