用JAVA实现emile邮件的发送

    邮件的发送在我们的日常生活中不可或缺,通常情况下我们发送邮件都是直接用网页版的官网,今天主要讲讲如何用JAVA通过编程实现Emile邮件的发送。

1. 准备工作

由于JDK没有给我们提供相应的类,所有我们需要去下载一个JavaMail相关的依赖包

javax.mail-1.6.2.jar

加入至当前项目中。

2.电子邮件的发送过程

      电子邮件写好之后,发送到邮件服务器中,通过若干个邮件服务器,最终通过对方的邮件服务器,发送到对方的邮箱APP中。

    其中我们需要了解网络中的邮件协议,常见的邮箱协议有POP3, SMTP, IMAP 等,我们用Java发送邮件的时候,主要需要了解SMTP协议。

    SMTP协议:SMTP全称是“Simple Mail TRansfer Protocol” , 即简单邮件传输协议,它是一组用于从源地址到目的地传输邮件的规范,通过它来控制邮件的中转方式,它帮助每台计算机在发送或者中转信件时找到下一个目的地。SMTP服务器就是通过SMTP协议发送邮件服务器。

  SMTP认证,简单来说就是要求必须提供用户账号和密码之后才可以登录SMTP服务器,避免了垃圾邮件的有效传播。

 相关协议的端口:(我们以126邮箱的服务器为例)

  服务器名称服务器地址   SSL协议端口 SSL协议端口
IMAPimap.126.com993143
SMTPsmtp.126.com465/99425
POP3pop.126.com995110

3.一对一发送邮件

   在了解到SMTP协议,以及成功导入相关的jar包后,接下来正式进入程序的编写过程。首先我们明确一点,我们是在用自己的126邮箱去给某一个用户发送邮件

(1)准备SMTP登录信息,单独去创建一个类,然后再主程序通过类名去中调用Session,获取Session对象。

//126邮箱的SMTP地址
// 服务器地址:
String smtp = "smtp.126.com";

//自己的登录账号
// 登录用户名:
String username = "xxxxxxx@126.com";

// 登录密码:
String password = "xxxxxxxxx";

// 连接到SMTP服务器25端口:
Properties props = new Properties();
props.put("mail.smtp.host", smtp); // SMTP主机名
props.put("mail.smtp.port", "25"); // 主机端口号
props.put("mail.smtp.auth", "true"); // 是否需要用户认证
props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密

// 获取Session实例:
Session session = Session.getInstance(props, new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(username, password);
    }
});

(2) 发送邮件,我们需要构造一个Message对象,调我们导入的jar中的Transport.send()方法,就可以成功发送邮件。

//用try-catch块来解决程序运行时可能会抛出的(Address,Message)异常
try {
    //创建Message对象
    MimeMessage message = new MimeMessage(session);

    // 设置发送方地址:
    message.setFrom(new InternetAddress("xxxxxxxxxx@126.com"));

    // 设置接收方地址:
    message.setRecipient(Message.RecipientType.TO, neInternetAddress("xxxx@qq.com"));
    
    // 设置邮件主题:
    //使用utf-8的编码格式
    message.setSubject("Hello", "UTF-8");
    
    // 设置邮件正文:
    message.setText("Hi Xiaoming...", "UTF-8");
    
    // 发送:
    Transport.send(message);

} catch (AddressException e) {
    e.printStackTrace();
} catch (MessagingException e) {
    e.printStackTrace();
}

(3) 如果我们需要发送附件(图片),以作者准备的类Demo01为例,Demo01类中有Session对象,所以接下来直接调用session对象。

public static void main(String[] args) throws IOException {
		try {
			//创建Session会话
			Session session = Demo01.create();
			
			//创建邮件对象(Message抽象类的子类对象)
			MimeMessage msg = new MimeMessage(session);
			msg.setFrom(new InternetAddress("h13109111703@163.com"));
			msg.setRecipient(RecipientType.TO, new InternetAddress("1344204640@qq.com"));
			msg.setSubject("测试","UTF-8");
			
			//邮件内容的复合对象
			Multipart multiPart = new MimeMultipart();
			
			//正文
			BodyPart textPart = new MimeBodyPart();
			//参数一: 正文内容
			//参数二: 内容类型,字符编码集
			StringBuilder body = new StringBuilder();

            //设置邮件标题,并加粗显示
			body.append("<h1>TM</h1>");

            // 通过StringBuilder来拼接正文和附件
			body.append("<img src=\"xxxxxxxxxx.jpg\">/");
			textPart.setContent(body.toString(),"text/html;charset=utf-8");
			
			
			//附件
			BodyPart imagePart = new MimeBodyPart();
			imagePart.setFileName("jay.jpg");//设置附件文件的显示名称
			//数据处理对象(读取附件文件从本地磁盘进行读取)
			imagePart.setDataHandler(
					new DataHandler(
					new ByteArrayDataSource(
                Files.readAllBytes(Paths.get("C:\\Users\\lenovo\\Pictures\\magick.jpg")), 
                "application/octet-stream")));
			
			//添加至邮件内容
			 multiPart.addBodyPart(textPart);
			 multiPart.addBodyPart(imagePart);
			

			//设置邮件内容
			 msg.setContent(multiPart);
			 
			 //发送邮件
			 Transport.send(msg);
			 
			 
		} catch (MessagingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

4.一对多发送邮件

         我们也可以用Java来实现把一封邮件同时发送给多个人。只需要在发送对象的基础上,添加抄写者,抄写者可以添加多个人。

try {
			//创建Session会话
			Session session = Demo01.create();
			
			//创建邮件对象(Message抽象类的子类对象)
			//发送给多个人
			MimeMessage msg = new MimeMessage(session);
			msg.setFrom(new InternetAddress("h13109111703@163.com"));
            //发送给一个人
			msg.setRecipient(RecipientType.TO, new InternetAddress("xxxxx0@qq.com"));
            //通过setRecipients中的抄写者。来实现同时发送给多个人
            //把网络邮件地址设置成一个集合,存放多个邮箱地址
			msg.setRecipients(RecipientType.CC, new InternetAddress[] {
					new InternetAddress("xxxxx@qq.com"),
					new InternetAddress("xxxxxxx@qq.com"),
					new InternetAddress("xxxxx@qq.com"),
			});
			msg.setSubject("正文标题","UTF-8");
			
			//邮件正文
			BodyPart textBodyPart = new MimeBodyPart();
			StringBuilder body = new StringBuilder();
			body.append("<h1>TM</h1>");
			body.append("<img src=\"cid:tiezi\">/");
			textBodyPart.setContent(body.toString(),"text/html;charset=utf-8");
			
			//邮件附件部分
			BodyPart imageBodyPart = new MimeBodyPart();
			imageBodyPart.setFileName("TMD.jpg");//附件名称
			imageBodyPart.setDataHandler(new DataHandler(  //读取附件内容
					      new ByteArrayDataSource(
					      Files.readAllBytes(
                          Paths.get("C:\\Users\\lenovo\\Pictures\\magick.jpg")), 
					    		  "application/octet-stream")));
			
			//设置内容ID
			imageBodyPart.setHeader("Content-ID", "<tiezi>");
			
			//组合正文和附件
			Multipart multiPart = new MimeMultipart();
			multiPart.addBodyPart(textBodyPart);//正文内容
			multiPart.addBodyPart(imageBodyPart);//附件内容
			
			msg.setContent(multiPart);
			 
			Transport.send(msg);
			
		} catch (MessagingException | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

5.这样我们就通过了解邮件中的SMTP协议成功完成了邮件发送。



 

  • 38
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

#0000FF格子衫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值