将原始电子邮件(带附件)发送给多个收件人

时间:2015-03-18 16:22:39

标签: python email amazon-web-services boto

我目前正在使用Python 2.7并尝试使用Boto SES将带有附件(确切地说是CSV)的原始电子邮件发送到多个地址。我可以使用send_email()发送普通电子邮件,但在尝试通过send_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 = "me@example.com, them@example.com"

# create raw email
msg = MIMEMultipart()
msg['Subject'] = 'Email subject'
msg['From'] = 'me@example.com'
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'

如果我只有一个收件人,它可以正常工作,所以当我有一个收件人数组和逗号分隔的收件人字符串时,它只会抛出错误。有人有这方面的经验吗?

4 个答案:

答案 0 :(得分:5)

在看了一些文档和一些更多的试用版后,我结束了它。错误。事实证明,我只需加入msg['To']的电子邮件字符串数组,然后我就可以传入destinations参数的电子邮件数组。

这就是我的所作所为:

to_emails = "me@example.com, them@example.com"

COMMASPACE = ', '

# create raw email
msg = MIMEMultipart()
msg['Subject'] = 'Email subject'
msg['From'] = 'me@example.com'
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
    )

答案 1 :(得分:2)

我认为您不必使用逗号分隔的字符串与收件人,而是必须使用字符串列表。

Recipients = ['1@email.com', '2@email.com']

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 = ['me@example.com', 'them@example.com']

# create raw email
msg = MIMEMultipart()
msg['Subject'] = 'Email subject'
msg['From'] = 'me@example.com'
msg['To'] = to_emails


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

我是否正确地假设您的代码现在看起来像这样?如果没有,试试这个。

答案 2 :(得分:1)

解决方案设置一个字符串,用逗号分隔标题和一个列表到目标字段。

类似的东西:

to_emails = ['me@example.com', 'them@example.com']

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

...
conn.send_raw_email(msg.as_string(),
source=msg['From'],
destinations=to_emails  ## passed in an array
)

答案 3 :(得分:0)

不带附件发送时仅分配列表即可。但是在其他情况下,下面的代码也有帮助。。谢谢@Ezequiel Salas

to_emails = ['me@example.com', 'them@example.com']

或 to_emails = some_list

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