ODOO中使用SMTP(安全连接SSL/TLS)的465端口发送邮件

博客介绍了在ODOO中实现自动邮件提醒功能的步骤。首先要重启ODOO服务,安装或升级相关模块,接着通过设置-技术-自动化-安排的动作新建定时任务,需设置动作名称、涉及的数据库模型,将功能函数复制进python代码并按指定方式执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 自动邮件提醒功能


-*- coding: utf-8 -*-
from odoo import models, fields, api, tools
import datetime
import time

import smtplib
from smtplib import SMTP_SSL
from email.mime.text import MIMEText
from email.header import Header

class PurchaseDelay(models.Model):
	_name = 'stock.picking'
	_inherit = ['stock.picking', 'mail.thread']

	@api.multi
	def _email_delay_remind(self):
		
		lines = self.env["stock.picking"].search([('state', 'in', ('assigned', 'waiting', 'confirmed'))])

		# 遍历所有的发件服务器
		email_servers = self.env["ir.mail_server"].search([])

		# email_servers[0]: 正常使用的发件服务器
		mail_host = email_servers[0].smtp_host  # 设置服务器
		mail_user = email_servers[0].smtp_user  # 用户名
		mail_pass = email_servers[0].smtp_pass  # 密码
		mail_port = email_servers[0].smtp_port  # SMTP 端口
		sender = email_servers[0].smtp_user # 发件人

		one_week_sec = 604800 # 一周
		to_addr = ''

		for order in lines:
			current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')   # 当前时间
			scheduled_time = order.scheduled_date   # 预期收货时间

			# 日期转换为秒
			cur_time = time.mktime(time.strptime(current_time,"%Y-%m-%d %H:%M:%S")) 
			end_time = time.mktime(time.strptime(str(scheduled_time),"%Y-%m-%d %H:%M:%S"))

			diff_time = cur_time - end_time
			# 若逾期时间超过一周,发送邮件提醒

			if diff_time > one_week_sec:
				
				if order.create_uid.name == 'OdooBot':
					receivers = [ order.company_id.store_keeper_id.email]  # 收件人r
					to_addr = order.company_id.store_keeper_id.email
				else:
					receivers = [ order.create_uid.email, order.company_id.store_keeper_id.email]  # 收件人
					to_addr =  order.create_uid.email+','+ order.company_id.store_keeper_id.email
			
				
				if isinstance(order.origin, str):
					oredr_origin = order.origin
				else:
					oredr_origin = '无源单据'

				# 邮件内容
				mail_msg = '''
								<h2>您有邮件提醒</h2>
								<h3>源单据:'''+oredr_origin+'''</h3>
							'''
				
				message = MIMEText(mail_msg, 'html', 'utf-8')
				message['From'] = Header("xxx@xxx.com", 'utf-8')
				message['To'] = to_addr
				message['Subject'] = Header('邮件提醒', 'utf-8') # 主题

				try:
					smtpObj = SMTP_SSL(mail_host)    # SMTP SSL连接安全限制,默认端口号465,采用SMTP_SSL()发送
					# smtpObj = smtplib.SMTP()     	# SMTP没有设置连接安全限制,默认端口号25,直接采用smtplib.SMTP() 发送
					# smtpObj.connect(mail_host, 25) 
					smtpObj.login(mail_user, mail_pass)
					smtpObj.sendmail(sender, receivers, message.as_string())
					print("Email sent successfully!")

				except smtplib.SMTPException:
					print("Error: Unable to send mail!")
				

2. 重启ODOO服务,回到网页安装或者升级上述代码所在的模块

在这里插入图片描述

3. 设置-技术-自动化-安排的动作

在这里插入图片描述
在‘安排的动作’中新建一个定时任务:
动作名称: 定时任务的名称
模型:本次定时任务涉及的数据库模型
python代码:将上述python代码中的功能函数_email_delay_remind
复制进来,执行方式:model._email_delay_remind()在这里插入图片描述

//初始化邮件类 void InitEmail(C01waSendMail* m_globalEmail,String sendermail,String sender,String senderpwd,String srv,int port = 25,bool bSsl = false) { m_globalEmail->m_Auth = CPJNSMTPConnection::AuthenticationMethod::AUTH_AUTO; m_globalEmail->m_bAutoDial = true; m_globalEmail->m_bSSL = bSsl; m_globalEmail->m_sUsername = sender.c_str(); m_globalEmail->m_sAddress = sendermail.c_str(); m_globalEmail->m_sPassword = senderpwd.c_str(); m_globalEmail->m_sHost = srv.c_str(); m_globalEmail->m_nPort = port; m_globalEmail->m_sEncodingFriendly = _T("Chinese Simplified (GB2312)"); m_globalEmail->m_sEncodingCharset = _T("gb2312"); m_globalEmail->m_bMime = 1; m_globalEmail->m_bHTML = 1; m_globalEmail->m_Priority = CPJNSMTPMessage::PRIORITY::NormalPriority; m_globalEmail->m_bDSN = FALSE; m_globalEmail->m_bDSNSuccess = FALSE; m_globalEmail->m_bDSNFailure = FALSE; m_globalEmail->m_bDSNDelay = FALSE; m_globalEmail->m_bDSNHeaders = FALSE; m_globalEmail->m_bDNSLookup = FALSE; } //发送邮件 void SendEmail(const char* recvemail,const char* subject,const char* body,const char * sCC=NULL,const char * bCC = NULL,const char * attach = NULL) { //初始化邮箱 //注意释放内存 C01waSendMail *m_globalEmail = new C01waSendMail; if(strlen(m_con1.m_eamil)>0&&strlen(m_con1.m_pwd)&&strlen(m_con1.m_smtpsrv)&&m_con1.port>0) { char * p = strdup(m_con1.m_eamil); char * pp = strstr(p,"@"); if(pp>0) pp[0] = '\0'; InitEmail(m_globalEmail,m_con1.m_eamil,p,m_con1.m_pwd,m_con1.m_smtpsrv,m_con1.port,m_con1.ssl); free(p); if(subject>0) m_globalEmail->m_sSubject.Format("%s",subject); if(sCC>0) m_globalEmail->m_sCC.Format("%s",sCC); if(bCC>0) m_globalEmail->m_sBCC.Format("%s",bCC); if(body>0) m_globalEmail->m_sBody.Format("%s",body); if(attach>0) m_globalEmail->m_sFile.Format("%s",attach); if(recvemail>0) m_globalEmail->m_sTo.Format("%s",recvemail); m_globalEmail->SendEmail(); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值