2014-09-05 27 views
2

我的網站上有一個報告功能,它通過電子郵件發送CSV附加文件。我最近注意到,如果其中一個字符串包含重音字符,我的附加CSV文件會有額外的換行符。奇怪的是,如果字符串不包含任何重音,我不會看到這些額外的換行符。Django:包含Unicode字符的電子郵件附件中的CSV會導致額外的換行

代碼看起來有點像這樣:

# -*- coding: utf8 -*- 
import unicodecsv 
from StringIO import StringIO 
from django.core.mail import EmailMultiAlternatives 

# Generating the CSV 
csvfile = StringIO() 
writer = unicodecsv.writer(csvfile, encoding='utf-8') 
writer.writerow([u'Test', u'Linebreak è']) 
writer.writerow([u'Another', u'line']) 

# Email 
msg = EmailMultiAlternatives(
      'csv report', 
      'Here is your attached report', 
      '[email protected]', 
      '[email protected]' 
) 
msg.attach('your_report.csv', csvfile.getvalue(), 'text/csv') 
msg.send() 

打開與VIM文件顯示我類似的東西:

Test,Linebreak è^M 
Another,line 

相比較而言,如果CSV行包括:

writer.writerow([u'Test', u'Linebreak']) 
writer.writerow([u'Another', u'line']) 

附加的CSV將如下所示:

Test,Linebreak 
Another,line 

getvalue()似乎輸出正確的EOL formater,但是一旦附加文件就會出現某種情況。有人注意到類似的問題嗎?

(乳寧的Django 1.6 Python的2.7)


編輯:我發現我的問題的根源。原來我使用sendgrid發送我的電子郵件,出於某種原因,他們的系統上時,這其中蘊含的口音我的CSV ...

回答

3

根據意見提供者的要求,我將添加一個涉及Python的標準SMTP庫而不是SendGrid的解決方案。

與OP的代碼一樣,我們使用的是unicode的CSV數據。當它的時間來準備的消息,我們顯式地添加數據爲UTF-8編碼的文本附件,並構造消息對象,像這樣:

from email.mime.text import MIMEText 
from email.mime.multipart import MIMEMultipart 

# Write CSV data ... 

msg = MIMEMultipart() 
msg['Subject'] = subject 
msg['From'] = sender 
msg['To'] = recipients 
msg.preamble = subject + '\n' 

# Message body 
body = MIMEText(body, 'plain', 'utf-8') 
# CSV data 
csv = MIMEText(csvfile.getvalue(), 'csv', 'utf-8') 
csv.add_header("Content-Disposition", "attachment", 
       filename=report_filename) 

# Add body and attachment to message 
msg.attach(body) 
msg.attach(csv) 

你可以閱讀更多有關MimeText用於Python library documentation。我發現只要有適當的delcared字符集,它就會傳遞unicode字符串(而不是str/bytes)。

此外,我必須指出,我不確定換行符問題是通過使用MIMEText附件還是因爲編碼而簡單解決。在OP代碼中使用MIMEText對象作爲附件可能可以解決問題。不過,我將試驗留給了你。

2

對於那些誰使用Sendgrid作爲SMTP提供商發送一條增加額外的換行符電子郵件,如果您發現類似的問題,我通過不使用SMTP,而是通過使用Sendgrid的Web API(通過https://github.com/elbuo8/sendgrid-django)解決了我的問題。

現在我的CSV報告中沒有額外的行了!

+0

這並不能真正解決問題,是嗎? – hayavuk 2014-10-20 10:00:18

+0

對我來說,它的確如此。我不知道你是否使用sendgrid,但我會嘗試切換用於發送電子郵件的方法(嘗試使用自己的smtp服務器)。我只知道這是一個奇怪的問題,只發生在Unicode字符... – Remiz 2014-10-22 14:09:00

+0

我的意思是,這是一個特定於SendGrid的解決方法,而不是原始問題的解決方案。 – hayavuk 2014-10-22 14:19:21

相關問題