网络编程----基于Java Email的电子邮件发送

前言

        电子邮件(electronic mail,简称E-mail,标志:@)又称电子信箱、电子邮政,它是—种用电子手段提供信息交换的通信方式。电子邮件指用电子手段传送信件、单据、资料等信息的通信方法。电子邮件综合了电话通信和邮政信件的特点,它传送信息的速度和电话一样快,又能象信件一样使收信者在接收端收到文字记录。电子邮件系统又称基于计算机的邮件报文系统。

        我们熟悉的邮件软件比如Outlook、网易闪电邮、Foxmail都是用来收发邮件的。当然,使用Java程序也可以收发电子邮件。

邮件发送

 传统的邮件的发送过程:

        传统的邮件是通过邮局投递,然后从一个邮局到另一个邮局,最终到达用户的邮箱;

电子邮件的发送过程:

        电子邮件是从用户电脑的邮件软件,发送到邮件服务器上,可能经过若干个邮件服务器的中转,最终到达对方邮件服务器上,收件方就可以用软件接收邮件;

邮件协议

常见的邮件协议有:POP3、SMTP、IMAP。

POP3:

        POP3(Post Office Protocol 3),邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。

        POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件;

SMTP:

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

        SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。 增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。

IMAP:

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

利用SMIP协议发送邮件

        常用邮件服务商的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

        相关jar包:

                

         然后,我们通过JavaMail API连接到SMTP服务器上:以25端口为例,连接SMTP服务器时,需要准备一个Properties对象,填入相关信息。最后获取Session实例时,如果服务器需要认证,还需要传入一个Authenticator对象,并返回指定的用户名和口令。当我们获取到Session实例后,打开调试模式可以看到SMTP通信的详细内容,便于调试。

首先创建会话类:

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;

public class Javacreatsession {
		public static Session creatSession() {
			//SMTP服务器地址
			String smtp="smtp.126.com";
			//邮箱账号和密码(授权密码)
			String userName="hpc7799@126.com";
			String passWord="EQRZOMDDRBXK****";
			//SMTP服务器的连接信息
			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
			//参数1:SMTP服务器的连接信息
			//参数2:用户认证对象(Authenticator接口的匿名实现类)
			Session session=Session.getInstance(props, new Authenticator() {
				@Override
				protected PasswordAuthentication getPasswordAuthentication() {
					return new PasswordAuthentication(userName,passWord);
				}
			});
			//开启调试模式
			session.setDebug(true);
			return session;
		}

}

 发送邮件:

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

import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

import javax.activation.DataHandler;
import javax.mail.BodyPart;
import javax.mail.Message.RecipientType;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;

public class Demo03 {
	public static void main(String[] args) {
		try {
			//1.创建Session会话
			Session session=Javacreatsession.creatSession();
			
			//2.创建邮件对象(Message抽象类的子类对象)
			MimeMessage msg=new MimeMessage(session);
			msg.setFrom(new InternetAddress("hpc7799@126.com"));
			msg.setRecipient(RecipientType.TO, new InternetAddress("464822504@qq.com"));
			msg.setSubject("邮件标题","utf-8");

			//msg.setText("邮件<b>正文</b>","utf-8","html");
			
			//3.邮件内容“复合”对象
			Multipart multipart=new MimeMultipart();
			//正文
			//参数1:正文内容
			//参数2:内容类型;字符编码集
			BodyPart textpart=new MimeBodyPart();
			textpart.setContent("爱你孤身走<b>暗巷</b>","text/html;charset=utf-8");
			
			//附件
			BodyPart imagepart=new MimeBodyPart();
			imagepart.setFileName("sb.jpg");    //设置附件文件的显示名称
			//数据处理对象(读取附件文件从本地磁盘进行读取)
			imagepart.setDataHandler(
					new DataHandler(
							new ByteArrayDataSource(Files.readAllBytes(Paths.get("c:\\hpc\\QQ图片20220220101644.jpg")), 
									"application/octet-stream")));
			
			//添加至邮件内容
			multipart.addBodyPart(textpart);   //添加正文 
			multipart.addBodyPart(imagepart);   //添加附件
			//设置邮件内容
			msg.setContent(multipart);
			//发送邮件
			Transport.send(msg);
			
		} catch (AddressException e) {
			e.printStackTrace();
		} catch (MessagingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

        填入真实的地址,运行上述代码,我们可以在控制台看到Java Mail打印的调试信息,从调试信息可以看出,SMTP协议是一个请求-响应协议,客户端总是发送命令,然后等待服务器响应。服务器响应总是以数字开头,后面的信息才是用于调试的文本。这些响应码已经被定义在SMTP协议中了,查看具体的响应码就可以知道出错原因。

  • 62
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Netty是一个网络编程框架,它主要用于构建高性能、高可靠性的网络应用程序。然而,Netty本身并不提供发送邮件的功能,它更适用于实现基于TCP或UDP的网络通信。 如果你想在Java中使用Netty发送邮件,你可以借助JavaMail API来实现。JavaMail API是Java平台的标准API,它提供了发送和接收电子邮件的功能。 以下是一个使用Netty和JavaMail API发送简单邮件的示例代码: ```java import io.netty.util.concurrent.Future; import io.netty.util.concurrent.FutureListener; import io.netty.util.concurrent.Promise; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeBodyPart; import javax.activation.DataHandler; import javax.activation.FileDataSource; import java.util.Properties; public class EmailSender { public static void main(String[] args) { // 配置SMTP服务器和认证信息 Properties props = new Properties(); props.put("mail.smtp.host", "smtp.example.com"); props.put("mail.smtp.port", "587"); props.put("mail.smtp.auth", "true"); // 创建会话 Session session = Session.getInstance(props, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("your_username", "your_password"); } }); // 创建邮件消息 MimeMessage message = new MimeMessage(session); try { // 设置发件人 message.setFrom(new InternetAddress("[email protected]")); // 设置收件人 message.addRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]")); // 设置主题 message.setSubject("Test Email"); // 创建正文部分 MimeBodyPart textPart = new MimeBodyPart(); textPart.setText("This is the email content."); // 创建附件部分 MimeBodyPart attachmentPart = new MimeBodyPart(); FileDataSource fileDataSource = new FileDataSource("path_to_attachment_file"); attachmentPart.setDataHandler(new DataHandler(fileDataSource)); attachmentPart.setFileName(fileDataSource.getName()); // 创建多部分消息 MimeMultipart multipart = new MimeMultipart(); multipart.addBodyPart(textPart); multipart.addBodyPart(attachmentPart); // 设置消息内容 message.setContent(multipart); // 使用Netty发送邮件 Promise<Void> promise = new DefaultPromise<>(session.channel().eventLoop()); Transport transport = session.getTransport("smtp"); transport.connect(); transport.sendMessage(message, message.getAllRecipients(), new SendListener(promise)); transport.close(); // 等待邮件发送完成 Future<Void> future = promise; future.addListener(new FutureListener<Void>() { @Override public void operationComplete(Future<Void> future) throws Exception { if (future.isSuccess()) { System.out.println("Email sent successfully."); } else { System.out.println("Failed to send email: " + future.cause().getMessage()); } } }); } catch (Exception ex) { ex.printStackTrace(); } } private static class SendListener extends SendMailTransportListener { private final Promise<Void> promise; public SendListener(Promise<Void> promise) { this.promise = promise; } @Override public void messageDelivered(TransportEvent e) { promise.setSuccess(null); } @Override public void messageNotDelivered(TransportEvent e) { promise.setFailure(e.getException()); } @Override public void messagePartiallyDelivered(TransportEvent e) { promise.setFailure(e.getException()); } } } ``` 请注意,上述代码中的SMTP服务器和认证信息需要根据你的实际情况进行配置。另外,需要将"[email protected]"和"[email protected]"替换为实际的发件人和收件人邮箱地址。最后,将"path_to_attachment_file"替换为要附加的文件的路径。 这只是一个简单的示例,你可以根据自己的需求进行扩展和定制。希望对你有帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

雾远望

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

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

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

打赏作者

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

抵扣说明:

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

余额充值