基于SMTP的JAVA邮件发送程序!

深入理解SMTP协议之邮件客户端 本文将使用Python从零实现一个简易的邮件客户端,通过本文你将对SMTP协议有更深入的了解,同时掌握使用Python实现标准协议的经验。 我们将开发一个简单的邮件客户端,将邮件发送给任意收件人。我们的客户端将需要连接到邮件服务器(QQ邮件服务器),使用SMTP协议与邮件服务器进行对话,并向邮件服务器发送电子邮件。 Python提供了一个名为smtplib的模块,它内置了使用SMTP协议发送邮件的方法。但是我们不会使用此模块,因为它隐藏了SMTP和套接字编程的细节,我们将完全从零开始实现自己的邮件客户端。 阅读详情

正好遇到这方面的问题,写出来,分享一下。

这个程序没有使用JavaMail API,而是根据SMTP协议的要求直接处理协议的细节发送邮件,虽然比较麻烦了一些,但是对了解邮件协议的细节很有帮助的。

本文分两部分,第一部分是SMTP命令介绍(这个从别的地方抄的,嘿嘿);第二部分通过一个实例真正理解一下发送邮件的过程。

一:SMTP 命令简介

什么是 SMTP
SMTP (Simple Mail Transfer Protocol) : 电子邮件从客户机传输到服务器或从某一个服务器传输到另一个服务器使用的传输协议。 SMTP 是请求/响应协议,命令和响应都是基于 ASCII 文本,并以 CR 和 LF 符结束。响应包括一个表示返回状态的三位数字代码。SMTP 在 TCP 协议 25 端口监听连接请求。

什么是 ESMTP
ESMTP (Extended SMTP),顾名思义,扩展 SMTP 就是对标准 SMTP 协议进行的扩展。它与 SMTP 服务的区别仅仅是,使用 SMTP 发信不需要验证用户帐户,而用 ESMTP 发信时,服务器会要求用户提供用户名和密码以便验证身份。验证之后的邮件发送过程与 SMTP 方式没有两样。

SMTP 命令包括:
HELO 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。
EHLO 向服务器标识用户身份。发送者能欺骗,说谎,但一般情况下服务器都能检测到。
MAIL FROM 命令中指定的地址是发件人地址
RCPT TO 标识单个的邮件接收人;可有多个 RCPT TO;常在 MAIL 命令后面。
DATA 在单个或多个 RCPT 命令后,表示所有的邮件接收人已标识,并初始化数据传输,以 CRLF.CRLF 结束
VRFY 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令
EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用
HELP 查询服务器支持什么命令
NOOP 无操作,服务器应响应 OK
RSET 重置会话,当前传输被取消
QUIT 结束会话

连接到 Postfix 使用 SMTP 命令发送邮件
例如:安装 Postfix 的邮件服务器IP是192.168.0.1 (蓝色字体内容由客户端输入,红色字体内容是服务返回的)

telnet 192.168.0.1 25 ------------------------------------------------- 使用 telnet 命令连接服务器 25 端口
helo test.com -----------------------------------------------------------向服务器标识用户身份发送 mail from 命令
ehlo test.com ----------------------------------------------------------- ESMTP 命令,发信需要认证。
auth login ----------------------------------------------------------------进行用户身份认证
334 VXNlcm5hbWU6
Y29zdGFAYW1heGl0Lm5ldA== ----------------------------------- BASE64 加密后的用户名
334 UGFzc3dvcmQ6
MTk4MjIxNA== -------------------------------------------------------- BASE64 加密后的密码
235 authentication successfully -------------------------------- 身份认证成功
(535 authentication failed --------------------------------- ------身份认证失败)
发到本系统中域名下的账户可跳过身份认证。
mail from: <test1@domain.com> ---------------------------- mail from 地址 test1@domain.com
250 ok ----------------------------------------------------- ----------命令执行成功
rcpt to: <test2@domain.com> -------------------------------- 递送给地址 test2@domain.com
250 ok ----------------------------------------------------- ----------命令执行成功
data ------------------------------------------------------- -----------数据传输初始化
354 End data with . ----------------------------------------- -----开始传输数据
From: test1@domain.com
To: test2@domain.com
Date: Mon, 25 Oct 2004 14:24:27 +0800
Subject: test mail

Hi, test2
This is a test mail, you don't reply it.

.
------------------------------------------------------------ 数据内容,包括BASE64加密后的邮件内容, 以 CRLF.CRLF 结束数据传输
250 OK: queued as 2F6DE3929--------------------------------- 命令执行成功
quit ------------------------------------------------------- 结束会话
221 Bye
Connection closed by foreign host .------------------------- 断开连接

以上就是一个邮件发送的基本的命令。

再说一下邮件发送的基本过程:

如果你的邮件地址是a@host.com,而你要用这个邮箱发送一封邮件到to@tohost.com,你需要连接到服务器host.com上,当然这个连接可能需要认证,现在基本上都要验证,然后是发送邮件到服务器host.com上,关闭连接。在host.com上,你所发送的邮件进入发送队列中,轮到你要发送的邮件时,host.com主机再联系tohost.com,将邮件传输到服务器tohost.com上。

 二:实例应用

-----------------------------------------------------------------------------------------------------------------------

MailMessage.java

----------------------------------------

//这个类其实就是一个基本的JavaBean,用于完成一些基本信息的设置,也可以不要这个东西,直接在程序中写明就可以,不过这样条理较清楚一些,而且修改也方便一些.

package mail;

public class MailMessage {
 
 private String from;
 private String to;
 private String datafrom;
 private String datato;
 private String subject;
 private String content;
 private String date;
 private String user;
 private String password;

 public String getPassword() {
  return password;
 }

 public void setPassword(String password) {
  this.password = password;
 }

 public String getUser() {
  return user;
 }

 public void setUser(String user) {
  this.user = user;
 }

 public String getContent() {
  return content;
 }

 public void setContent(String content) {
  this.content = content;
 }

 public String getDatafrom() {
  return datafrom;
 }

 public void setDatafrom(String datafrom) {
  this.datafrom = datafrom;
 }

 public String getDatato() {
  return datato;
 }

 public void setDatato(String datato) {
  this.datato = datato;
 }

 public String getDate() {
  return date;
 }

 public void setDate(String date) {
  this.date = date;
 }

 public String getFrom() {
  return from;
 }

 public void setFrom(String from) {
  this.from = from;
 }

 public String getSubject() {
  return subject;
 }

 public void setSubject(String subject) {
  this.subject = subject;
 }

 public String getTo() {
  return to;
 }

 public void setTo(String to) {
  this.to = to;
 }

}

---------------------------------------------

SMTPClient .java

------------------------------

//主要的功能就在这里面完成了

package mail;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.StringTokenizer;

import sun.misc.BASE64Encoder;

public class SMTPClient {

 private boolean debug=true;
 BASE64Encoder encode=new BASE64Encoder();//用于加密后发送用户名和密码
 public static void main(String[] args) throws UnknownHostException, IOException {
  // TODO Auto-generated method stub
  MailMessage message=new MailMessage();
  message.setFrom("wasingmon@163.com");//发件人
  message.setTo("wasingmon@eyou.com");//收件人
  String server="smtp.163.com";//邮件服务器
  message.setSubject("test");//邮件主题
  message.setContent("test");//邮件内容
  message.setDatafrom("wangxingmou@eyou.com");//发件人,在邮件的发件人栏目中显示
  message.setDatato("wasingmon@163.com");//收件人,在邮件的收件人栏目中显示
  message.setUser("wasingmon");//登陆邮箱的用户名
  message.setPassword("");//登陆邮箱的密码
  
  SMTPClient smtp=new SMTPClient(server,25);
  boolean flag;
  flag=smtp.sendMail(message,server);
  if(flag){
   System.out.println("邮件发送成功!");
  }
  else{
   System.out.println("邮件发送失败!");
  }

 }
 private Socket socket;
 public SMTPClient(String server,int port) throws UnknownHostException, IOException{
  try{
   socket=new Socket(server,25);
  }catch(SocketException e){
   System.out.println(e.getMessage());
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   System.out.println("已经建立连接!");
  }

 }
 //注册到邮件服务器
 public void helo(String server,BufferedReader in,BufferedWriter out) throws IOException{
  int result;
  result=getResult(in);
  //连接上邮件服务后,服务器给出220应答
  if(result!=220){
   throw new IOException("连接服务器失败");
  }
  result=sendServer("HELO "+server,in,out);
  //HELO命令成功后返回250
  if(result!=250)
  {
   throw new IOException("注册邮件服务器失败!");
  }
 }
 
 private int sendServer(String str,BufferedReader in,BufferedWriter out) throws IOException{
  out.write(str);
  out.newLine();
  out.flush();
  if(debug)
  {
   System.out.println("已发送命令:"+str);
  }
  return getResult(in);
 }
 public int getResult(BufferedReader in){
  String line="";
  try{
   line=in.readLine();
   if(debug){
    System.out.println("服务器返回状态:"+line);
   }
  }catch(Exception e){
   e.printStackTrace();
  }
  //从服务器返回消息中读出状态码,将其转换成整数返回
  StringTokenizer st=new StringTokenizer(line," ");
  return Integer.parseInt(st.nextToken());
 }
 
 public void authLogin(MailMessage message,BufferedReader in,BufferedWriter out) throws IOException{
  int result;
  result=sendServer("AUTH LOGIN",in,out);
  if(result!=334){
   throw new IOException("用户验证失败!");
  }
  
   result=sendServer(encode.encode(message.getUser().getBytes()),in,out);
   if(result!=334){
   throw new IOException("用户名错误!");
   }
   result=sendServer(encode.encode(message.getPassword().getBytes()),in,out);
  
   if(result!=235){
    throw new IOException("验证失败!");
  }
 }
 //开始发送消息,邮件源地址
 public void mailfrom(String source,BufferedReader in,BufferedWriter out) throws IOException{
  int result;
  result=sendServer("MAIL FROM:<"+source+">",in,out);
  if(result!=250){
   throw new IOException("指定源地址错误");
  }
 }
 // 设置邮件收件人
 public void rcpt(String touchman,BufferedReader in,BufferedWriter out) throws IOException{
  int result;
  result=sendServer("RCPT TO:<"+touchman+">",in,out);
  if(result!=250){
   throw new IOException("指定目的地址错误!");
  }
 }
 
 //邮件体
 public void data(String from,String to,String subject,String content,BufferedReader in,BufferedWriter out) throws IOException{
  int result;
  result=sendServer("DATA",in,out);
  //输入DATA回车后,若收到354应答后,继续输入邮件内容
  if(result!=354){
   throw new IOException("不能发送数据");
  }
  out.write("From: "+from);
  out.newLine();
  out.write("To: "+to);
  out.newLine();
  out.write("Subject: "+subject);
  out.newLine();
  out.newLine();
  out.write(content);
  out.newLine();
  //句号加回车结束邮件内容输入
  result=sendServer(".",in,out);
  System.out.println(result);
  if(result!=250)
  {
   throw new IOException("发送数据错误");
  }
 }
 
 //退出
 public void quit(BufferedReader in,BufferedWriter out) throws IOException{
  int result;
  result=sendServer("QUIT",in,out);
  if(result!=221){
   throw new IOException("未能正确退出");
  }
 }
 
 //发送邮件主程序
 public boolean sendMail(MailMessage message,String server){
  try{
   BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
   BufferedWriter out=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
   helo(server,in,out);//HELO命令
   authLogin(message,in,out);//AUTH LOGIN命令
   mailfrom(message.getFrom(),in,out);//MAIL FROM
   rcpt(message.getTo(),in,out);//RCPT
   data(message.getDatafrom(),message.getDatato(),message.getSubject(),message.getContent(),in,out);//DATA
   quit(in,out);//QUIT
  }catch(Exception e){
   e.printStackTrace();
   return false;
   
  }
  return true;
 }

}

因为现在一般SMTP服务器都需要SMTP验证,所以本例子中也加入了这个验证,要不然邮件时发不出去的(刚开始我就这样),程序中必要的注释也基本有了,相信初学的朋友也会很容易看懂的。

END!

用Java Socket实现SMTP邮件发送 目录: 1、邮件基础概念 2、Java Mail API介绍 3、收发邮件代码示例 PS:如果你想直接拿代码用,可以直接跳到第3部分。 ** 一、邮件基础概念 ** 1.1 邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器。例如现在Internet很多提供邮件服务的厂商:sina、sohu、163等等他们都有自己的邮件服务器。 这些邮件服务器类似于现实生... 阅读详情

相关推荐

使用SmtpClient发送邮件的方法

本来想试试用SmtpClient来做一个简单的发送邮件的Demo程序。却不想在中途遇上了意料之外的事情,使得这次试验过程变得有些曲折。

postfix+javamail实现邮件发送

前两天想用,javamail实现一个发送邮件验证码的功能,但是又不想用qq或者163邮箱,于是乎查到了postfix这么个东西,用postfix+cyrus-sasl成功的实现了邮件的发送,中间经历了千辛万苦,终于能用javamail和配置好的postfix阿里云服务器给发送邮件了,特此记录下!首先声明一下配置的要求:1.Ubuntu16.04 阿里云的产品2.一个域名3.postfix,cyru...

ZZHMMD957 6018

Revit模型转点云全流程:从OBJ导出到CloudCompare点云生成(2020版)

本文详细介绍了将Revit模型转换为点云数据的完整流程,特别针对Revit 2020用户。通过使用OBJ导出插件和开源软件CloudCompare,实现从模型导出、网格采样到生成结构化PCD点云的全过程,并提供了关键参数设置与常见问题解决方案,为BIM与三维数字孪生应用提供技术支持。

oo7890的博客 154

go发送smtp邮件时的踩坑记录——auth login、x509: cannot validate certificate for错误

最近在用go写一个小工具,一个小功能是用smtp发邮件,用公司内网的邮箱服务器实现踩了不少坑 想知道x509: cannot validate certificate for解决的直接看2.2.1,想知道auth login怎么实现看2.2.2 1 smtp协议 基础知识,回顾一下smtp协议的基本使用 1.1 命令行通过smtp协议发邮件 smtp协议网上资料很多,这里用最简单的方法过...

四毛毛的博客 3万+

Ubuntu下OpenOCD+GDB的安装、编译及使用

目标开发板(芯片):stm32mp157aaa 仿真器:ST-Link 操作系统:Ubuntu 18.04 调试软件:OpenOCD OpenOCD的安装 首先下载OpenOCD有多种方式,可以GitHub上下载,目录下打开终端,输入 git clone git://git.code.sf.net/p/openocd/code openocd 下载完整的OpenOCD的文件夹。进入到OpenOCD的目录下,开始安装。 接着,OpenOCD适用于微处理器的debug和烧写,需要下载相关库 sud

蓝冰露的博客 9524

STM32F407+LAN8720网口不通?别慌,手把手教你用CubeMX和HAL库搞定RMII配置与调试

本文详细介绍了STM32F407与LAN8720网口不通的全面排查与解决方法,涵盖硬件检查、CubeMX配置、PHY芯片初始化和LWIP协议栈优化。通过RMII接口配置、时钟树设置和PHY芯片调试,帮助开发者快速定位并解决网络连接问题,提升嵌入式网络开发效率。

weixin_30457551的博客 506

SMTP协议解读以及如何使用SMTP协议发送电子邮件

电子邮件协议中POP3协议用于接收邮件,SMTP协议用于发送邮件。SMTP的全称为Simple Mail Transfer Protocol,也就是简单邮件传输协议,字如其名。   相较于POP3而言,SMTP确实比较简单。这里的简单并不是指SMTP的命令比POP3少,而是指SMTP的命令是有序的,而POP3的命令是无序的,理解这一点很重要。也就是说SMTP的命令是要组合在一起才能完成一次邮件发送任务,单独调用每个命令的意义不大。POP3命令则不同,LIST、STAT、UIDL、TOP、RETR、

lgsoftlee的博客 1万+

SAP WM模块事务码(TCODE)大全

OL07 Data transfer stor.bins LDK34->RLPLA 仓储位LDK34 ->RLPLA

matinal 當冬夜漸暖 。公众号:matinal 5845

SMTP验证方式种类(LOGIN、PLAIN、CRAM-MD5)

开通了独立博客http://www.zhougou.net/ 希望大家多多关注 最初的SMTP协议不包含安全认证的,所谓的ESMTP在安全性方面扩展了SMTP,通过增加命令EHLO和AUTH。如今的SMTP服务器,无论是公网的还是内网的,大都要求安全认证,如果你使用的是Outlook Express,那么在邮箱帐户的配置中有一个选项-“我的SMTP服务器要求验证”。...

weixin_33890499的博客 2053

LVDS系列11:Xilinx Ultrascale系可编程输入延迟(一)

按照IDELAYCTRL的参考时钟频率可以准确计算获取到,如200M参考时钟抽头分辨率为78ps,Ultrascale系列相对于7系列架构大改,体现便是U/U+系列的抽头增加到512个,同时每个抽头的分辨率就无法像7系列那样能得到一个准确的值,是一个波动的范围值,抽头分辨率随着工艺温度电压的变化而变化。EN_VTC:电压温度补偿开启的使用信号,COUNT模式下不能使用,必须保持为0,TIME模式下需要使用,在延迟工作时要启用温度电压补偿,在修改抽头值时需要关闭温度电压补偿,修改完后启用;

weixin_38828382的博客 1939

ImportError: DLL load failed: 找不到指定的程序的解决方案

本文主要介绍了ImportError: DLL load failed: 找不到指定的程序的解决方案,希望能对使用Python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 18万+

【转】javamail-基于SMTP的JAVA邮件发送程序!

正好遇到这方面的问题,写出来,分享一下。 这个程序没有使用JavaMail API,而是根据SMTP协议的要求直接处理协议的细节发送邮件,虽然比较麻烦了一些,但是对了解邮件协议的细节很有帮助的。 本文分两部分,第一部分是SMTP命令介绍(这个从别的地方抄的,嘿嘿);第二部分通过一个实例真正理解一下发送邮件的过程。 一:SMTP 命令简介 什么是 SMTP SMTP (Simple Mail Transfer Protocol) : 电子邮件从客户机传输到服务器或从某一个服务器传输到另一个服务器使用的传输协

loike的专栏 1267

YOLO骨干网络改进-第1篇:深度解析YOLOv8的C2f模块原理与实现

首先,需要将自定义的C2f模块注册到Ultralytics的模块字典中。# 注册自定义模块"""自定义的C2f模块。"""# 自定义YOLOv8s配置文件:yolov8s_custom.yamlscales:# Backbonebackbone:# Headhead:# 加载自定义模型# 训练模型imgsz=640,batch=16,device=0,workers=8,设计理念:C2f模块是C3模块的演进,通过增加梯度分支来丰富梯度流,提升特征表示能力。结构原理。

2201_76125393的博客 109

javamail-基于SMTP的JAVA邮件发送程序!

正好遇到这方面的问题,写出来,分享一下。这个程序没有使用JavaMail API,而是根据SMTP协议的要求直接处理协议的细节发送邮件,虽然比较麻烦了一些,但是对了解邮件协议的细节很有帮助的。本文分两部分,第一部分是SMTP命令介绍(这个从别的地方抄的,嘿嘿);第二部分通过一个实例真正理解一下发送邮件的过程。一:SMTP 命令简介什么是 SMTPSMTP (Simple Mail

5530

使用Simulink来模拟多旋翼无人机在风扰动条件下的飞行情况,并分析其稳定性

本教程详细介绍了使用Simulink进行多旋翼无人机风扰动稳定性分析的完整流程。首先构建包含飞行器动力学模型、控制系统和环境模拟模块的系统框架,重点讲解简化动力学方程的实现方法。随后指导设计PID控制器来维持姿态稳定,并添加随机风扰动模型模拟环境干扰。通过设置输入信号和输出显示,最终实现对不同风速条件下无人机控制性能的评估。该实例为无人机控制系统设计提供了实用的仿真方法,强调利用MATLAB工具进行可视化分析和参数优化,以提高系统抗干扰能力和稳定性。

amy_mhd的博客 418

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

基于java实现SMTP发送邮件

本文介绍了如何使用Java实现SMTP邮件发送功能。通过Jakarta Mail工具包,开发者可以便捷地构建邮件发送能力。文章详细讲解了邮件发送的全流程,包括环境搭建、依赖配置、会话创建、认证机制、内容组装等关键步骤,并针对常见问题如认证失败、附件乱码等提供解决方案。示例代码展示了如何发送带抄送、密送和附件的邮件,包括SMTP服务器配置、身份验证、收件人设置等核心功能。该实现适用于企业级应用的自动化邮件需求,为开发者提供了可落地的技术参考。

工作难点和娱乐项目,总结与分享 2052

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java 通过SMTP实现发送QQ邮件

在eclipse中创建项目,并把javax.amil.jar和commons-email-1.5,jar复制到项目中 链接:https://pan.baidu.com/s/1sQjA1GEpKi6IJJRGHKxjeA 密码:4ene 添加步骤: 1.首先在项目下创建一个文件夹,保存我们的jar包。在项目名上右击,依次点击【New】-->【Floder】,打开新建文件夹窗口 2.输入...

青红造了个大白之成长记 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java实现smtp发送邮件

实现方法: public void sendTrueEmail(Email email){ //配置发送邮件的环境属性 final Properties props = new Properties(); // 表示SMTP发送邮件,需要进行身份验证 props.put("mail.smtp.auth", "true"); props.put("mail.smtp.host", "smtp.qq.com"); /

XingChenHuanYu的博客 6053

Java采用SMTP协议发送邮件

 示例中需要用到两个包:mail.jar和activation.jar,其下载地址为:http://java.sun.com/products/javamail/downloads/index.htmlhttp://java.sun.com/javase/technologies/desktop/javabeans/jaf/downloads/index.html下载后解压,将mail.j

*童稚的心* 1万+

使用smtp协议发送邮件程序

 使用SMTP协议发送邮件,可以不通过SMTP服务器,直接将邮件发送到邮件服务器。很多服务器端程序可能需要向很多用户发送邮件,直接通过SMTP发送可能是最有效的。关于SMTP协议定义在RFC821,可以在此看中文版。第一步:通过目标email查找邮件服务器。例如:asklxf@sohu.com,其邮件服务器地址为:sohumx.sohu.com    import java.net.*;   

1935

JavaMail SMTP服务器发送邮件程序示例

<br />/** * JavaMail SMTP服务器发送邮件程序示例 * 扮演SMTP服务器角色与邮件客户端软件最大的区别就是: * SMTP服务器需要解析不同接收人邮件地址主机名对应的SMTP服务器主机名 * ,同时不需要验证 * 注意:由于条件的限制,此程序是运行不成功的,原因见下面的注释说明 */ package com.labci.javamail.test; import java.util.Date; import java.util.Properties;

7625

SMTP协议发送邮件

网上找了一个smtp邮箱的发送工具类,还行,用我自己的qq测试可以发送 package com.example import javax.mail.Address; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.m...

Peter_S的博客 2585

不需要smtp服务器的邮件发送

工作中总用到需要发送邮件的情形,但是每次都需要一个smtp服务器来转发,他们仅仅是转发而已 为了一个简单的邮件还要弄个邮件服务器太麻烦了,Postfix不会装,sendmail也不熟悉。 而且如果公司的邮件服务器不稳定(别说你没碰到),总是能遇到邮件发送延迟,甚至丢失的情况 干嘛不自己伪造个协议,跳过通过smtp服务器这一层呢?而且可以模拟任何人给任何人发送邮件(虽然可以,但是鄙视发垃圾邮件

muyannian的专栏 1万+

Java使用163的SMTP服务器发送邮件

使用163的SMTP服务器发送邮件 import java.util.Properties; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.Multipart; import javax.mail.Session; imp...

weixin_44543145的博客 4699
上一篇: 哈哈哈哈!
下一篇: 基于JavaMail的邮件发送程序!
Wasingmon
博客等级 码龄22年 9粉丝 55原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值