我刚刚在提供的代码中发现了一些东西,我想向你解释一下。在我使用此代码发送电子邮件的测试中,一切似乎都正常工作,但出现了一个特定问题。
假设我要发送三封电子邮件:电子邮件 1、电子邮件 2 和电子邮件 3。当我发送电子邮件 1 时,控制台返回 200 OK 状态,但电子邮件未到达我的收件箱。然后,当我继续发送电子邮件 2 时,控制台再次返回 200 OK 状态,虽然我的收件箱中出现了一封新电子邮件,但结果却是电子邮件 1。等待几分钟后,没有收到任何更新或新电子邮件,我继续发送电子邮件 3。此时,控制台再次显示 200 OK 状态,令人惊讶的是,我的收件箱中收到了一封新电子邮件,但现在是电子邮件 2。
class ApiSendMailCreateNewReporter(APIView):
def get(self, request, id_headerRequest):
try:
# Obtener el objeto HeaderRequest o devolver un error 404 si no existe
header_request = get_object_or_404(HeaderRequest, id=id_headerRequest)
# Serializar el objeto HeaderRequest
serializer_header_request = HeaderRequestSerializer(header_request)
usuario_id = serializer_header_request.data['id_user_id']
require_date = serializer_header_request.data['require_date']
customer = serializer_header_request.data['customer']
# Obtener la instancia de Engineers con role='admin' o devolver un error 404 si no existe
engineer_instance = get_object_or_404(Engineers, role='admin')
engineer_serializer = EnginnerAdminSerializer(engineer_instance)
admin_email = engineer_serializer.data['email']
# Obtener la instancia de Users o devolver un error 404 si no existe
user_instance = get_object_or_404(Users, id=usuario_id)
serializer_user = UserAccountsSerializer(user_instance)
full_name = f"{serializer_user.data['first_Name']} {serializer_user.data['last_Name']}"
# Inicializar el modelo de objetos COM
pythoncom.CoInitialize()
dynamic_link = 'xxxxxxxxxxxxxx'
# Configurar el correo
outlook = win32.Dispatch('Outlook.Application')
mail = outlook.CreateItem(0)
mail.SentOnBehalfOfName = '[email protected]'
mail.To = admin_email
mail.Subject = 'NUEVA SOLICITUD DE PRUEBAS DE LABORATORIO'
html_body = f"""
<html>
<body>
<div>
<h1>Nueva solicitud de pruebas de laboratorio de {full_name}</h1>
<p>El usuario {full_name} ha creado una nueva solicitud de pruebas de laboratorio para el cliente {customer} con una fecha requerida para el {require_date}</p>
<a href="{dynamic_link}">
Ir al Sitio
</a>
</div>
</body>
</html>
"""
mail.HTMLBody = html_body
mail.Send()
return Response({"message": "Correo enviado correctamente"}, status=status.HTTP_200_OK)
except Exception as e:
print(f"Error: {e}")
return Response({"message": "Correo NO enviado correctamente"}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
finally:
# Liberar recursos
pythoncom.CoUninitialize()
由于公司的结构,我无法使用SMTP服务器电子邮件。
通过从 Outlook 对象模型调用
Send
方法,您不会立即推送电子邮件。 Send 方法提交该项目以进行进一步处理。但真正的处理将在 Outlook 将其文件夹与后端服务器(例如 Exchange)同步时进行。
如果您需要确保在调用 Send 方法后立即处理并发送特定的提交项目,您需要使用 NameSpace.SyncObjects 属性,该属性返回包含所有 Send\Receive 组的
SyncObjects
集合。 Start
方法开始使用指定的发送\接收组同步用户的文件夹。
例如,以下 VBA 示例展示了如何推送提交的项目(使用
Start
方法):
Public Sub Sync()
Dim nsp As Outlook.NameSpace
Dim sycs As Outlook.SyncObjects
Dim syc As Outlook.SyncObject
Dim i As Integer
Dim strPrompt As Integer
Set nsp = Application.GetNamespace("MAPI")
Set sycs = nsp.SyncObjects
For i = 1 To sycs.Count
Set syc = sycs.Item(i)
syc.Start
Next
End Sub