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

Send Raw Email (with attachment) to Multiple Recipients

我目前正在使用 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'

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

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

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'])

我假设您的代码现在看起来像这样对吗?如果没有,试试这个。

在查看了一些文档并进行了更多试验和错误后,我最终得到了它。事实证明,我只需要加入 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
    )

解决方案是在 header 中设置一个以逗号分隔的字符串,并在目的地字段中设置一个列表。

类似于:

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
)

在不带附件的情况下发送时,只需指定列表即可。但在其他情况下,下面的代码有帮助..谢谢@Ezequiel Salas

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

或 to_emails = some_list

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