使用Java自带的mail API实现邮件发送功能全过程

目录
  • 需求:
  • 以下代码即可发送邮件,以qq邮箱为例
  • 证书生成步骤:
  • 总结

需求:

邮件发送 使用jdk源生API——java.mail实现发邮件功能

(当然也有第三方工具,封装源码也十分抢眼,不做太多分享,可在csdn上自行查找)

以下代码即可发送邮件,以qq邮箱为例

package com.example.demo.emailInfo;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;
import java.util.*;

public class SendEmailInfo {
    public static void main(String[] args) throws MessagingException, UnsupportedEncodingException {

        String smtpServer = "smtp.qq.com";
        String username = "939089358@qq.com";
        //这里是你开通smtp协议的授权码,若是公司自定义服务器,可无需授权码,但需要配置证书,文章后面有详解
        String password = "***********";
        String receiver = "939089358@qq.com";
        String receiver2 = "低调AI实验室@126.com";

        //这里的配置可以自己抽取成工具
        Properties properties = new Properties();
        Map<String, Object> map = new HashMap<>();

        //常用smtp使用配置,可以在其他文章中获取:这里针对使用qq发送邮件
        map.put("mail.transport.protocol","smtp");
        map.put("mail.smtp.host",smtpServer);
        map.put("mail.smtp.auth","true");
        map.put("mail.smtp.port","465");
        map.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
        map.put("mail.smtp.socketFactory.fallback",false);
        map.put("mail.smtp.socketFactory.port","465");
        map.put("mail.smtp.starttls.enable","true");
        properties.putAll(map);

        //创建会话对象,用户邮件和服务器的交互
        Session session = Session.getDefaultInstance(properties);
//        session.setDebug(true); //查看发送邮件的log

        //创建一邮件
        MimeMessage message = new MimeMessage(session);
        InternetAddress senderAddress = new InternetAddress(username,"设置自定义发件人名称","UTF-8");
        message.setFrom(senderAddress);
        message.setRecipient(Message.RecipientType.TO,new InternetAddress(receiver,"收件人自定义名称","UTF-8"));

        message.setSubject("设置发送的主题:比如:邀请函","UTF-8");
        message.setContent("内容:邀请你和我一起约会,在屋顶吹晚风,看星星,吃水果","text/html;charset=UTF-8");
        message.setSentDate(new Date());
        message.saveChanges();

        //用session 获取传输对象,然后连接发件人
        Transport transport = session.getTransport();
        transport.connect(username,password);
        transport.sendMessage(message,message.getAllRecipients());
        transport.close();
        System.out.println("发送成功");
    }
}

若要使用企业内部自搭服务器,则需要在jdk文件中配置一个授权证书,操作如下:

/*
 * Copyright 2006 Sun Microsystems, Inc.  All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Sun Microsystems nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

import java.io.*;
import java.net.URL;

import java.security.*;
import java.security.cert.*;

import javax.net.ssl.*;

public class InstallCert {

    public static void main(String[] args) throws Exception {
    String host;
    int port;
    char[] passphrase;
    if ((args.length == 1) || (args.length == 2)) {
        String[] c = args[0].split(":");
        host = c[0];
        port = (c.length == 1) ? 443 : Integer.parseInt(c[1]);
        String p = (args.length == 1) ? "changeit" : args[1];
        passphrase = p.toCharArray();
    } else {
        System.out.println("Usage: java InstallCert <host>[:port] [passphrase]");
        return;
    }

    File file = new File("jssecacerts");
    if (file.isFile() == false) {
        char SEP = File.separatorChar;
        File dir = new File(System.getProperty("java.home") + SEP
            + "lib" + SEP + "security");
        file = new File(dir, "jssecacerts");
        if (file.isFile() == false) {
        file = new File(dir, "cacerts");
        }
    }
    System.out.println("Loading KeyStore " + file + "...");
    InputStream in = new FileInputStream(file);
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
    ks.load(in, passphrase);
    in.close();

    SSLContext context = SSLContext.getInstance("TLS");
    TrustManagerFactory tmf =
        TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(ks);
    X509TrustManager defaultTrustManager = (X509TrustManager)tmf.getTrustManagers()[0];
    SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
    context.init(null, new TrustManager[] {tm}, null);
    SSLSocketFactory factory = context.getSocketFactory();

    System.out.println("Opening connection to " + host + ":" + port + "...");
    SSLSocket socket = (SSLSocket)factory.createSocket(host, port);
    socket.setSoTimeout(10000);
    try {
        System.out.println("Starting SSL handshake...");
        socket.startHandshake();
        socket.close();
        System.out.println();
        System.out.println("No errors, certificate is already trusted");
    } catch (SSLException e) {
        System.out.println();
        e.printStackTrace(System.out);
    }

    X509Certificate[] chain = tm.chain;
    if (chain == null) {
        System.out.println("Could not obtain server certificate chain");
        return;
    }

    BufferedReader reader =
        new BufferedReader(new InputStreamReader(System.in));

    System.out.println();
    System.out.println("Server sent " + chain.length + " certificate(s):");
    System.out.println();
    MessageDigest sha1 = MessageDigest.getInstance("SHA1");
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    for (int i = 0; i < chain.length; i++) {
        X509Certificate cert = chain[i];
        System.out.println
            (" " + (i + 1) + " Subject " + cert.getSubjectDN());
        System.out.println("   Issuer  " + cert.getIssuerDN());
        sha1.update(cert.getEncoded());
        System.out.println("   sha1    " + toHexString(sha1.digest()));
        md5.update(cert.getEncoded());
        System.out.println("   md5     " + toHexString(md5.digest()));
        System.out.println();
    }

    System.out.println("Enter certificate to add to trusted keystore or 'q' to quit: [1]");
    String line = reader.readLine().trim();
    int k;
    try {
        k = (line.length() == 0) ? 0 : Integer.parseInt(line) - 1;
    } catch (NumberFormatException e) {
        System.out.println("KeyStore not changed");
        return;
    }

    X509Certificate cert = chain[k];
    String alias = host + "-" + (k + 1);
    ks.setCertificateEntry(alias, cert);

    OutputStream out = new FileOutputStream("jssecacerts");
    ks.store(out, passphrase);
    out.close();

    System.out.println();
    System.out.println(cert);
    System.out.println();
    System.out.println
        ("Added certificate to keystore 'jssecacerts' using alias '"
        + alias + "'");
    }

    private static final char[] HEXDIGITS = "0123456789abcdef".toCharArray();

    private static String toHexString(byte[] bytes) {
    StringBuilder sb = new StringBuilder(bytes.length * 3);
    for (int b : bytes) {
        b &= 0xff;
        sb.append(HEXDIGITS[b >> 4]);
        sb.append(HEXDIGITS[b & 15]);
        sb.append(' ');
    }
    return sb.toString();
    }

    private static class SavingTrustManager implements X509TrustManager {

    private final X509TrustManager tm;
    private X509Certificate[] chain;

    SavingTrustManager(X509TrustManager tm) {
        this.tm = tm;
    }

    public X509Certificate[] getAcceptedIssuers() {
        throw new UnsupportedOperationException();
    }

    public void checkClientTrusted(X509Certificate[] chain, String authType)
        throws CertificateException {
        throw new UnsupportedOperationException();
    }

    public void checkServerTrusted(X509Certificate[] chain, String authType)
        throws CertificateException {
        this.chain = chain;
        tm.checkServerTrusted(chain, authType);
    }
    }

}

证书生成步骤:

1、完整复制以上Java代码,放到桌面上新建了一个跟类名相同的.java文件,并放入新建文件夹中

2、cmd打开命令窗口,编译:javac InstallCert.java文件

3、运行:java InstallCert Java请求出错的站点URL

即自行搭建的服务器域名:例如:smtp.AIRow.com

4、然后输入1退出。

5、检查桌面,会生成一个jssecacerts的文件,把该文件设置到你的JDK下的/jre/lib/security目录下即可

6、若要上线功能,需要运维添加并导入证书。

7、若不使用企业或个人自搭服务器发送邮件,则无需配置证书。

总结

到此这篇关于使用Java自带的mail API实现邮件发送功能的文章就介绍到这了,更多相关Java mail API实现邮件发送内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java实现发送邮件功能

    前言 前段时间做一个紧急的功能,其中有部分需求是需要发邮件通知:通过查阅以及实验,很快的写了个发送邮件的功能:现在整理一下记录下来. 发送邮件 一.在pom中引入相关依赖 <dependency> <groupId>javax.mail</groupId> <artifactId>javax.mail-api</artifactId> <version>1.5.6</version> </dependency>

  • java 发送邮件的实例代码(可移植)

    以一个web项目为例,代码是可以移植的 首先要导入mail.jar包,然后创建自己的类 1:HTMLSender类 复制代码 代码如下: package com.txq.mail; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.NoSuchProviderException; import javax.mail.Sess

  • liunx肉鸡上建立VPN的图文方法

    花了两天时间研究,感觉pptpd貌似要简单的多,而且成功率挺高.没有平台限制.此文就拿centos最新版5.2来做vpn服务器.为教材,其他发行版都大同小异. 第一步,把需要的工具先wget上去.          wget http://poptop.sourceforge.net/yum/stable/packages/dkms-2.0.17.5-1.noarch.rpm          wget http://poptop.sourceforge.net/yum/stable/packa

  • java发送邮件示例讲解

    本文实例讲解了java发邮件的详细过程,供大家参考,具体内容如下 1.邮件协议 发邮件的:SMTP (Simple Mail Transport  Protocal) 收邮件的协议:pop3 (Post Office Protocal 3) IMAP 新协议 发邮件也可以收邮件. (一步步的与服务器交互) SMTP : 2.收发邮件的过程: 一般情况下,smtp和pop3是两个服务器(主机). Smtp邮件的端口为25. POP3 端口 为110. 发邮件示例 1).安装foxmail: 2).

  • Java实现发送邮件功能时碰到的坑

    之前用163邮箱发邮件时明明是成功的,但是使用中国移动自己的邮箱时,无论如何在linux服务器中都发送不成功,一开始报如下错误: javax.mail.MessagingException: Unknown SMTP host: mail.chinamobilesz.com at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1959) ~ [mail-1.4.7.jar:1.4.7] at com.sun.mail.

  • java发送邮件的具体实现

    首先是继承自javax.mail.Authenticator的一个具体类.getPasswordAuthentication()方法也就是构建一个PasswordAuthentication对象并返回,有点费解JAVA Mail这样的设计意图,可能javax.mail.Authenticator为我们提供了附加的保证安全的验证措施吧. 复制代码 代码如下: package com.mzule.simplemail; import javax.mail.Authenticator;import j

  • 使用Java自带的mail API实现邮件发送功能全过程

    目录 需求: 以下代码即可发送邮件,以qq邮箱为例 证书生成步骤: 总结 需求: 邮件发送 使用jdk源生API——java.mail实现发邮件功能 (当然也有第三方工具,封装源码也十分抢眼,不做太多分享,可在csdn上自行查找) 以下代码即可发送邮件,以qq邮箱为例 package com.example.demo.emailInfo; import javax.mail.Message; import javax.mail.MessagingException; import javax.m

  • 深入Lumisoft.NET组件与.NET API实现邮件发送功能的对比分析

    我在另一篇文章<深入Lumisoft.NET实现邮件发送功能的方法详解>有大致对这个Lumisoft.NET组件的使用进行了介绍,当然Lumisoft.NET组件除了提供邮件发送功能外,还提供了邮件接收等功能的处理(包括基于POP3协议和IMAP协议),而.NET则除了提供SMTP协议功能外,则没有提供POP3协议处理的相关类库,因此收取邮件这需要自己进行封装(需要也可以参考codeproject.com上的相关文章). 1..NET的邮件发送功能实现.NET本身封装了一个SmtpClient

  • 使用Spring的JAVA Mail支持简化邮件发送功能

    闲来无事,翻看<Spring in Action>,发现Spring集成了对JAVA Mail的支持,有点小激动的看了一遍,嗯,话说真的简单了很多. Spring的邮件发送的核心是MailSender接口,在Spring3.0中提供了一个实现类JavaMailSenderImpl,这个类是发送邮件的核心类.可以通过在配置文件中配置使用,当然也可以自己硬编码到代码中(方便起见,下面的演示代码都是硬编码到代码中,省得配置麻烦). Spring提供的邮件发送不仅支持简单邮件的发送.添加附件,而且还可

  • PHP使用pear自带的mail类库发邮件的方法

    本文实例讲述了PHP使用pear自带的mail类库发邮件的方法.分享给大家供大家参考.具体如下: 这里用pear自带的mail类库发邮件,可以用pear install 命令来安装对应的库 body = "<a href='http://www.baidu.com/' target='_blank'>点我重新生成密码</a>"; sendMail_smtp("xxxxxxxx@qq.com",'测试',$body); function sen

  • Java实现带附件的邮件发送功能

    本文实例为大家分享了Java实现邮件发送功能的具体代码,供大家参考,具体内容如下 1.需要导入mail.jar.activation.jar这两个邮件发送的jar包,可在网上搜索并下载 2.需要设置相关邮箱服务器,我用的是QQ邮箱,操作如下所示:开启相关服务,并生产授权码(这个代码中会用到). 代码如下所示: package com.ecg.controller; import java.io.UnsupportedEncodingException; import java.security.

  • Java实现邮件发送功能

    Java实现邮件发送的具体代码,供大家参考,具体内容如下 一.邮件服务器与传输协议 要在网络上实现邮件功能,必须要有专门的邮件服务器.这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中. SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com. SMTP协议 通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器). POP3协议 通

  • Android实现带附件的邮件发送功能

    本文实例讲解了基于基于JMail实现Android邮件发送功能,分享给大家供大家参考,具体内容如下 在android上发送邮件方式: 第一种:借助GMail APP客户端,缺点是必须使用GMail帐号,有一点是比较方便,不需要写很多代码,但是不是很灵活. 第二种:基于JMail实现,可以很灵活的自己设置各种属性,不需要GMail帐号 在第二种方式的实现之前,看一下JMail对EMail结构的划分: 基于SMTP协议发送EMail,所以客户端必须要知道SMTP的主机. 腾讯邮件的SMTP主机为:s

  • springboot整合mail实现邮箱的发送功能

    第一步添加mail的依赖 <!--引入mail的依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 第二步编写邮箱的 yml配置文件 spring: #邮箱配置 mail: host: smtp.qq.com userna

  • C#使用System.Net.Mail类实现邮件发送

    有些 SMTP 服务器要求在代表客户端发送电子邮件前验证客户端的身份.当此 SmtpClient 对象应该使用当前登录用户的默认凭据进行身份验证(如果服务器要求)时,请将此属性设置为 true.对于客户端应用程序,这是在大多数情况下都需要的行为.也可以使用应用程序和计算机配置文件指定凭据信息.有关更多信息,请参见 <mailSettings> 元素(网络设置). 如果 UseDefaultCredentials 属性设置为 false,则连接到服务器时会将 Credentials 属性中设置的

  • Java实现简单邮件发送功能

    本文实例为大家分享了Java实现简单邮件发送的具体代码,供大家参考,具体内容如下 需要的jar包: activation-1.1.1.jar mail-1.4.7.jar QQ邮箱设置开启POP3/SMTP服务,并获得授权码 java实现简单邮件发送 import com.sun.mail.util.MailSSLSocketFactory; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax

随机推荐