AWS Lambda使用boto3发送邮件时换行失效问题求助
解决AWS Lambda中SES邮件正文换行无效的问题
你当前的代码是通过HTML格式发送邮件,而纯文本的换行符\n在HTML中不会被识别为换行,邮件客户端会自动忽略这些字符,所以看不到换行效果。以下是两种可行的解决方案:
方案1:切换为纯文本邮件格式
如果不需要HTML格式的排版,直接将邮件体改为纯文本格式,\n就能正常生效。修改send_email方法中的Message.Body部分:
response = ses.send_email( Destination={ "ToAddresses": [ receiver_email, ], }, Message={ "Body": { "Text": { # 把Html替换为Text "Charset": CHARSET, "Data": body, # 直接使用原body内容,\n会生效 } }, "Subject": { "Charset": CHARSET, "Data": "Daily FX rates", }, }, Source=sent_from, )
方案2:保留HTML格式,使用HTML换行标签
如果需要HTML的排版能力,把原代码中的\n替换为HTML的换行标签<br>,或者用<p>标签包裹每个段落,让邮件客户端正确渲染换行。修改后的send_email方法代码如下:
def send_email(self): ses = boto3.client("ses", region_name="eu-west-2") sent_from = "SENDER EMAIL ADDRESS" receiver_email = "RECEIVER EMAIL ADDRESS" # 用<p>标签拆分段落,实现清晰的换行效果 body = f'<p>Current FX rates: EUR to USD {self.rounded_FX["eur_usd"]}, GBP to USD {self.rounded_FX["gbp_usd"]}, GBP to EUR {self.rounded_FX["gbp_eur"]}, GBP to AUD {self.rounded_FX["gbp_aud"]}.</p>' \ f'<p>Daily changes: EUR to USD {self.to_f_statement(self.Dailys["eur_usd"])}, GBP to USD {self.to_f_statement(self.Dailys["gbp_usd"])}, GBP to EUR {self.to_f_statement(self.Dailys["gbp_eur"])}, GBP to AUD {self.to_f_statement(self.Dailys["gbp_aud"])}</p>' \ f'<p>Weekly changes: EUR to USD {self.to_f_statement(self.Weeklys["eur_usd"])}, GBP to USD {self.to_f_statement(self.Weeklys["gbp_usd"])}, GBP to EUR {self.to_f_statement(self.Weeklys["gbp_eur"])}, GBP to AUD {self.to_f_statement(self.Weeklys["gbp_aud"])}</p>' \ f'<p>Monthly changes: EUR to USD {self.to_f_statement(self.Monthlys["eur_usd"])}, GBP to USD {self.to_f_statement(self.Monthlys["gbp_usd"])}, GBP to EUR {self.to_f_statement(self.Monthlys["gbp_eur"])}, GBP to AUD {self.to_f_statement(self.Monthlys["gbp_aud"])}</p>' CHARSET = "UTF-8" html = body # 直接使用拼接好的HTML内容 response = ses.send_email( Destination={ "ToAddresses": [ receiver_email, ], }, Message={ "Body": { "Html": { "Charset": CHARSET, "Data": html, } }, "Subject": { "Charset": CHARSET, "Data": "Daily FX rates", }, }, Source=sent_from, ) return { 'statusCode': 200, 'body': json.dumps('Ready to go!') }
额外提示
你原代码中rounded_FX的取值存在逻辑问题:self.FX_rates['eur_usd'][0]取的是30天数据中最早日期的汇率,而计算涨跌幅时用的是fx_data[-1](最新日期),建议统一改成self.FX_rates['eur_usd'][-1]来获取最新汇率,避免数据不一致。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

