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

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

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

这个程序没有使用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上。

二:实例应用

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

这是一个简单的发送邮件的原代码,只是完成对文本的发送,这是主要的部分,至于页面部分我想大家能自己写出来,在程序中调用我这个类就可以了,我只是对163和sohu的进行了测试,都可以使用,其他的邮箱也没有进行测试,使用前只需要添加两个相关jar包,mail.jar和activation.jar,其他的jar包应该不需要说了,回过头来看看也比较简单,却费了我很长的时间,我感觉网上的一些文章copy的太多,有头没有有尾,有尾没有头,很少有一个测试成功的,我写的比较粗,也没有参数传送,大家可以自己扩展一下,希望能给向我这样的人一些帮助

主程序调用:

javaMail mail = new javaMail();

mail.sendMail();

类代码:

import java.util.Date;
import java.util.Properties;
import javax.servlet.*;
import javax.mail.Session;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Message;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.InternetAddress;
import javax.mail.Transport;

public class javaMail {
    private Properties properties;
    private Session mailSession;
    private MimeMessage mailMessage;
    private Transport trans;
    public javaMail() {
    }

    public void sendMail() {
        try {
            properties = new Properties();
            //设置邮件服务器
            properties.put("mail.smtp.host", "发邮件的服务器");
            //验证
            properties.put("mail.smtp.auth", "true");
            //根据属性新建一个邮件会话
            mailSession = Session.getInstance(properties,
                                              new Authenticator() {
                public PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication("你邮箱的用户名称",
                        "用户密码");
                }
            });
            mailSession.setDebug(true);
            //建立消息对象
            mailMessage = new MimeMessage(mailSession);
            //发件人
            mailMessage.setFrom(new InternetAddress("发邮件的邮箱"));
            //收件人
            mailMessage.setRecipient(MimeMessage.RecipientType.TO,
                                 new InternetAddress("收邮件的邮箱"));
            //主题
            mailMessage.setSubject("测试");
            //内容
            mailMessage.setText("test");
            //发信时间
            mailMessage.setSentDate(new Date());
            //存储信息
            mailMessage.saveChanges();
            //
            trans = mailSession.getTransport("smtp");
            //发送
            trans.send(mailMessage);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }
    }
}

注:搜狐测试通过(smtp.sohu.com)

示例2

public class JavaMailTest {

public static void main(String args[]) throws MessagingException {
   String smtpHost = "smtp.sohu.com";
   String from = "javamailfrom@sohu.com";
   String to = "javamailto@sohu.com";

   Properties properties = System.getProperties();
   Session session = Session.getInstance(properties);

   MimeMessage message = new MimeMessage(session);
   message.setFrom(new InternetAddress(from));
   message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
   message.setSubject("JavaMail Example");
   message.setText("Did it work?");
   Transport transport = session.getTransport("smtp");
   transport.connect(smtpHost, "用户名", "密码");

   transport.sendMessage(message, message.getAllRecipients());
   transport.close();
}
}

可能会出现如下错误

'550 5.1.1 <XXXX@ygsoft.com>: Recipient address rejected: User unknown in virtual mailbox table',

你发送的帐号在邮件系统内不存在,请检查你的邮件地址是否输入有误

'554 5.7.1 <XXXX@ygsoft.com>: Sender address rejected: Access denied',

你的邮箱是内部帐号,你所发送的地址不在授权域之内

'553 5.7.1 <XXXX@ygsoft.com>: Sender address rejected: not logged in',

发送邮件需要SMTP身份验证,你的帐号SMTP身份验证部分没有设置正确,请检查配置

'454 4.7.1 : Client host rejected: Access denied'

你的IP被管理员屏蔽,请检查你部的机器是否被感染病毒自动发送邮件


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/guijava/archive/2009/01/20/3837278.aspx

菊子曰 本文用 菊子曰发布
JavaMail API –通过Gmail SMTP发送电子邮件示例 在本文中,我们将向您展示如何通过Gmail SMTP服务器发送电子邮件。 要使用Java发送电子邮件,我们需要JavaMail pom.xml <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> &... 阅读详情

相关推荐

高数 | 【极限与等价无穷小】两个重要极限 & 经典错误 & 什么情况下求极限可以直接带入

一. 第一个重要极限 二. 第二个重要极限 三. 导数定义式 全文见【高等数学】两个重要的极限 - 知乎

"You are worthy! You can do it!" 6万+

esmtp java实现方法

esmtp java实现方法 包含 message estmp client, mail client

架构师之HBase vs MongoDB 技术选型与场景决策实战案例

面对海量数据和高并发查询,该选 HBase 还是 MongoDB?本文为你提供完整的决策框架!从数据模型对比、架构解析、六大真实场景(电信 CDR、金融行情、广告点击流、电商商品、社交档案、内容管理)到性能、一致性、运维全面对比,助你在 PB 级序数据和灵活查询之间做出精准选择!

肖哥弹架构博客 1045

Jenkins邮件配置报错com.sun.mail.smtp.SMTPSenderFailedException: 501

Jenkins邮件配置报错:com.sun.mail.smtp.SMTPSenderFailedException: 501 mail from address must be same as authorization user

fen_fen的专栏 4214

使用java mail 发送邮件报错处理com.sun.mail.smtp.SMTPSendFailedException: 501 Mail from address must be same as

使用java mail发送邮件报错处理

lool_123456的博客 4707

Jenkins构建发送电子邮件出现常见异常501 和503 、535

第一种异常 Failed to send out e-mail com.sun.mail.smtp.SMTPSenderFailedException: 501 mail from address must be same as authorization user at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.jav...

Joe192的博客 1万+

Springboot mail使用QQ邮箱错误汇总

Springboot mail使用邮箱错误汇总与正确的修改方法

m0_63411853的博客 2万+

基于JavaMailJava邮件发送:简单邮件发送

本文链接: http://blog.csdn.net/xietansheng/article/details/51673073 电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等。但这些应用可能和我们自己平邮件一样,先打开浏览器,登录邮箱,创建邮件发送。本文将简单介绍如何通过 Java 代码来创建电子邮件,并连接邮件服务器发...

谢TS的博客 22万+

JavaMailJava发送邮件

我们要在程序发送邮件,就必须有SMTP服务器,可以选择网易、Gmail等邮箱,并开启POP3/SMTP服务,用于充当我们的SMTP服务器,也可以自己搭建一个SMTP服务器。可以看到,这段代码构建TextPart的候,格式支持HTML代码,如果要在邮件中展示图片,只需要在其中构造图片标签即可。也就是说,发送邮件一般有SMTP协议,接收邮件常用的有两种协议(POP3、IMAP)网易邮箱中就提供了这两种组合给用户选择。Java开发中,经常用sun公司的。组件来进行邮件发送

神也在Cpoy 5445

javamail smtp_JavaMail示例–使用SMTPJava发送邮件

javamail smtpToday we will look into JavaMail Example to send email in java programs. Sending emails is one of the common tasks in real life applications and that’s why Java provides robust JavaMail A...

从零开始的教程世界 2753

基于SMTPJAVA邮件发送程序

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

1万+

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

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

7619

基于java实现SMTP发送邮件

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

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

基于JavaMailJava邮件发送:简单快速上手

基于JavaMail实现发送邮件、群发邮件 只需调用JavaMailAPI就可以实现 使用MailUtils工具类

少年你真的要止步于此嘛。 1695

com.sun.mail.smtp.SMTPSendFailedException: 501 mail from address must be same as authorization user

意思是:com.sun.mail.smtp.SMTPSendFailedException:来自地址的501邮件必须与授权用户相同 在这个项目里,邮件服务是腾讯企业邮提供的,支持高权限的用户使用用的用户作为发件人。所以使用统一的系统账号进行作为发件人。 载于:https://www.cnblogs.com/jiml/p/9357048.html...

weixin_30262255的博客 1万+

企业退信的常见问题

•421 HL:REP 该IP发送行为异常,存在接收者大量存在情况,被临禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并核对发送列表有效性;  •421 HL:ICC 该IP同并发连接数过大,超过了网易的限制,被临禁止连接。请检查是否有用户发送病毒或者垃圾邮件,并降低IP并发连接数量;  •421 HL:IFC 该IP短期内发送了大量信件,超过了网...

weixin_33919950的博客 807

Java邮件发送收取和监听

邮件协议 本文涉及到的协议主要包含:SMTP(Simple Mail Transfer Protocol,简单邮件传输协议),POP3(Post Office Protocol,邮局协议),IMAP(Internet Message Access Protocol,Internet邮件访问协议)。 通常情况下,smtp用来发送邮件。pop3和imap用来接收邮件,这样就有了pop3和imap有什么差别的疑问,大体上的差别在于,pop3虽然可以接收服务器上的邮件但是它对邮件的操作,比如,移动标记已读等等,都

农村打工仔的博客 1万+

机器人分拣工作站PLC控制程序(西门子)

【亲测实用】机器人分拣工作站PLC控制程序(西门子)文件类型:程序源代码主要功能: 专门用于机器人分拣工作台的PLC程序,可以控制气缸进行模拟检测等操作适合人群:新手及有一定经验的开发人员

上一篇: powerdesigner生成数据库或反向工程中出现的问题
下一篇: 【转】Pentaho开源BI项目介绍
loike
博客等级 码龄17年 4粉丝 45原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值