#python #smtp #encode #mime #file-extension
#python #csv #Адрес электронной почты #mime-почта
Вопрос:
Я хочу написать функцию для прикрепления файла csv к электронному письму с текстом HTML. Все работает нормально. Я отправляю электронное письмо с текстом и вложением с правильной информацией. Неверен только формат данных. Я пробовал разные варианты MIMEBASE('application', 'octet-stream')
. Это дает мне данные «.bin», которые я не могу открыть в macOS. Другие предоставили мне простые текстовые данные, которые включали правильные данные, но я не хочу копировать их вручную в csv. Есть ли у кого-нибудь решение, как я получаю данные как «.csv»? Большинство решений, которые я нашел здесь, выглядели как мой приведенный ниже код.
Код:
def send_mail(receiver, subject, filepath, attachname):
#login information
port = 123
smtp_server = "test.server.com"
login = "testlogin" # your login
password = "12345678910" # your password
# specify the sender’s and receiver’s email addresses and text in HTML
sender = "testmail@test.com"
receiver = receiver
message = MIMEMultipart()
message["Subject"] = subject
message["From"] = sender
message["To"] = COMMASPACE.join([receiver])
html_text = """
<html>
<body>
<p>Hi ,<br>
<p>kind regards</p>
<p> This is an automatized Mail </p>
</body>
</html>
"""
# convert both parts to MIMEText objects and add them to the MIMEMultipart message
text = MIMEText(html_text, "html")
message.attach(text)
#add a file as attachment
file = open(filepath, "rb")
att = MIMEBase('application', 'octet-stream')
att.set_payload(file.read())
encoders.encode_base64(att)
att.add_header("Content_Disposition",
'attachment', filename = attachname)
message.attach(att)
try:
#send your message with credentials specified above
with smtplib.SMTP(smtp_server, port) as server:
server.connect(smtp_server, port)
server.ehlo()
server.starttls()
server.ehlo()
server.login(login, password)
server.sendmail(sender, receiver, message.as_string())
# tell the script to report if your message was sent or which errors need to be fixed
print('Sent')
except (gaierror, ConnectionRefusedError):
print('Failed to connect to the server. Bad connection settings?')
except smtplib.SMTPServerDisconnected:
print('Failed to connect to the server. Wrong user/password?')
except smtplib.SMTPException as e:
print('SMTP error occurred: ' str(e))
send_mail('testmail@test.com', 'TEST', '/Users/Changer/Desktop/test.csv', 'test.csv')
Ответ №1:
Почтовые клиенты могут использовать тип содержимого части вложения, чтобы определить, какая программа используется для открытия вложения, поэтому может помочь указание подходящего типа содержимого.
Этот код использует модуль mimetypes стандартной библиотеки, чтобы попытаться угадать правильный тип содержимого вложения на основе его имени:
import mimetypes
mimetypes.init()
def send_mail(receiver, subject, filepath, attachname):
...
mimetype, _ = mimetypes.guess_type(attachname)
if mimetype is None:
mimetype = 'application/octet-stream'
type_, _, subtype = mimetype.partition('/')
att = MIMEBase(type_, subtype)
...
Приведенный выше код сгенерирует эти заголовки для вложения:
b'Content-Type: text/x-comma-separated-values'
b'MIME-Version: 1.0'
b'Content-Transfer-Encoding: base64'
b'Content_Disposition: attachment; filename="test.csv"'
Будет ли mac открывать csv с помощью приложения для работы с электронными таблицами (я предполагаю, что это то, что вы хотите), зависит от конфигурации компьютера (см. Пример В Этом блоге). Если вы хотите быть уверены, что открываете файл в электронной таблице, было бы эффективнее преобразовать его в формат электронной таблицы и отправить электронную таблицу.