精华内容
下载资源
问答
  • 将已经保存在数据库中的密码通过邮件发送到qq邮箱中。用的ssm框架,其中的config文件要先配置好。  用到的jar包有gson-2.2.1.jar,gson.jar,mail.jar,activation.jar  1.entity类(WmUser.java) public ...

        将已经保存在数据库中的密码通过邮件发送到qq邮箱中。用的ssm框架,其中的config文件要先配置好。

        用到的jar包有gson-2.2.1.jar,gson.jar,mail.jar,activation.jar

      1.entity类(WmUser.java)

    public class WmUser {
        private String userName;
        private String userPsw;
        private String email;
        public String getUserName() {
            return userName;
        }
        public void setUserName(String userName) {
            this.userName = userName;
        }
        public String getUserPsw() {
            return userPsw;
        }
        public void setUserPsw(String userPsw) {
            this.userPsw = userPsw;
        }
        public String getEmail() {
            return email;
        }
        public void setEmail(String email) {
            this.email = email;
        }
        
        public WmUser( String userName, String userPsw,
                 String email) {
            super();
            this.userName = userName;
            this.userPsw = userPsw;
            this.email = email;
        }
        public WmUser() {
            super();
            // TODO Auto-generated constructor stub
        }
        
    }
    View Code

     2.dao层

        UserMapper.java,是一个接口

    public interface UserMapper {
        //根据用户名和邮箱查找用户密码
        public List<WmUser> findAllUser(WmUser wmUser);
    }

        UserMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="com.etc.dao.UserMapper" >
        <!-- 查找密码 -->
        <select id="findAllUser" parameterType="com.etc.entity.WmUser" resultType="com.etc.entity.WmUser" >
            select userPsw from wm_user    where userName=#{userName} and email=#{email}    
        </select>
    
    </mapper>

    3.Biz层

      UserBiz.java(接口)

    public interface UserBiz {
            //找回密码
            public List<WmUser> findAllUser(WmUser wmUser);
    }

      UserBizImpl.java

    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    
    import com.etc.biz.UserBiz;
    import com.etc.dao.UserMapper;
    import com.etc.entity.WmUser;
    
    public class UserBizImpl implements UserBiz {
        @Autowired
        UserMapper userMapper;
        
        //查找密码
        public List<WmUser> findAllUser(WmUser wmUser) {
            List<WmUser> user=userMapper.findAllUser(wmUser);
            return user;
        }
        }
    View Code

    4.controller层

    import java.io.PrintWriter;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Properties;
    
    import javax.mail.Authenticator;
    import javax.mail.Message.RecipientType;
    import javax.mail.PasswordAuthentication;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import com.etc.biz.UserBiz;
    import com.etc.entity.WmUser;
    import com.google.gson.Gson;
    
    @Controller
    public class UserController {
        private static final Logger logger=LoggerFactory.getLogger(CompanyController.class);
        private static  List<WmUser> list = new ArrayList<WmUser>();
        @Autowired
        UserBiz userBiz;
    
        //修改密码
            @RequestMapping("/modPsw.action")
            public void modPsw(HttpServletRequest request, HttpServletResponse response,WmUser wmUser)
                    throws Exception {
                request.setCharacterEncoding("utf-8");
                response.setContentType("application/json;charset=utf-8");
                PrintWriter out = response.getWriter();
                //获取从页面传递过来的用户名和邮箱
                String userName=request.getParameter("userName2");
                String email=request.getParameter("email1");
                wmUser.setUserName(userName);
                wmUser.setEmail(email);
                list=userBiz.findAllUser(wmUser);
                Gson gson = new Gson();
                //获取到从数据库中查询出来的密码
                String str = gson.toJson(list.get(0).getUserPsw());
                
                //发送邮件
                // 创建Properties 类用于记录邮箱的一些属性
                final Properties props = new Properties();
                // 表示SMTP发送邮件,必须进行身份验证
                props.put("mail.smtp.auth", "true");
                //此处填写SMTP服务器
                props.put("mail.smtp.host", "smtp.qq.com");
                //端口号,QQ邮箱给出了两个端口
                props.put("mail.smtp.port", "587");
                // 此处填写发件人的账号(qq邮箱)
                props.put("mail.user", "发件人邮箱");
                // 此处的密码就是前面说的16位STMP口令
                props.put("mail.password", "在邮箱的账号中STMP授权码");
    
                // 构建授权信息,用于进行SMTP进行身份验证
                Authenticator authenticator = new Authenticator() {
    
                    protected PasswordAuthentication getPasswordAuthentication() {
                        // 用户名、密码
                        String userName = props.getProperty("mail.user");
                        String password = props.getProperty("mail.password");
                        return new PasswordAuthentication(userName, password);
                    }
                };
                
                //生成系统当前时间
                Date date = new Date(); //format对象是用来以指定的时间格式格式化时间的 
                SimpleDateFormat from = new SimpleDateFormat( "yyyy年MM月dd日 HH时mm分ss秒"); //这里的格式可以自己设置 
                //format()方法是用来格式化时间的方法 
                String times = from.format(date);
                
                // 使用环境属性和授权信息,创建邮件会话
                Session mailSession = Session.getInstance(props, authenticator);
                // 创建邮件消息
                MimeMessage message = new MimeMessage(mailSession);
                // 设置发件人
                InternetAddress form = new InternetAddress(
                        props.getProperty("mail.user"));
                message.setFrom(form);
    
                // 设置收件人的邮箱
                InternetAddress to = new InternetAddress("收件人邮箱");
                message.setRecipient(RecipientType.TO, to);
    
                // 设置邮件标题
                message.setSubject("修改密码");
    
                // 设置邮件的内容体
                message.setContent("尊敬的"+userName+"用户,您好!\r\n您在"+times+"提交找回密码请求,您的新密码为"+str+",请您登录后重新修改密码。\n如果您没有进行过找回密码的操作,请不要进行任何操作,并删除此邮件。谢谢!", "text/html;charset=UTF-8");
    
                // 最后当然就是发送邮件啦
                Transport.send(message);
            
            }
    }
    View Code

    5.页面设置(denglu.jsp)

            <form action="modPsw.action" method="post">
                <table>
                     <tr>
                        <td>用户名:</td>
                        <td><input type="text" id="userName2" name="userName2">
                        </td>
                    </tr>
                    <tr>
                        <td>邮箱:</td>
                        <td><input type="text" id="email1" name="email1"/></td>
                    </tr>
                    <tr>
                        <td colspan="2"><input type="button" value="返回">
                        <input type="submit" value="找回密码">
                        </td>
                    </tr>
                </table>
            </form>
    

     

    转载于:https://www.cnblogs.com/1025lovelyday/p/6137346.html

    展开全文
  • 我们已经讨论过如何将报表发送数据库中的一组电子邮件。在本文中,我们将做同样的事情,但对于.Net Core MVC平台上的Web应用程序。我们的任务是从某个数据库中获取电子邮件地址和用户名列表,并将带有附加报表的...

    下载FastReport.Net最新版本

    我们已经讨论过如何将报表发送到数据库中的一组电子邮件。在本文中,我们将做同样的事情,但对于.Net Core MVC平台上的Web应用程序。我们的任务是从某个数据库中获取电子邮件地址和用户名列表,并将带有附加报表的电子邮件发送到这些邮箱。我们使用MS SQL Server数据库。

    FastReport

    创建一个ASP应用程序.Net Core MVC应用程序。首先,使用NuGet Packages Manager将必要的库添加到项目中。在一般的nuget存储库中,我们找到并安装包:

    • Microsoft.EntityFrameworkCore;
    • Microsoft.EntityFrameworkCore.Relational;
    • Microsoft.jQuery.Unobtrusive.Ajax;
    • jQuery.

    从本地存储库 - FastReport.Net安装目录中的Nuget文件夹,安装软件包:

    • FastReport.Core;
    • FastReport.Web.

    现在我们将使用数据库和表的类本质创建工作上下文。为此,请打开包控制台Nuget。打开Tools - > Nuget Package Manager - >Package Manager Console menu(包管理器控制台菜单)。在控制台中,键入以下命令:

    Server=localhost;Database=testdb;Trusted_Connection=True;

    Microsoft.EntityFrameworkCore.SqlServer -OutputDir模型 当然,在这里您必须指定数据库服务器的连接字符串和数据模型的文件夹(默认情况下为Models)。

    PM> scaffold-dbcontext“Server = localhost; Database = testdb; Trusted_Connection = True;”

    Microsoft.EntityFrameworkCore.SqlServer -OutputDir模型 之后,理论上,应该将两个文件添加到Models文件夹:context和table实体。在我的例子中,这是testdbContext.cs和Emails.cs。 但是,在文件生成期间可能会发生错误:

    错误MSB4064:“Csc”任务不支持“SharedCompilationId”参数。

    有一个可设置的公共实例属性。 如果发生这种情况,请在NuGet包管理器中再添加一个包:

    Microsoft.Net.Compillers
    

    让我们马上将FastReport连接到我们的项目。在Startup.cs文件中,添加以下行:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
     {
    …
     app.UseFastReport();
    …
    }

    现在回到数据模型。要从数据库中获取记录,我们需要创建GetEmails方法。创建用于处理数据的类Facade:

    namespace WebMailing.Models
    {
     public static class Facade
     {
     public static List<Emails> GetEmails()
     {
     using (Models.testdbContext context = new Models.testdbContext())
     {
     var emails = (from adresses in context.Emails
     select adresses).ToList();
     return emails;
     }
     }
     }
    }

    我们来看看'HomeController'控制器吧。在Index方法中,加载报表以在站点的主页上显示它:

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using Microsoft.AspNetCore.Mvc;
    using WebMailing.Models;
    using FastReport;
    using FastReport.Export.Pdf;
    using FastReport.Export.Email;
    using FastReport.Web;
    …
    public IActionResult Index()
    {
     WebReport webReport = new WebReport();
     webReport.Report.Load(Environment.CurrentDirectory + "/text.frx");
     ViewBag.WebReport = webReport;
     return View();
    }

    我们将添加两种发送电子邮件的方法。第一个将在问候语中发送带有客户名称的私人信件,第二个将向一组地址发送一个字母。 所以,第一种方法是:

    [HttpPost]
     public ActionResult SendMail()
     {
     Report report1 = new Report(); //Create new report object
     report1.Load(Environment.CurrentDirectory + "/text.frx"); //Load report
     report1.Prepare(); //Prepare report
     
     PDFExport pdf = new PDFExport(); //Cteate PDF export
     EmailExport email = new EmailExport(); //Create Email export
     
     List<Emails> emails = Models.Facade.GetEmails();
     foreach (Emails item in emails)
     {
     SendMessage(report1, pdf, email, item.Email, item.Name);
     }
     return View();
     }

    使用它,我们创建了一个报表,导出为PDF,导出到电子邮件。然后,在循环中,我们从表中获取记录并调用发送字母的方法。作为参数,我们传递报表对象,导出PDF,导出到电子邮件,电子邮件地址和客户端名称。以下是发送信件的方法:

    public void SendMessage(Report report, PDFExport pdf, EmailExport email, string recipient, string custName)
     {
     string message = "This is test message.";
     email.Account.Address = "gromozekaster@yandex.ru";
     email.Account.Name = "Test User";
     email.Account.Host = "smtp.yandex.ru";
     email.Account.Port = 25;
     email.Account.UserName = "Gromozekaster";
     email.Account.Password = "*****"; //Your password
     email.Account.MessageTemplate = "Test";
     email.Account.EnableSSL = true;
     //email addressee settings
     email.Address = recipient;
     email.Subject = "TestMessage";
     email.MessageBody = custName is null ? message : string.Format("Dear, {0}! {1}", custName, message);
     email.Export = pdf; //Set export type
     email.SendEmail(report); //Send email
     }

    在其中,我们设置了一个电子邮件客户端来发送信件。并立即添加第二种方法,将一个字母发送到一组地址:

     [HttpPost]
     public ActionResult SendAll()
     {
     Report report1 = new Report(); //Create new report object
     report1.Load(Environment.CurrentDirectory + "/text.frx"); //Load report
     report1.Prepare(); //Prepare report
     PDFExport pdf = new PDFExport(); //Cteate PDF export
     EmailExport email = new EmailExport(); //Create Email export
     
     List<Emails> emails = Models.Facade.GetEmails();
     string addresses = "";
     foreach (Emails item in emails)
     {
     if (addresses == "")
     addresses = item.Email;
     else
     addresses = addresses + ", " + item.Email;
     }
     SendMessage(report1, pdf, email, addresses, null);
     return View();
     }

    正如您所看到的,它与之前的方法非常相似,唯一的区别是在循环中我们收到所有电子邮件地址,并发送一次这封信。作为电子邮件参数,我们传递一个包含所有电子邮件地址的字符串变量,但我们不传递客户端名称。

    对于SendMail()和SendAll()方法,我们需要创建相同名称的视图 - 视图。 他们的内容非常简单:

    @{
     ViewBag.Message = "Report was sent";
    }
    @ViewBag.Message

    我们只是告知发送。让我们转到Index.cshtml视图。在其中,我们需要添加两个按钮来使用不同的方法发送字母,以及显示报表:

    @{
     ViewData["Title"] = "Home Page";
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.1/jquery.min.js"></script>
     <form action="SendMail" method="POST">
     <input type="button" id="SendPersonal" value="Send Personal Email">
     <input type="button" id="SendAll" value="Send Email to All">
     <div class="answer"/>
     </form>
     <script type="text/javascript">
     $('#SendPersonal').on("click", function () {
     $.ajax({
     type: 'POST', // dispatch method
     url: '@Url.Action("SendMail", "Home")', // path to handler
     dataType: 'text',
     success: function (data) {
     $(".answer").html(data); // upon successful receipt of the response from the server, we enter the data in the element with the class answer
     }
     });
     return false;
     })
     $('#SendAll').on("click", function () {
     $.ajax({
     type: 'POST', // dispatch method
     url: '@Url.Action("SendAll", "Home")', // path to handler
     dataType: 'text',
     success: function (data) {
     $(".answer").html(data); // upon successful receipt of the response from the server, we enter the data in the element with the class answer
     }
     });
     return false;
     })
     </script>
    @await ViewBag.WebReport.Render() 

    要使用ajax jquery,我们添加了一个指向jquery.min.js脚本的链接。接下来,为每个表单添加一个带有两个按钮和两个脚本的表单。脚本非常简单 - 从控制器调用方法并返回结果视图。

    最后 - 我们从Index方法推导出报表。让我们运行应用程序,看看我们的网页是什么样的:

    FastReport

    我们通过不同的方式发信:

    FastReport

    和:

    FastReport

    在第一种情况下,在信函的文本中,我们通过名称引用客户端,在第二种情况下,没有,就这样。

    展开全文
  • 最近业务需求需要把生成的月报定时发送到指定邮箱,直接在网上找了相关经验改巴改巴给实现了,测试可以直接使用,生产是我从MySQL数据库获取文件信息和邮箱等使用的,程序中的注释相当清楚了。定时是通过shell脚本...

    Background

    最近业务需求需要把生成的月报定时发送到指定邮箱,直接在网上找了相关经验改巴改巴给实现了,测试可以直接使用,生产是我从MySQL数据库获取文件信息和邮箱等使用的,程序中的注释相当清楚了。定时是通过shell脚本实现的。

    获取邮件服务器和授权码

    在这里插入图片描述
    在这里插入图片描述

    源码

    from datetime import datetime
    from pymysql import connect
    import smtplib
    from email.header import Header
    from email.mime.application import MIMEApplication
    from email.mime.multipart import MIMEMultipart
    
    
    # 【mysql 基本信息】
    class MysqlUtil:
        # 定义基本属性【测试】
        host = '110.110.110.110'
        username = 'wlf'
        password = 'wlf'
        database = 'wlf'
        charset = 'utf8'
    
        # 定义基本属性【生产】
        # host = '192.168.110.110'
        # username = 'wlf'
        # password = 'wlf'
        # database = 'wlf'
        # charset = 'utf8'
    
        # 定义构造方法
        def __init__(self):
            self.connection = None
            self.cursor = None
            # 初始化 MySQL 连接配置
            try:
                self.connection = connect(host=self.host, user=self.username, password=self.password,
                                          database=self.database, charset=self.charset)
                self.cursor = self.connection.cursor()
            except():
                print("mysql connect failed, please check the config")
    
        # 获取所有需要发送月报的项目以及对应的邮箱,返回字典结构,key为项目id,value为list,存储邮箱
        def get_projects_with_emails(self):
            table = 'cft_report_email'
            pid_email_dict = {}
            sql_projects = "SELECT `project_id`, `email` FROM %s" % table
            self.cursor.execute(sql_projects)
            res_pid_email = self.cursor.fetchall()
            for pe in res_pid_email:
                pid = pe[0]
                email = pe[1]
                if pid in pid_email_dict:
                    pid_email_dict[pid].append(email)
                else:
                    email_list = [email]
                    pid_email_dict[pid] = email_list
            return pid_email_dict
    
        # 根据项目id和月报时间获取月报路径
        def get_filepath(self, pid):
            table = 'report_month'
            last_month_date = get_last_month_date()
            sql = "SELECT `path` FROM %s WHERE project_id = '%s' AND `report_date` = '%s'" % (table, pid, last_month_date)
            self.cursor.execute(sql)
            res_path = self.cursor.fetchone()[0]
            return res_path
    
    
    # 获取上月日期 年份和月份 例子:2020年10月
    def get_last_month_date():
        now_month = datetime.now()
        year = now_month.year
        month = now_month.month
        if month == 1:
            month = 12
            year -= 1
        else:
            month -= 1
        return str(year) + "年" + str(month) + "月"
    
    
    # 向指定邮箱发送文件
    def send_email(file, emails):
        """
        发送邮件的脚本,在邮件中可添加text文本,图片和附件
        :return:
        """
        # 设置服务器(这里是163的服务器,这里需要用户名和密码,host网上查对应的smtp服务器)
        mail_host = "smtp.163.com"
        mail_user = "yunluwlf@163.com"
        # 密码(这里的密码不是登录邮箱密码,而是授权码)
        mail_auth_code = "IXMHKCCISDRJGVJW"
        # 邮件发送和接收人
        sender = mail_user
        reciever = emails
        # 邮件头信息
        message = MIMEMultipart('related')
        message['From'] = sender
        message['To'] = ','.join(reciever)
        message['Subject'] = Header('数据简报【输电铁塔】')
        # ③图片 形式的内容添加到邮件(包含在②中,否咋上传的是图片附件)
        # fp = open(r'D:/wkspc/pycharm-wkspc/wind_rose/imgs/2020-10/ybj/wind-rose.jpg', 'rb')
        # content_image = MIMEImage(fp.read())
        # fp.close()
        # content_image.add_header('content-disposition', 'attachment', filename='wind-rose.jpg')
        # message.attach(content_image)
        # ④ 附件 形式的内容添加到邮件
        attach_table = MIMEApplication(open(file, 'rb').read())
        attach_table.add_header('content-disposition', 'attachment', filename=get_file_name(file))
        # 这样的话,附件名称就可以是中文的了,不会出现乱码
        attach_table.set_charset('utf-8')
        message.attach(attach_table)
        # 发送邮件,测试成功,流程都是固定的:创建客户端,登陆,发送,关闭
        try:
            # 实例化
            smtpObj = smtplib.SMTP()
            # 25为 SMTP 端口号
            smtpObj.connect(mail_host, 25)
            smtpObj.login(mail_user, mail_auth_code)
            print('登录成功!')
            smtpObj.sendmail(mail_user, reciever, message.as_string())
            smtpObj.quit()
            print("恭喜:邮件发送成功!")
        except smtplib.SMTPException:
            print("错误:邮件发送失败!")
    
    
    # 根据文件路径获取文件名
    def get_file_name(file_path):
        splits = file_path.split("/")
        return splits[len(splits) - 1]
    
    
    if __name__ == '__main__':
        # 【测试】
        file_send = 'docs/results/2020年10月/羊八井测点2020年10月风场实测数据简报.docx'
        emails_to_send = ['1147314023@qq.com', 'longfei.wang@cloudansys.com']
        send_email(file_send, emails_to_send)
    
        # 【生产】
        # 获取MySQL工具类对象
        # mysql_util = MysqlUtil()
        # # 获取所有需要发送月报的项目id以及对应的邮箱
        # dict_pid_with_email = mysql_util.get_projects_with_emails()
        # # 获取所有需要发送月报的项目id
        # dict_keys = dict_pid_with_email.keys()
        # for project_id in dict_keys:
        #     # 根据项目id获取获取发送的月报路径
        #     the_filepath = mysql_util.get_filepath(project_id)
        #     # 获取项目id对应的邮箱
        #     the_email_list = dict_pid_with_email[project_id]
        #     # 向对应的邮箱发送邮件
        #     send_email(the_filepath, the_email_list)
    
    

    效果

    在这里插入图片描述
    在这里插入图片描述

    注意

    经测试:支持网易邮箱和qq邮箱;不支持搜狐邮箱。
    ps:其实搜狐邮箱也能发送成功,但是发过去的时候文件不知怎么被改名改后缀了,变成了`投递状态.txt`,当然,如果手动把txt改成docx还是可以打开文件的,内容也没变。
    

    在这里插入图片描述

    展开全文
  • 最近业务需求需要把生成的月报定时发送到指定邮箱,直接在网上找了相关经验改巴改巴给实现了,测试可以直接使用,生产是我从MySQL数据库获取文件信息和邮箱等使用的,程序中的注释相当清楚了。定时是通过shell脚本...

    Background

    最近业务需求需要把生成的月报定时发送到指定邮箱,直接在网上找了相关经验改巴改巴给实现了,测试可以直接使用,生产是我从MySQL数据库获取文件信息和邮箱等使用的,程序中的注释相当清楚了。定时是通过shell脚本实现的。

    获取邮件服务器和授权码

    PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

    python免费学习资料以及群交流解答点击即可加入

     

    源码

    from datetime import datetime
    from pymysql import connect
    import smtplib
    from email.header import Header
    from email.mime.application import MIMEApplication
    from email.mime.multipart import MIMEMultipart
    
    
    # 【mysql 基本信息】
    class MysqlUtil:
        # 定义基本属性【测试】
        host = '110.110.110.110'
        username = 'wlf'
        password = 'wlf'
        database = 'wlf'
        charset = 'utf8'
    
        # 定义基本属性【生产】
        # host = '192.168.110.110'
        # username = 'wlf'
        # password = 'wlf'
        # database = 'wlf'
        # charset = 'utf8'
    
        # 定义构造方法
        def __init__(self):
            self.connection = None
            self.cursor = None
            # 初始化 MySQL 连接配置
            try:
                self.connection = connect(host=self.host, user=self.username, password=self.password,
                                          database=self.database, charset=self.charset)
                self.cursor = self.connection.cursor()
            except():
                print("mysql connect failed, please check the config")
    
        # 获取所有需要发送月报的项目以及对应的邮箱,返回字典结构,key为项目id,value为list,存储邮箱
        def get_projects_with_emails(self):
            table = 'cft_report_email'
            pid_email_dict = {}
            sql_projects = "SELECT `project_id`, `email` FROM %s" % table
            self.cursor.execute(sql_projects)
            res_pid_email = self.cursor.fetchall()
            for pe in res_pid_email:
                pid = pe[0]
                email = pe[1]
                if pid in pid_email_dict:
                    pid_email_dict[pid].append(email)
                else:
                    email_list = [email]
                    pid_email_dict[pid] = email_list
            return pid_email_dict
    
        # 根据项目id和月报时间获取月报路径
        def get_filepath(self, pid):
            table = 'report_month'
            last_month_date = get_last_month_date()
            sql = "SELECT `path` FROM %s WHERE project_id = '%s' AND `report_date` = '%s'" % (table, pid, last_month_date)
            self.cursor.execute(sql)
            res_path = self.cursor.fetchone()[0]
            return res_path
    
    
    # 获取上月日期 年份和月份 例子:2020年10月
    def get_last_month_date():
        now_month = datetime.now()
        year = now_month.year
        month = now_month.month
        if month == 1:
            month = 12
            year -= 1
        else:
            month -= 1
        return str(year) + "年" + str(month) + "月"
    
    
    # 向指定邮箱发送文件
    def send_email(file, emails):
        """
        发送邮件的脚本,在邮件中可添加text文本,图片和附件
        :return:
        """
        # 设置服务器(这里是163的服务器,这里需要用户名和密码,host网上查对应的smtp服务器)
        mail_host = "smtp.163.com"
        mail_user = "yunluwlf@163.com"
        # 密码(这里的密码不是登录邮箱密码,而是授权码)
        mail_auth_code = "IXMHKCCISDRJGVJW"
        # 邮件发送和接收人
        sender = mail_user
        reciever = emails
        # 邮件头信息
        message = MIMEMultipart('related')
        message['From'] = sender
        message['To'] = ','.join(reciever)
        message['Subject'] = Header('数据简报【输电铁塔】')
        # ③图片 形式的内容添加到邮件(包含在②中,否咋上传的是图片附件)
        # fp = open(r'D:/wkspc/pycharm-wkspc/wind_rose/imgs/2020-10/ybj/wind-rose.jpg', 'rb')
        # content_image = MIMEImage(fp.read())
        # fp.close()
        # content_image.add_header('content-disposition', 'attachment', filename='wind-rose.jpg')
        # message.attach(content_image)
        # ④ 附件 形式的内容添加到邮件
        attach_table = MIMEApplication(open(file, 'rb').read())
        attach_table.add_header('content-disposition', 'attachment', filename=get_file_name(file))
        # 这样的话,附件名称就可以是中文的了,不会出现乱码
        attach_table.set_charset('utf-8')
        message.attach(attach_table)
        # 发送邮件,测试成功,流程都是固定的:创建客户端,登陆,发送,关闭
        try:
            # 实例化
            smtpObj = smtplib.SMTP()
            # 25为 SMTP 端口号
            smtpObj.connect(mail_host, 25)
            smtpObj.login(mail_user, mail_auth_code)
            print('登录成功!')
            smtpObj.sendmail(mail_user, reciever, message.as_string())
            smtpObj.quit()
            print("恭喜:邮件发送成功!")
        except smtplib.SMTPException:
            print("错误:邮件发送失败!")
    
    
    # 根据文件路径获取文件名
    def get_file_name(file_path):
        splits = file_path.split("/")
        return splits[len(splits) - 1]
    
    
    if __name__ == '__main__':
        # 【测试】
        file_send = 'docs/results/2020年10月/羊八井测点2020年10月风场实测数据简报.docx'
        emails_to_send = ['1147314023@qq.com', 'longfei.wang@cloudansys.com']
        send_email(file_send, emails_to_send)
    
        # 【生产】
        # 获取MySQL工具类对象
        # mysql_util = MysqlUtil()
        # # 获取所有需要发送月报的项目id以及对应的邮箱
        # dict_pid_with_email = mysql_util.get_projects_with_emails()
        # # 获取所有需要发送月报的项目id
        # dict_keys = dict_pid_with_email.keys()
        # for project_id in dict_keys:
        #     # 根据项目id获取获取发送的月报路径
        #     the_filepath = mysql_util.get_filepath(project_id)
        #     # 获取项目id对应的邮箱
        #     the_email_list = dict_pid_with_email[project_id]
        #     # 向对应的邮箱发送邮件
        #     send_email(the_filepath, the_email_list)

    效果

     

    注意

    经测试:支持网易邮箱和qq邮箱;不支持搜狐邮箱。
    ps:其实搜狐邮箱也能发送成功,但是发过去的时候文件不知怎么被改名改后缀了,变成了`投递状态.txt`,当然,如果手动把txt改成docx还是可以打开文件的,内容也没变。
    12

     

    展开全文
  • 假设我们有一个受欢迎网站.我们需要在用户之间实现类似邮件的消息传递....所有用户所有消息都存储在一个表,导致其高负载并降低整体数据库性能.>当有人需要同时多个用户发送消息时,会复...
  • Google Guice 这个高效与Spring类似依赖注入框架;...使用 MailServiceTest 向邮件新增一条邮件记录,轮询系统会自动将邮件发送出去,有了邮箱发送推广广告,你懂得,记得改成你的邮件服务器!
  •  在指定时间(如上午9点)订阅图书的邮箱发送订阅咨询。 细节:1.订阅条件,包括多种检索图书的条件,存放在XML表  2.定时发送,时间存放在config文件  3.订阅提交时首先有个确认邮件,里面包括确认链接...
  • Java实现注册时发送激活邮件验证

    千次阅读 2018-04-30 16:49:31
    形式为:用户注册时填写邮箱,注册完成后,网站会用户所填邮箱发送一封激活邮件,用户点击激活邮件中的链接后,方可完成注册。,自己研究了相关示例后,采用James邮件服务器,进行了简单的实现,步骤如下:运行...
  • 形式为:用户注册时填写邮箱,注册完成后,网站会用户所填邮箱发送一封激活邮件,用户点击激活邮件中的链接后,方可完成注册。数据库表结构 用户表t_user有五个字段分别为用户名、密码、邮箱地址、
  • 在ivx提供了邮件组件,可以指定的邮箱发送邮件或者多个邮箱发送多人邮件(即群发邮件)。邮件组件为后台组件,我们也可以把它看成是一个特殊的数据库,每当我们成功发送一条邮件后,会将该邮件的提交用户、收...
  • 添加计划任务,定期运行该PowerShell脚本,即可你指定的邮箱发送Exchange2010数据库及副本的运行状态、复制状态、复制和重播队列,当出现数据库故障时,就会自动更改库的颜色,如果有日志或错误信息,也会自动显示...
  • Java——用户激活邮件工具类

    千次阅读 热门讨论 2015-08-31 08:35:49
    我们经常遇到在网站或者软件注册新用户时...因此系统需要我们注册邮箱发一封激活邮件,我们点击激活连接后系统会将数据库中用户状态字段更改为可用状态,至此用户激活成功,该用户可以正常使用。下面是实现过程:
  • JavaMail实现简单邮箱验证——163邮箱

    万次阅读 2017-04-10 13:24:31
    当用户注册的时候,注册成功,用户邮箱发送一个激活邮件,用户激活之后修改数据库中的状态,变为已激活。 当用户填写信息,点击注册的时候,入如果注册成功,则发送邮件。 @PostMapping(value=...
  • 邮箱验证

    2013-01-04 21:21:10
    实现用户注册时,其油箱发送激活码邮件,并进行状态处理。 ...//在注册时就生成激活码,在此同时要给用户的邮箱发激活链接邮件,只有点击了激活链接后数据库中的字段active才能变成true string
  • 有些网站在注册的时候,会用户的邮箱发送邮件,点击邮件中的链接激活账户,基本原理就是在注册的时候(即点击发送邮件的时候),先把用户的信息存进数据库,另外还有一个激活状态的字段(默认是未激活)点击邮件...
  • iredmail邮箱使用

    2019-02-22 15:26:20
    按照官方文档配置配置完毕服务器端。...接收服务器使用POP3,接收服务器使用SSL,端口是默认995发送服务器不需要选择SSL,填写端口587关闭灰名单或者向数据库中添加外域白名单,才能接收到外域邮件...
  • 同时用户填写的邮箱发送一封邮件邮件内容附带一个链接:http://www.xxx.com/jihuo.aspx?username=用户名&code=激活码。 用户收到邮件后点击此链接。 在jihuo.aspx验证传送过来的用户名和激活码是否...
  • SSH注册通过邮箱激活

    2019-07-04 00:12:25
    大概步骤,我们注册成功后,输入的邮箱发送信息,点击邮箱中的链接(链接可以是自己系统的登录链接),使state字段改为1 1.使用的两个工具类 (1)邮件创建工具类 package com.yinhe.util; import java.util....
  • 设置完成后,它将每隔24小时发送一次报告,该报告在您的邮箱中(可以更改) PDF组织 最新消息:提醒您不需要注意的地方 可用的新提交:让您知道一个可用的提交 新版本可用:警告您新版本可用 CLI使用 你可能...
  • 中文RFC文档.zip

    2020-04-02 10:45:36
    RFC896 在IPTCP internet网络中的拥塞控制 RFC903 反向地址转换协议 RFC911 BERKELEY UNIX 4.2下的EGP网关 RFC917 因特网子网 RFC918 邮局协议 RFC925 多局域网地址解决 RFC930 Telnet终端类型选项 RFC932 子网...
  • 支持jmail、cdonts两种方式发送邮件。 整合功能卓越《留言本》,界面美观、功能强大,支持留言审核、留言固顶、脏话过滤。 新增商品评论功能。 QQ在线咨询功能大大增强,可自由打开或关闭在线咨询面板、可...
  • 支持jmail、cdonts两种方式发送邮件。 会员注册通知、新订单邮件通知、汇款确认通知。 “推荐给好友”功能,访问者可将商品在线推荐给好友。 订单支付功能,会员可在订单管理直接进入在线支付结帐。实用新闻功能...
  • RFC中文文档-txt

    2009-09-11 14:56:56
    RFC896 在IPTCP internet网络中的拥塞控制 RFC903 反向地址转换协议 RFC911 BERKELEY UNIX 4.2下的EGP网关 RFC917 因特网子网 RFC918 邮局协议 RFC925 多局域网地址解决 RFC930 Telnet终端类型选项 RFC932 子网地址...
  • 游客也可以给会员发送邮件及站内短信等 会员积分 功能强大积分系统,管理员可以细化控制每一项功能可以获得积分,以及消费得分,比如发布产品可以获得多少分, 查看某一条商务信息联系方式需要用掉多少积分,...

空空如也

空空如也

1 2 3 4
收藏数 78
精华内容 31
关键字:

向数据库中的邮箱发送邮件