Para enviar um email com uma imagem usando Python, você pode utilizar a biblioteca smtplib
para enviar o email e email.mime
para criar as partes do email, incluindo a parte da imagem. Aqui está um exemplo básico de como você pode fazer isso usando a biblioteca smtplib
e email.mime
:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
# Configurações do email
email_de = 'seu_email@gmail.com'
email_para = 'destinatario@email.com'
senha = 'sua_senha'
# Criar o corpo do email
mensagem = MIMEMultipart()
mensagem['From'] = email_de
mensagem['To'] = email_para
mensagem['Subject'] = 'Assunto do Email'
# Adicionar corpo do email (pode ser texto ou HTML)
corpo_email = MIMEText('Corpo do email. Aqui está a imagem:')
mensagem.attach(corpo_email)
# Adicionar imagem ao email
with open('caminho_da_imagem.jpg', 'rb') as arquivo_imagem:
imagem = MIMEImage(arquivo_imagem.read())
mensagem.attach(imagem)
# Configurar o servidor SMTP
servidor_smtp = smtplib.SMTP('smtp.gmail.com', 587)
servidor_smtp.starttls()
servidor_smtp.login(email_de, senha)
# Enviar email
servidor_smtp.sendmail(email_de, email_para, mensagem.as_string())
# Encerrar a conexão
servidor_smtp.quit()
Para adicionar uma imagem ao corpo de um e-mail utilizando Python e integrando com o Microsoft Outlook (como é o caso do seu script), você precisa garantir que a imagem seja embutida corretamente no e-mail. O trecho de código que você compartilhou parece estar configurando a mensagem para utilizar HTML, mas não está configurando corretamente o caminho da imagem para que ela seja embutida e visualizada pelo destinatário ao abrir o e-mail.
Você precisa referenciar corretamente o arquivo da imagem no HTML. Se a imagem é um arquivo local, você terá que ajustar o código para anexar a imagem ao e-mail e referenciá-la usando o CID (Content-ID). Aqui está como fazer:
import win32com.client as win32
# Supondo que contatos_df é um DataFrame com as informações necessárias
for i, chamados in enumerate(contatos_df["incidente"]):
data_agendamento = contatos_df.loc[i, 'data'].strftime("%d/%m/%Y")
o = win32.Dispatch("Outlook.Application")
mail = o.CreateItem(0)
# Configurando a conta de e-mail do remetente
mail._oleobj_.Invoke(*(64209, 0, 8, 0, o.Session.Accounts[1]))
mail.To = f"{contatos_df.loc[i, 'email']}"
mail.Subject = f"Agendamento Dell - DPS {contatos_df.loc[i, 'dps']}| {contatos_df.loc[i, 'company']}| SRMS - {contatos_df.loc[i, 'incidente']}"
# Caminho para a imagem que você deseja embutir
image_path = 'caminho_para_a_imagem/DELL.PNG'
# Anexando a imagem ao e-mail
attachment = mail.Attachments.Add(image_path)
attachment.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001F", "MyId1")
# HTML Body com a referência à imagem usando CID
mail.HTMLBody = f"""
<p>Prezado(a),</p>
<p>Segue informações do seu agendamento:</p>
<img src="cid:MyId1"><br>
<p>Data de Agendamento: {data_agendamento}</p>
"""
mail.Send()
print("Email enviado")
Para adicionar uma imagem diretamente no corpo do e-mail com Python e Outlook, você precisa garantir que a imagem esteja embutida no e-mail como um **cid (Content-ID)**, e não apenas como um link externo. Para isso, você pode usar a biblioteca `win32com.client` que já está sendo utilizada no seu código, e fazer alguns ajustes para embutir a imagem de maneira correta.
Aqui está um exemplo de como adicionar uma imagem no corpo do e-mail usando o `win32com` com Outlook, embutindo a imagem e utilizando o `cid` para que ela seja visível diretamente no corpo do e-mail (sem a necessidade de estar disponível externamente):
### Passos:
1. Você precisa criar um objeto de anexo para a imagem.
2. Definir o `Content-ID` para a imagem.
3. Referenciar o `Content-ID` no corpo do e-mail.
### Código:
```python
import win32com.client as win32
# Exemplo de DataFrame com informações (adapte conforme seu código)
# contatos_df = ...
# Loop através dos dados do DataFrame (assumindo que você tenha a estrutura pronta)
for i, chamados in enumerate(contatos_df["incidente"]):
data_agendamento = contatos_df.loc[i, 'data'].strftime("%d/%m/%Y")
# Criação do objeto Outlook
o = win32.Dispatch("Outlook.Application")
Msg = o.CreateItem(0) # Cria o e-mail
Msg._oleobj_.Invoke(*(64209, 0, 8, 0, o.Session.Accounts[1])) # Configura a conta de e-mail
# Dados do e-mail
Msg.To = f"{contatos_df.loc[i, 'email']}" # Endereço de e-mail
Msg.Subject = f"Agendamento Dell - DPS {contatos_df.loc[i, 'dps']}| {contatos_df.loc[i, 'company']}| SRMS - {contatos_df.loc[i, 'incidente']}"
# Caminho da imagem
caminho_imagem = r"C:\caminho\para\sua\imagem\DELL.PNG"
# Adicionando a imagem como anexo
attachment = Msg.Attachments.Add(caminho_imagem)
# Definindo o Content-ID para a imagem
attachment.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001F", "imagem_de_logo")
# Corpo do e-mail com referência ao Content-ID
Msg.HTMLBody = f"""
<html>
<body>
<p>Olá,</p>
<p>Segue o agendamento conforme abaixo:</p>
<p><strong>Data do agendamento:</strong> {data_agendamento}</p>
<p><img src="cid:imagem_de_logo" alt="Logo Dell"></p>
<p>Atenciosamente,</p>
<p>Sua Empresa</p>
</body>
</html>
"""
# Envia o e-mail
Msg.Send()
print("E-mail enviado")
```
### Explicação:
1. **Anexando a imagem**:
- Usamos o método `Msg.Attachments.Add()` para adicionar a imagem como anexo.
- A linha `attachment.PropertyAccessor.SetProperty(...)` define o **Content-ID** para a imagem anexada. O **Content-ID** é um identificador único usado para referenciar a imagem no corpo do e-mail.
2. **Referenciando a imagem no corpo do e-mail**:
- No corpo do e-mail (HTML), a tag `<img src="cid:imagem_de_logo">` é usada para referenciar a imagem com o **Content-ID** definido. O `cid` refere-se diretamente ao anexo e exibe a imagem no corpo do e-mail.
3. **HTML no corpo do e-mail**:
- A estrutura HTML no `Msg.HTMLBody` é utilizada para formatar o conteúdo e incluir a imagem.
### Observações:
- **Caminho da imagem**: Certifique-se de que o caminho da imagem (no exemplo, `C:\caminho\para\sua\imagem\DELL.PNG`) esteja correto. Caso a imagem não esteja no local indicado, o e-mail será enviado sem a imagem.
- **Assinatura do e-mail**: A estrutura HTML pode ser ajustada conforme a sua necessidade, incluindo outras informações ou alterando o formato.
- **Outlook**: Este código funciona em sistemas Windows com o Outlook configurado corretamente.
Se você tiver mais dúvidas ou quiser ajustar mais algum ponto, estarei à disposição para ajudar!