精华内容
下载资源
问答
  • 想要SQLSERVER2005安装文件的童鞋可以发email给我,wangxiaofeng0010@sina.com
  • JAVAMAIL 发Email案例

    千次阅读 2011-04-25 15:41:00
    JAVAMAIL 发Email案例

    今天试了下JAVAMAIL的代码,郁闷到吐血,他们的邮箱都可以发送成功,我的邮箱就报

    我改了好多次密码都不行,密码绝对没有输入错误,我也试了我的另外的邮箱也是失败,非常的郁闷,值到最后我无意在网上看到,一些邮箱服务器把新注册的邮箱不支持pop3协议,我就找别人拿几年前注册的邮箱,果然可以.郁闷死了

     

    记的以前有写过不用密码就可以发送的,

    结果发现现在已经不能使用的.

    其实是有些邮箱服务商为了避免别人乱发广告而加了一个需要密码验证

    我同学尝试着用循环发送邮件,其实到最后只收到一封,而且发多了会报

    而且帐户可能会被封,所以小心小心.

     

    其实发送邮件还有很多开源的架包,javamail只是一种,具体问题具体分析,这就不说了.

     

    底下是我在网上找的一个javamail的例子,具体的地方已经不知道是哪了,先引用下

     

    展开全文
  • 怎么让Linux发邮件? Linux怎么发email

    千次阅读 2018-06-22 16:58:08
    我们今天就来做一个实验 让你的Linux邮件到你的mail中 我们今天需要一个软件(mailx)直接yum装即可: yum install -y mailx   然后我们创建一个隐藏文件 类似.sh 随便一个就好   vi /email.sh 然.....

    相比大家也想让自己的Linux备份啊什么的存储起来  放到哪里最安全呢 

    相比来说放到自己QQ邮箱比放到自己电脑更安全一些

    我们今天就来做一个实验 让你的Linux发邮件到你的mail中

    我们今天需要一个软件(mailx)直接yum装即可:

    yum install -y mailx

     

    然后我们创建一个隐藏文件 类似.sh  随便一个就好

     

    vi /email.sh

    然后我们要给他一个执行权限:

    chmod 777 /email.sh

    我们在执行一下文件

    /email.sh

     

    然后我们要去腾讯要认证规则 写入到.sh文件中(QQ比较火所以小编用的是QQ)

     

    然后直接复制粘贴即可:

    #!/bin/bash
    mkdir /root/.certs/
    echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt
    certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
    certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
    certutil -L -d /root/.certs
    cd /root/.certs/
    certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i qq.crt

    下一步我们就要打开自己的QQ邮箱然后设置SMTP的秘钥 腾讯会给你个秘钥:

    进入后点击设置

    下一步点击  →我的账户

    往下鼠标滚轮滚动会有四个服务我们看第二个IMAP服务 点击开启服务 验证你的信息 发个短信就行!

    验证成功以后就会给你一个授权码 其实我们要的是授权码

    然后我们进Linux 打开刚才mail的配置文件 加入规则:

    vi /etc/mail.rc

    进入以后我们加入规则

    set smtp-use-starttls
    set smtp=smtp.qq.com
    set from=自己的qq邮箱
    set smtp-auth-user=自己的qq邮箱
    set smtp-auth-password=你的密钥
    set smtp-auth=login
    set ssl-verify=ignore
    set nss-config-dir=/root/.certs/

    然后我们验证一下 看看能不能发送email到自己的邮箱里

    输出一个

    可以看到我们收到邮件成功

     成功 !

     

    谢谢观看~   如有什么疑问的话可以加微信

    展开全文
  • Java 文件上传与下载、email

    万次阅读 2017-08-12 13:35:48
    1. 文件上传与下载 1.1 文件上传 文件上传,要点: 前台: 1. 提交方式:post 2. 表单中有文件上传的表单项: ”file” /> 3. 指定表单类型: 默认类型:enctype="application/x-www-form-urlencoded" 文件上传类型...
    1.
     文件上传与下载 
    

    1.1 文件上传

    文件上传,要点:

    前台:

    1. 提交方式:post

    2. 表单中有文件上传的表单项: <input type=”file” />

    3. 指定表单类型:

    默认类型:enctype="application/x-www-form-urlencoded"

    文件上传类型:multipart/form-data

    手动实现文件上传

    <body>

        <form name="frm_test" action="${pageContext.request.contextPath }/upload" method="post" enctype="multipart/form-data">

          用户名:<input type="text" name="userName">  <br/>

         文件:   <input type="file" name="file_img">   <br/>

        

         <input type="submit" value="注册">

         </form>

      </body>

     

     

    public class UploadServlet extends HttpServlet {

     

    public void doGet(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    /*

    request.getParameter(""); // GET/POST

    request.getQueryString(); // 获取GET提交的数据

    request.getInputStream(); // 获取post提交的数据   */

     

    /***********手动获取文件上传表单数据************/

     

    //1. 获取表单数据流

    InputStream in =  request.getInputStream();

    //2. 转换流

    InputStreamReader inStream = new InputStreamReader(in, "UTF-8");

    //3. 缓冲流

    BufferedReader reader = new BufferedReader(inStream);

    // 输出数据

    String str = null;

    while ((str = reader.readLine()) != null) {

    System.out.println(str);

    }

     

    // 关闭

    reader.close();

    inStream.close();

    in.close();

    }

    输出结果:

    ------WebKitFormBoundaryGoQviatB7iM1dhPr

    Content-Disposition: form-data; name="userName"       【FileItem

     

    Jack

    ------WebKitFormBoundaryGoQviatB7iM1dhPr

    Content-Disposition: form-data; name="file_img"; filename="reamde.txt"

    Content-Type: text/plain                                     【FileItem

     

     

    test!!!!!!!!!!!!!

    test!!!!!!!!!!!!!

    ------WebKitFormBoundaryGoQviatB7iM1dhPr--

     

    总结:

    最终获取数据,要对上面的结果进行解析!

    文件上传,在开发中经常用,每次都写解析程序!(工具类)

    也可以使用开源的文件上传组件-FileUpload组件!

     

     

     

    Apache提供的文件上传组件:FileUpload组件

    文件上传功能开发中比较常用,apache也提供了文件上传组件!

    FileUpload组件:

    1. 下载源码

    2. 项目中引入jar文件

    commons-fileupload-1.2.1.jar  【文件上传组件核心jar包】

    commons-io-1.4.jar     【封装了对文件处理的相关工具类】

     

     

     

    public class UploadServlet extends HttpServlet {

     

    // upload目录,保存上传的资源

    public void doGet(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

     

    /*********文件上传组件: 处理文件上传************/

     

     

    try {

    // 1. 文件上传工厂

    FileItemFactory factory = new DiskFileItemFactory();

    // 2. 创建文件上传核心工具类

    ServletFileUpload upload = new ServletFileUpload(factory);

     

    // 一、设置单个文件允许的最大的大小: 30M

    upload.setFileSizeMax(30*1024*1024);

    // 二、设置文件上传表单允许的总大小: 80M

    upload.setSizeMax(80*1024*1024);

    // 三、 设置上传表单文件名的编码

    // 相当于:request.setCharacterEncoding("UTF-8");

    upload.setHeaderEncoding("UTF-8");

     

     

    // 3. 判断: 当前表单是否为文件上传表单

    if (upload.isMultipartContent(request)){

    // 4. 把请求数据转换为一个个FileItem对象,再用集合封装

    List<FileItem> list = upload.parseRequest(request);

    // 遍历: 得到每一个上传的数据

    for (FileItem item: list){

    // 判断:普通文本数据

    if (item.isFormField()){

    // 普通文本数据

    String fieldName = item.getFieldName(); // 表单元素名称

    String content = item.getString(); // 表单元素名称, 对应的数据

    //item.getString("UTF-8");  指定编码

    System.out.println(fieldName + " " + content);

    }

    // 上传文件(文件流) ----> 上传到upload目录下

    else {

    // 普通文本数据

    String fieldName = item.getFieldName(); // 表单元素名称

    String name = item.getName(); // 文件名

    String content = item.getString(); // 表单元素名称, 对应的数据

    String type = item.getContentType(); // 文件类型

    InputStream in = item.getInputStream(); // 上传文件流

     

    /*

     *  四、文件名重名

     *  对于不同用户readme.txt文件,不希望覆盖!

     *  后台处理: 给用户添加一个唯一标记!

     */

    // a. 随机生成一个唯一标记

    String id = UUID.randomUUID().toString();

    // b. 与文件名拼接

    name = id +"#"+ name;

     

    // 获取上传基路径

    String path = getServletContext().getRealPath("/upload");

    // 创建目标文件

    File file = new File(path,name);

     

    // 工具类,文件上传

    item.write(file);

    item.delete();   //删除系统产生的临时文件

     

    System.out.println();

    }

     

    }

     

    }

    else {

    System.out.println("当前表单不是文件上传表单,处理失败!");

    }

    } catch (Exception e) {

    e.printStackTrace();

    }

     

     

    }

     

     

    文件上传与下载,完整案例:

    步骤:

    1. 文件上传

    2. 列表下载

     

     

     

    Index.jsp

    <body>

       <a href="${pageContext.request.contextPath }/upload.jsp">文件上传</a>    

       <a href="${pageContext.request.contextPath }/fileServlet?method=downList">文件下载</a> 

      

      </body>

    Upload.jsp

    <body>

        <form name="frm_test" action="${pageContext.request.contextPath }/fileServlet?method=upload" method="post" enctype="multipart/form-data">

          <%--<input type="hidden" name="method" value="upload">--%>

          

          用户名:<input type="text" name="userName">  <br/>

         文件:   <input type="file" name="file_img">   <br/>

        

         <input type="submit" value="提交">

         </form>

      </body>

    Downlist.jsp

    <body>

    <table border="1" align="center">

    <tr>

    <th>序号</th>

    <th>文件名</th>

    <th>操作</th>

    </tr>

    <c:forEach var="en" items="${requestScope.fileNames}" varStatus="vs">

    <tr>

    <td>${vs.count }</td>

    <td>${en.value }</td>

    <td>

    <%--<a href="${pageContext.request.contextPath }/fileServlet?method=down&..">下载</a>--%>

    <!-- 构建一个地址  -->

    <c:url var="url" value="fileServlet">

    <c:param name="method" value="down"></c:param>

    <c:param name="fileName" value="${en.key}"></c:param>

    </c:url>

    <!-- 使用上面地址 -->

    <a href="${url }">下载</a>

    </td>

    </tr>

    </c:forEach>

    </table>  

      </body>

    FileServlet.java

     

    /**

     * 处理文件上传与下载

     * @author Jie.Yuan

     *

     */

    public class FileServlet extends HttpServlet {

     

    public void doGet(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

     

    // 获取请求参数: 区分不同的操作类型

    String method = request.getParameter("method");

    if ("upload".equals(method)) {

    // 上传

    upload(request,response);

    }

     

    else if ("downList".equals(method)) {

    // 进入下载列表

    downList(request,response);

    }

     

    else if ("down".equals(method)) {

    // 下载

    down(request,response);

    }

    }

     

     

    /**

     * 1. 上传

     */

    private void upload(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

     

    try {

    // 1. 创建工厂对象

    FileItemFactory factory = new DiskFileItemFactory();

    // 2. 文件上传核心工具类

    ServletFileUpload upload = new ServletFileUpload(factory);

    // 设置大小限制参数

    upload.setFileSizeMax(10*1024*1024); // 单个文件大小限制

    upload.setSizeMax(50*1024*1024); // 总文件大小限制

    upload.setHeaderEncoding("UTF-8"); // 对中文文件编码处理

     

    // 判断

    if (upload.isMultipartContent(request)) {

    // 3. 把请求数据转换为list集合

    List<FileItem> list = upload.parseRequest(request);

    // 遍历

    for (FileItem item : list){

    // 判断:普通文本数据

    if (item.isFormField()){

    // 获取名称

    String name = item.getFieldName();

    // 获取值

    String value = item.getString();

    System.out.println(value);

    }

    // 文件表单项

    else {

    /******** 文件上传 ***********/

    // a. 获取文件名称

    String name = item.getName();

    // ----处理上传文件名重名问题----

    // a1. 先得到唯一标记

    String id = UUID.randomUUID().toString();

    // a2. 拼接文件名

    name = id + "#" + name;

     

    // b. 得到上传目录

    String basePath = getServletContext().getRealPath("/upload");

    // c. 创建要上传的文件对象

    File file = new File(basePath,name);

    // d. 上传

    item.write(file);

    item.delete();  // 删除组件运行时产生的临时文件

    }

    }

    }

    } catch (Exception e) {

    e.printStackTrace();

    }

     

     

    }

     

     

    /**

     * 2. 进入下载列表

     */

    private void downList(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

     

    // 实现思路:先获取upload目录下所有文件的文件名,再保存;跳转到down.jsp列表展示

     

    //1. 初始化map集合Map<包含唯一标记的文件名, 简短文件名>  ;

    Map<String,String> fileNames = new HashMap<String,String>();

     

    //2. 获取上传目录,及其下所有的文件的文件名

    String bathPath = getServletContext().getRealPath("/upload");

    // 目录

    File file = new File(bathPath);

    // 目录下,所有文件名

    String list[] = file.list();

    // 遍历,封装

    if (list != null && list.length > 0){

    for (int i=0; i<list.length; i++){

    // 全名

    String fileName = list[i];

    // 短名

    String shortName = fileName.substring(fileName.lastIndexOf("#")+1);

    // 封装

    fileNames.put(fileName, shortName);

    }

    }

     

    // 3. 保存到request

    request.setAttribute("fileNames", fileNames);

    // 4. 转发

    request.getRequestDispatcher("/downlist.jsp").forward(request, response);

     

    }

     

     

    /**

     *  3. 处理下载

     */

    private void down(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

     

    // 获取用户下载的文件名称(url地址后追加数据,get)

    String fileName = request.getParameter("fileName");

    fileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8");

     

    // 先获取上传目录路径

    String basePath = getServletContext().getRealPath("/upload");

    // 获取一个文件流

    InputStream in = new FileInputStream(new File(basePath,fileName));

     

    // 如果文件名是中文,需要进行url编码

    fileName = URLEncoder.encode(fileName, "UTF-8");

    // 设置下载的响应头

    response.setHeader("content-disposition", "attachment;fileName=" + fileName);

     

    // 获取response字节流

    OutputStream out = response.getOutputStream();

    byte[] b = new byte[1024];

    int len = -1;

    while ((len = in.read(b)) != -1){

    out.write(b, 0, len);

    }

    // 关闭

    out.close();

    in.close();

     

     

    }

     

    public void doPost(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    this.doGet(request, response);

    }

     

    }

     

     

     

     

     

     

     

     

    2. JavaMail邮件开发

    (api  + 配置)

     

    开发中,邮件的应用?

    -à 注册,填写生日;  后期系统会自动发送生日祝贺

    -à 发货,发货提醒!邮件提醒!

    邮件:

    1. 发邮件;【程序中如何发邮件!】

    2. 收邮件;【很多客户端工具, foxmail

     

     

    邮件开发准备:

    准备工作, 环境搭建:

    1. 本地搭建一个邮件服务器

      -à 易邮服务器,eyoumailserversetup.exe

    2. 新建邮箱账号

      张三给李四发邮件。

      步骤1

    新建域名: 工具, 服务器设置, 单域名框中输入 itcast.com

      步骤2

    新建邮箱账号:  zhangsan@itcast.com

                      lisi@itcast.com

    3. 安装foxmail

    配置邮件发送服务器(smtp):  localhost      25

            邮件接收服务器(pop3):  localhost     110

    再新建账号,就可以接收邮件了!

     

    邮件开发之普通邮件:

    JavaMail开发,先引入jar文件:

    activation.jar   【如果使用jdk1.6或以上版本,可以不用这个jar文件】

    mail.jar       【邮件发送核心包】

     

    /**

     * 1. 发送一封普通邮件

     * @author Jie.Yuan

     *

     */

    public class App_SendMail {

     

    @Test

    public void testSend() throws Exception {

     

    //0. 邮件参数

    Properties prop = new Properties();

    prop.put("mail.transport.protocol", "smtp"); // 指定协议

    prop.put("mail.smtp.host", "localhost"); // 主机   stmp.qq.com

    prop.put("mail.smtp.port", 25); // 端口

    prop.put("mail.smtp.auth", "true"); // 用户密码认证

    prop.put("mail.debug", "true"); // 调试模式

     

    //1. 创建一个邮件的会话

    Session session = Session.getDefaultInstance(prop);

    //2. 创建邮件体对象 (整封邮件对象)

    MimeMessage message = new MimeMessage(session);

    //3. 设置邮件体参数:

    //3.1 标题

    message.setSubject("我的第一封邮件 ");

    //3.2 邮件发送时间

    message.setSentDate(new Date());

    //3.3 发件人

    message.setSender(new InternetAddress("zhangsan@itcast.com"));

    //3.4 接收人

    message.setRecipient(RecipientType.TO, new InternetAddress("lisi@itcast.com"));

    //3.5内容

    message.setText("你好,已经发送成功!  正文....");  // 简单纯文本邮件

    message.saveChanges();   // 保存邮件(可选)

     

    //4. 发送

    Transport trans = session.getTransport();

    trans.connect("zhangsan", "888");

    // 发送邮件

    trans.sendMessage(message, message.getAllRecipients());

    trans.close();

    }

    }

     

     

    邮件开发之带图片

     

    /**

     * 带图片资源的邮件

     * @author Jie.Yuan

     *

     */

    public class App_2SendWithImg {

     

    // 初始化参数

    private static Properties prop;

    // 发件人

    private static InternetAddress sendMan = null;

    static {

    prop = new Properties();

    prop.put("mail.transport.protocol", "smtp"); // 指定协议

    prop.put("mail.smtp.host", "localhost"); // 主机   stmp.qq.com

    prop.put("mail.smtp.port", 25); // 端口

    prop.put("mail.smtp.auth", "true"); // 用户密码认证

    prop.put("mail.debug", "true"); // 调试模式

    try {

    sendMan = new InternetAddress("zhangsan@itcast.com");

    } catch (AddressException e) {

    throw new RuntimeException(e);

    }

    }

     

    @Test

    public void testSend() throws Exception {

    // 1. 创建邮件会话

    Session session = Session.getDefaultInstance(prop);

    // 2. 创建邮件对象

    MimeMessage message = new MimeMessage(session);

    // 3. 设置参数:标题、发件人、收件人、发送时间、内容

    message.setSubject("带图片邮件");

    message.setSender(sendMan);

    message.setRecipient(RecipientType.TO, new InternetAddress("lisi@itcast.com"));

    message.setSentDate(new Date());

     

    /***************设置邮件内容: 多功能用户邮件 (related)*******************/

    // 4.1 构建一个多功能邮件块

    MimeMultipart related = new MimeMultipart("related");

    // 4.2 构建多功能邮件块内容 = 左侧文本 + 右侧图片资源

    MimeBodyPart content = new MimeBodyPart();

    MimeBodyPart resource = new MimeBodyPart();

     

    // 设置具体内容: a.资源(图片)

    String filePath = App_2SendWithImg.class.getResource("8.jpg").getPath();

    DataSource ds = new FileDataSource(new File(filePath));

    DataHandler handler = new DataHandler(ds);

    resource.setDataHandler(handler);

    resource.setContentID("8.jpg");   // 设置资源名称,给外键引用

     

    // 设置具体内容: b.文本

    content.setContent("<img src='cid:8.jpg'/>  好哈哈!", "text/html;charset=UTF-8");

     

    related.addBodyPart(content);

    related.addBodyPart(resource);

     

    /*******4.3 把构建的复杂邮件快,添加到邮件中********/

    message.setContent(related);

     

     

    // 5. 发送

    Transport trans = session.getTransport();

    trans.connect("zhangsan", "888");

    trans.sendMessage(message, message.getAllRecipients());

    trans.close();

    }

    }

     

     

     

    邮件开发之带图片 + 附件

     

    /**

     * 3. 带图片资源以及附件的邮件

     * @author Jie.Yuan

     *

     */

    public class App_3ImgAndAtta {

     

    // 初始化参数

    private static Properties prop;

    // 发件人

    private static InternetAddress sendMan = null;

    static {

    prop = new Properties();

    prop.put("mail.transport.protocol", "smtp"); // 指定协议

    prop.put("mail.smtp.host", "localhost"); // 主机   stmp.qq.com

    prop.put("mail.smtp.port", 25); // 端口

    prop.put("mail.smtp.auth", "true"); // 用户密码认证

    prop.put("mail.debug", "true"); // 调试模式

    try {

    sendMan = new InternetAddress("zhangsan@itcast.com");

    } catch (AddressException e) {

    throw new RuntimeException(e);

    }

    }

     

    @Test

    public void testSend() throws Exception {

    // 1. 创建邮件会话

    Session session = Session.getDefaultInstance(prop);

    // 2. 创建邮件对象

    MimeMessage message = new MimeMessage(session);

    // 3. 设置参数:标题、发件人、收件人、发送时间、内容

    message.setSubject("带图片邮件");

    message.setSender(sendMan);

    message.setRecipient(RecipientType.TO, new InternetAddress("lisi@itcast.com"));

    message.setSentDate(new Date());

     

    /*

     * 带附件(图片)邮件开发

     */

    // 构建一个总的邮件块

    MimeMultipart mixed = new MimeMultipart("mixed");

    // ---> 总邮件快,设置到邮件对象中

    message.setContent(mixed);

    // 左侧: (文本+图片资源)

    MimeBodyPart left = new MimeBodyPart();

    // 右侧: 附件

    MimeBodyPart right = new MimeBodyPart();

    // 设置到总邮件块

    mixed.addBodyPart(left);

    mixed.addBodyPart(right);

     

    /******附件********/

    String attr_path = this.getClass().getResource("a.docx").getPath();

    DataSource attr_ds = new FileDataSource(new File(attr_path));

    DataHandler attr_handler = new DataHandler(attr_ds);

    right.setDataHandler(attr_handler);

    right.setFileName("a.docx");

     

     

    /***************设置邮件内容: 多功能用户邮件 (related)*******************/

    // 4.1 构建一个多功能邮件块

    MimeMultipart related = new MimeMultipart("related");

    // ----> 设置到总邮件快的左侧中

    left.setContent(related);

     

    // 4.2 构建多功能邮件块内容 = 左侧文本 + 右侧图片资源

    MimeBodyPart content = new MimeBodyPart();

    MimeBodyPart resource = new MimeBodyPart();

     

    // 设置具体内容: a.资源(图片)

    String filePath = App_3ImgAndAtta.class.getResource("8.jpg").getPath();

    DataSource ds = new FileDataSource(new File(filePath));

    DataHandler handler = new DataHandler(ds);

    resource.setDataHandler(handler);

    resource.setContentID("8.jpg");   // 设置资源名称,给外键引用

     

    // 设置具体内容: b.文本

    content.setContent("<img src='cid:8.jpg'/>  好哈哈!", "text/html;charset=UTF-8");

     

    related.addBodyPart(content);

    related.addBodyPart(resource);

     

     

     

    // 5. 发送

    Transport trans = session.getTransport();

    trans.connect("zhangsan", "888");

    trans.sendMessage(message, message.getAllRecipients());

    trans.close();

    }

    }

     

     

     

    3. 注意

    Java project

    如果是web项目,因为javaee自带的有邮件功能,可能存在问题!

    我们要用自己的mail.jar文件功能!  需要删除javaeemail!

    展开全文
  • 本文实例讲述了CodeIgniter基于Email邮件的方法。分享给大家供大家参考,具体如下: CodeIgniter拥有功能强大的Email类。以下为利用其发送邮件的代码。 关于CI的Email类的详情请参考:...
  • java中email邮件发送接受和处理excel文件(xls)实例 实现2种功能的例子。值得一看
  • python邮件详解,smtplib和email模块详解

    万次阅读 多人点赞 2018-09-06 18:20:56
    在介绍具体的实现python邮件的具体操作之前,我觉得有必要介绍下SMTP,更有助于理解python邮件的实现原理。SMTP协议属于TCP/IP协议簇,即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它...

    在介绍具体的实现python发邮件的具体操作之前,我觉得有必要介绍下SMTP,更有助于理解python发邮件的实现原理。SMTP协议属于TCP/IP协议簇,即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式,python实现发邮件也是基于此基础上进行封装的。

    1.python发邮件所需要的基础包

    python发送邮件需要用到python自带的两个模块,smtplib和email。直接import导入,无需下载。
    python的smtplib提供了一种很方便的途径发送电子邮件,它对smtp协议进行了简单的封装。

    2.smtplib的用法

    smtplib用法相对来说很简单,就是分为两步。

    • 创建SMTP的操作对象并连接smtp目标服务器,可以是163、QQ等
    • 根据自己的账号登录目标服务器(自己的邮箱地址和邮箱授权码)
    • 调用对象中的方法,发送邮件到目标地址

    python与smtp服务器之间的具体交互的通用代码:

    import smtplib
    server = smtplib.SMTP(mailserver, port)  # 发件人邮箱中的SMTP服务器,端口是25
    server.login(sender, passwd)  # 发件人邮箱账号、邮箱授权码
    # msg.as_string()中as_string()是将msg(MIMEText或MIMEMultipart对象)变为str。
    server.sendmail(sender, receive, msg.as_string())  
    server.quit()

    具体的python连接目标服务器的代码如下:注:本文章用的是qq的smtp服务器。
    常用邮箱的smtp服务器地址:
    新浪邮箱:smtp.sina.com,搜狐邮箱:smtp.sohu.com,qq邮箱:smtp.qq.com

    sender_maile='80617252@qq.com' # 发送方的邮箱地址
    sender_pass = 'lsjdfsljdfk' # 邮箱提供的授权码,可在第三方登录,我这个是随便打的。
    sftp_obj =smtplib.SMTP('smtp.qq.com', 25)
    sftp_obj.login(sender_mail, sender_pass)
    #三个参数分别是:发件人邮箱账号,收件人邮箱账号,发送的邮件体
    sftp_obj.sendmail(sender_mail, receiver_mail, msg_root.as_string())
    sftp_obj.quit()
    3.email模块的详细理解和使用

    email模块下的mime模块下有常用的三个模块,三个模块中有三个大类。其实就是下边这三个了,说的很绕,下边为导入方式,一目了然。

    from email.mime.text import MIMEText    
    from email.mime.image import MIMEImage
    from email.mime.multipart import MIMEMultipart    

    简单说下他们的关系,如果构造一个MIMEText对象,就表示一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片对象,要把多个对象组合起来,就用MIMEMultipart对象,他代表的是整个邮件。这样说应该还不是很清晰,下边就分开来说,最后会总的总结,在最后边就是完整的代码(可以发送一切内容的代码)。

    A.MIMEText对象中有三个需要我们设置的参数,一个是正文内容,一个是正文内容的类型,例如:”text/plain”和”text/html”,一个是正文内容的编码。

    构造普通文本:

    text_info = 'hello world '
    text_sub = MIMEText(text_info,'plain', 'utf-8')  

    构造超文本:

    url = "https://blog.csdn.net/chinesepython"
    html_info = """
        <p>点击以下链接,你会去向一个更大的世界</p>
        <p><a href="%s">click me</a></p>
        <p>i am very glasses for you</p>
        """ % url
    html_sub = MIMEText(html_info, 'html', 'utf-8')  
    # 如果不加下边这行代码的话,上边的文本是不会正常显示的,会把超文本的内容当做文本显示
    html_sub["Content-Disposition"] = 'attachment; filename="csdn.html"'

    构造base64数据流,用于发送文件的时候使用,构造附件代码:

    txt_file = open(r'D:\python_files\files\hello_world.txt', 'rb').read()
    txt = MIMEText(txt_file, 'base64', 'utf-8')
    txt["Content-Type"] = 'application/octet-stream'
    # 命名发送的附件
    txt.add_header('Content-Disposition', 'attachment', filename='hello_world.txt')
    B.MIMEImage对象中只需要把读取的文件传入就行

    构造图片:

    image_file = open(r'D:\python_files\images\test.png', 'rb').read()
    image = MIMEImage(image_file)
    image.add_header('Content-ID', '<image1>')
    # 命名发送的图片
    image["Content-Disposition"] = 'attachment; filename="red_people.png"'
    C.MIMEMultipart对象创建的类型有三种,此模块主要是通过attach方法把上边构造的内容传入到邮件的整体内容中。
    • 邮件类型为”multipart/alternative”的邮件正文中包括纯文本正文(text/plain)和超文本正文(text/html)。
    • 邮件类型为”multipart/related”的邮件正文中包括图片,声音等内嵌资源。
    • 邮件类型为”multipart/mixed”的邮件包含附件,图片,文本等都可以添加,所以发的内容多的话一般是用这个的,选择mixed类型,什么内容都可以发。
    3.邮件头添加内容

    直接上示例代码:

    from email.mime.multipart import MIMEMultipart
    
    
    msg_root = MIMEMultipart('mixed')
    # 发件人
    msg_root['From'] = 'aaa@qq.com<aaa@qq.com>'
    # 收件人
    msg_root['To'] = '666666@qq.com'
    # 邮件主题
    subject = 'python sendemail test successful'
    msg_root['subject'] = Header(subject, 'utf-8')
    
    4.特别的用法说明:

    注:以下的msg_root为:
    msg_root = MIMEMultipart(‘mixed’)

    msg_root.as_string()是将msg_root对象变为str。
    msg_root.attach(MIMEText或者MIMEImage对象),因为MIMEMultipart对象代表邮件本身,其他连个是代表邮件正文,所以这个方法还是很强大的,把其他的构造内容添加到MIMEMultipart对象中就可以把文本,html,附件等一起发送了。

    5.发送各种内容的具体代码实现:

    所有代码合到一块,发送文本,html,图片,txt内容,用的时候你可以把需要的部分摘出来,也就是把没有加入到msg_root的对象拿出来,直接通过下边命令发送,例如只发送文本。
    sftp_obj.sendmail(sender_mail, receiver_mail, text_sub.as_string())。

    import smtplib
    from email.header import Header
    from email.mime.text import MIMEText
    from email.mime.image import MIMEImage
    from email.mime.multipart import MIMEMultipart
    
    
    def send_email_by_qq(to):
        sender_mail = '80617252@qq.com'
        sender_pass = 'aljflsjdf'#同样是乱打的
    
        # 设置总的邮件体对象,对象类型为mixed
        msg_root = MIMEMultipart('mixed')
        # 邮件添加的头尾信息等
        msg_root['From'] = '80617252@qq.com<80617252@qq.com>'
        msg_root['To'] = to
        # 邮件的主题,显示在接收邮件的预览页面
        subject = 'python sendemail test successful'
        msg_root['subject'] = Header(subject, 'utf-8')
    
        # 构造文本内容
        text_info = 'hello world'
        text_sub = MIMEText(text_info, 'plain', 'utf-8')
        msg_root.attach(text_sub)
    
        # 构造超文本
        url = "https://blog.csdn.net/chinesepython"
        html_info = """
        <p>点击以下链接,你会去向一个更大的世界</p>
        <p><a href="%s">click me</a></p>
        <p>i am very galsses for you</p>
        """% url
        html_sub = MIMEText(html_info, 'html', 'utf-8')
        # 如果不加下边这行代码的话,上边的文本是不会正常显示的,会把超文本的内容当做文本显示
        html_sub["Content-Disposition"] = 'attachment; filename="csdn.html"'   
        # 把构造的内容写到邮件体中
        msg_root.attach(html_sub)
    
        # 构造图片
        image_file = open(r'D:\python_files\images\test.png', 'rb').read()
        image = MIMEImage(image_file)
        image.add_header('Content-ID', '<image1>')
        # 如果不加下边这行代码的话,会在收件方方面显示乱码的bin文件,下载之后也不能正常打开
        image["Content-Disposition"] = 'attachment; filename="red_people.png"'
        msg_root.attach(image)
    
        # 构造附件
        txt_file = open(r'D:\python_files\files\hello_world.txt', 'rb').read()
        txt = MIMEText(txt_file, 'base64', 'utf-8')
        txt["Content-Type"] = 'application/octet-stream'
        #以下代码可以重命名附件为hello_world.txt  
        txt.add_header('Content-Disposition', 'attachment', filename='hello_world.txt')
        msg_root.attach(txt)
    
        try:
            sftp_obj =smtplib.SMTP('smtp.qq.com', 25)
            sftp_obj.login(sender_mail, sender_pass)
            sftp_obj.sendmail(sender_mail, to, msg_root.as_string())
            sftp_obj.quit()
            print('sendemail successful!')
    
        except Exception as e:
            print('sendemail failed next is the reason')
            print(e)
    
    
    if __name__ == '__main__':
        # 可以是一个列表,支持多个邮件地址同时发送,测试改成自己的邮箱地址
        to = '666666@qq.com'
        send_email_by_qq(to)
    6.总结

    为了让不是很理解发邮件的朋友能更好的理解,在这里是把所有的参数都写死了,比如说发送文件的具体内容,在真正开发使用过程中,可以把具体的内容通过预留出来参数去传入之后发送你想要发送的内容。
    发邮件功能还是很实用的,在真正的开发中或者大多数场合都能用到,比如说项目中一个重要的模块如果出问题了,你需要第一时间知道,就可以加入这个功能,把项目出问题报的具体内容发到你的邮箱,也可以第一时间想下处理的对策。
    下面以我通过此程序发送的邮件内容的截图做结尾吧。
    这里写图片描述

    展开全文
  • python2.7 解决email中foxmail for mac 收到附件无后缀,无件人,漏掉邮件内容问题:https://blog.csdn.net/SHSQLDLL/article/details/86700029 一、附件无后缀的问题 #之前写的发送附件时(在windows的foxmail...
  • 通过Email推送统计报告。一般除了要求将PPT报告文件作为附件发给用户,同时希望将报告内容在邮件中直观展示。 一份统计报告中经常包含柱状图、饼图、好看的图表,这些信息要直接在Email中展示比较复杂。本文推荐一种...
  • 使用GO操作excel文件并发送email

    千次阅读 2017-05-28 13:38:42
    原文链接:http://studygolang.com/articles/9154... xlsx文件内容格式: 获取excel文件内容,使用第三方库:github.com/tealeg/xlsx 代码: package mainimport ( "fmt" "github.com/tealeg/xlsx" "log" )func m
  • Java Exchange企业邮件服务器 发Email

    千次阅读 2016-07-24 20:39:23
    java配置文件的路径为java运行环境下的当前路径+properties.txt(配置文件名)。 配置文件properties.txt,保存邮件的基本信息,可供用户根据相应的需求更改发送邮件的信息。外部接口。 java读取磁盘文件函数 ...
  • 利用CodeIgniter中的Email邮件

    万次阅读 2012-04-03 12:39:04
    CodeIgniter拥有功能强大的Email类。以下为利用其发送邮件的代码。 关于CI的Email类的详情请参考:...文件路径为/application/controllers/welcome.php ( ! defined('BASEPATH')) e
  • 邮件 In App Email (实例)

    千次阅读 2012-04-01 09:30:31
    In App Email In this tutorial i will be showing you how to directly email from your app Features:   1 Round Rect Button  In app emailing is a great feature for any developer and can be used to...
  • 用commons-email-1.1.jar实现邮件功能: 今天在Apache网站上下载commons-lang jar文件时突然看到commons-email-1.1.jar这个项目jar文件,看了看user guide确实比JDK提供的好多了,简单的几行代码就实现了邮件的...
  • 软件已测试,好用 电子邮件逐个是基于SMTP服务,一对一传递Email的软件。...电子邮件逐个依赖于配置好的发送邮箱去投递Email,只有你设置的发送邮箱性能足够好,投递出去的Email数量也就会足够多。
  • linux发送email

    2011-07-27 23:16:38
    linux email
  • 因为我们发Email的时候一个To(发给:)就足够了,今天好不容易有点耐心查了一下,原来里面还有不少学问呢。 抄送的英文缩写为CC,来源于Carbon Copy,在使用手动机械打字机时代,采用复写纸,同样一份文件可以一次...
  • An attempt was made to send an email when no email session has been established,SSIS用sql2008邮件失败
  • @羲凡——只为了更好的活着 Scala邮件 在有些spark任务执行完后需要通知我们该任务已经执行结束,邮件到某个邮箱是最直接的方式。那如何用scala邮件呢,我在网上...import play.api.libs.mailer.{Email, SMTP...
  • -------------------邮件处理发送代码段 -------------------//读取文本文件中的邮件(文本文件中邮件地址按照一行一个存放) private string EmailListRead() { StreamReader SR = new StreamReader("Ema
  • //(***此处邮箱必须和件人一致***) transport.connect( "smtp.qq.com" , "xxx@qq.com" , "password" ); //发送邮件 transport.sendMessage(msg, msg.getAllRecipients()); transport.close(); } ...
  • 免费的午餐——编程利用Google日历API短信、Email Google日历是相当优秀的日程管理工具,可以方便的组织、分享各类日程,Google还提供了贴心而免费的手机短信、Email提示功能,真是非常的赞。 此外Google还...
  • 文件的最后加入如下代码,本例中使用的是腾讯企业邮箱 gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = "smtp.exmail.qq.com" gitlab_rails['smtp_port'] = 465 gitlab_rails['...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 66,732
精华内容 26,692
关键字:

如何发email文件