javaEmail邮件传输

        传统的邮件是如何发送的:传统的邮件是通过邮局投递,然后从一个邮局到另一个邮局,最终到达用户的邮箱。

        电子邮件的发送过程也是类似的,只不过电子邮件是从用户电脑的邮件软件,例如Outlook,发送到邮件服务器上,可能经过若干个邮件服务器的中转,最终到达对方邮件服务器上,收件方可以用于软件接收邮件:

             ┌─────────┐    ┌─────────┐    ┌─────────┐
             │░░░░░░░░░│    │░░░░░░░░░│    │░░░░░░░░░│
┌───────┐    ├─────────┤    ├─────────┤    ├─────────┤    ┌───────┐
│░░░░░░░│    │░░░░░░░░░│    │░░░░░░░░░│    │░░░░░░░░░│    │░░░░░░░│
├───────┤    ├─────────┤    ├─────────┤    ├─────────┤    ├───────┤
│       │───>│O ░░░░░░░│───>│O ░░░░░░░│───>│O ░░░░░░░│<───│       │
└───────┘    └─────────┘    └─────────┘    └─────────┘    └───────┘
   MUA           MTA            MTA            MDA           MUA

邮件软件称为MUA:Mail User Agent,意思是给用户服务的邮件代理;邮件服务器则称为MTA:Mail Transfer Agent,意思是邮件中转的代理;最终到达的邮件服务器称为MDA:Mail Delivery Agent,意思是邮件到达的代理,电子邮件一旦到达MDA,就不再动了.

邮件协议

MTA和MDA这样的服务器软件通常是现成的,我们通常不会关心这些邮件服务器的内部 是如何运行的。更多的需求场景,是需要发送邮件。例如:促销商品邮件、验证码邮件、消息通知邮件等。常见的邮件协议有:POP3、SMTP、IMAP。
SMTP

SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP服务器就是遵循SMTP协议的发送邮件服务器。SMTP认证,简单地说就是要求必须在提供账号和密码之后才可以登录SMTP服务器,这就使得那些垃圾邮件的散播者无可乘之机。
IMAP

IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端 上的操作都会反馈到服务器上,如:删除 邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器东路邮箱或者客户端软件登录邮箱,看到的邮箱以及状态又是一致的。

发送邮件前,我们首先要确定作为MTA的邮件服务器地址和端口号。邮件服务器地址通常是smtp.example.com,端口号由邮件服务商确定使用25、465还是587。
常用邮件服务商的SMTP信息:
●QQ邮箱:SMTP服务器是smtp.qq.com,端口是465/587
●163邮箱:SMTP服务器是smtp.163.com,端口是465
●126邮箱:SMTP服务器是smtp.126.com,端口是25
●Gmail邮箱:SMTP服务器是smtp.gmail.com,端口是465/587

准备好SMTP登录信息后,我们首先要把JavaMail相关的依赖Jar包javax.mail-1.6.2.jar加入至当前项目。

然后,我们通过JavaMail API连接到SMTP服务器上:以25端口为例,连接SMTP服务器时,需要准备一个Properties对象,填入相关信息。最后获取Session实例时,如果服务器需要认证,还需要传入一个Authenticator对象,并返回指定的用户名和口令。当我们获取到Session实例后,打开调试模式可以看到SMTP通信的详细内容,便于调试。
我们把获取Session实例的代码封装在JavaMailUtils类中,以此作为一个创建Session对象的工具类,通过静态方法creatSession()方便我们快速的创建Session对象。实现代码如下:

String smtp="smtp.163.com";
		String userName="h15332651796@163.com";
		String password="LBFBVVDDXJLLUZXR";
		
		Properties props=new Properties();
		props.put("mail.smtp.host",smtp);
		props.put("mail.smtp.port","25");
		props.put("mail.smtp.auth","true");
		props.put("mail.smtp.starttls.enable","true");
		
		Session session=Session.getInstance(props,new Authenticator() {
		@Override
		protected PasswordAuthentication getPasswordAuthentication() {
			// TODO Auto-generated method stub
			return new PasswordAuthentication(userName, password);
		}
		});
		
		session.setDebug(true);
		System.out.println(session);

 发送邮件

发送邮件时,我们需要构造一个Message对象,然后调用Transport.send(Message)即可完成发送:绝大多数邮件服务器要求发送方地址和登录用户名必须一致,否则发送将失败。

try {
    MimeMessage message = new MimeMessage(session);
    // 设置发送方地址:
    message.setFrom(new InternetAddress("h15332651796@163.com"));
    // 设置接收方地址:
    message.setRecipient(Message.RecipientType.TO, new InternetAddress("2733711687@qq.com"));
    // 设置邮件主题:
    message.setSubject("Hello", "UTF-8");
    // 设置邮件正文:
    message.setText("Hi Xiaoming...", "UTF-8");
    // 发送:
    Transport.send(message);
} catch (AddressException e) {
    e.printStackTrace();
} catch (MessagingException e) {
    e.printStackTrace();
}

控制台

 

发送HTML文件

msg.setText("爱你就像<b>烈火烧</b>","utf-8","html");

 

发送附件

        要在电子邮件中携带附件,我们就不能直接调用,message.setText()方法,而是要构造一个Multipart对象。

// 创建MimeMessage邮件信息对象
// ...略

// 创建Multipart复合对象
Multipart multipart = new MimeMultipart();

// 添加text:
BodyPart textpart = new MimeBodyPart();
textpart.setContent(body, "text/html;charset=utf-8");
multipart.addBodyPart(textpart);

// 添加image:
BodyPart imagepart = new MimeBodyPart();
imagepart.setFileName(附件名称);
imagepart.setDataHandler(new DataHandler(new ByteArrayDataSource(文件流字节数组, "application/octet-stream")));
multipart.addBodyPart(imagepart);

// 设置邮件内容为multipart:
message.setContent(multipart);

 发送内嵌图片的HTML邮件


如果需要在HTML邮件中内嵌图片,可以选择在邮件中加入<img src="http://example.com/test.jpg">,这样的外部图片链接通常会被邮件客户端过滤,并提示用户显示图片并不安全。只有内嵌的图片才能正常在邮件中显示。所以,这种方式并不推荐。
推荐将内嵌图片作为一个附件嵌入邮件,即邮件本身也是Multipart,但需要做一点额外的处理:

 


			BodyPart textBodyPart=new MimeBodyPart();
			StringBuilder body=new StringBuilder();
			body.append("<h1>托尼斯塔克</h1>");
			body.append("<img src=\"cid:binzi\"/>");
			textBodyPart.setContent(body.toString(),"text/html;charset=utf-8");
			
			BodyPart imageBodyPart=new MimeBodyPart();
			imageBodyPart.setFileName("iron.jpg");
			imageBodyPart.setDataHandler(
					new DataHandler(
							new ByteArrayDataSource(
									Files.readAllBytes(Paths.get("c:\\test\\img\\gg.jpg")),
									"application/octec-stream")));
			imageBodyPart.setHeader("Content-ID", "<binzi>");
			Multipart multipart=new MimeMultipart();
			multipart.addBodyPart(textBodyPart);
			multipart.addBodyPart(imageBodyPart);

  • 17
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值