使用 Django 和 win32 库发送电子邮件时出现“等待名单”或延迟

问题描述 投票:0回答:1

我刚刚在提供的代码中发现了一些东西,我想向你解释一下。在我使用此代码发送电子邮件的测试中,一切似乎都正常工作,但出现了一个特定问题。

假设我要发送三封电子邮件:电子邮件 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服务器电子邮件。

django django-rest-framework django-views outlook pywin32
1个回答
0
投票

通过从 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
© www.soinside.com 2019 - 2024. All rights reserved.