为了发送E-mail,必须建立一个到端口25(即SMTP端口)的套接字连接。简单邮件传输协议用于描述E-mail消息的格式。
可以连接到任何一个提供SMTP服务的服务器,不过需要确定服务器是否愿意接受请求。SMTP服务器通常总是愿意发送来自任何人的E-mail,但是由于垃圾邮件泛滥,大多数服务器都内置有检查功能,它们只接受那些来自它们所信任的用户或IP地址段的请求。
一旦连接到服务器,就可以发送一个邮件报头(采用SMTP格式)。紧随其后是邮件消息。
操作的详细过程:
1.打开一个到达主机的套接字:
Socket socket = new Socket("mail.mailserver.com", 25);
PrintWriter out = new PrintWriter(socket.getOutputStream());
2.发送以下信息到输出流
HELO sending host
MAIL FROM: <sender e-mail address>
RCPT TO: <recipient e-mail address>
DATA
mail message
(any number of lines)
.
QUIT
e.g.
OutputStream outStream = socket.getOutputStream();
PrintWriter out = new PrintWriter(new OutputStreamWriter(outStream, "utf-8"), true);
String hostName = InetAddress.getLocalHost().getHostName();
out.print("HELO " + hostName + "\r\n");
out.print("MAIL FROM: <" + from.getText() + ">\r\n");
out.print("RCPT TO: <" + to.getText() + ">\r\n");
out.print("DATA\r\n");
out.print(("the mail message...\n").replaceAll("\n", "\r\n"));
out.print(".\r\n");
out.print("QUIT\r\n"));
3.SMTP规范(RFC 821)规定,每行都要以\r再紧跟一个\n来结尾。
4.有些SMTP服务器并不检查信息的真实性,可以随意填写任何喜欢使用的发件人名字。
5.现在大多数SMTP服务器都会检查守信IP,其他服务器将使用"SMTP之前先POP"规范,即要求在发送任何消息之前先下载你的E-mail,即要求提供密码。
DEMO
import java.awt.EventQueue;
import javax.swing.JFrame;
public class MailTest {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable(){
public void run(){
JFrame frame = new MailTestFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
/**
* 该程序会因为受限于SMTP服务器检测IP地址的原因,导致失败
*/
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingWorker;
public class MailTestFrame extends JFrame {
private Scanner in;
private PrintWriter out;
private JTextField from;
private JTextField to;
private JTextField smtpServer;
private JTextArea message;
private JTextArea comm;
public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 300;
public MailTestFrame(){
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
setTitle("MailTest");
setLayout(new GridBagLayout());
add(new JLabel("From:"), new GBC(0,0).setFill(GBC.HORIZONTAL));
from = new JTextField(20);
add(from, new GBC(1, 0).setFill(GBC.HORIZONTAL).setWeight(100, 0));
add(new JLabel("TO:"), new GBC(0, 1).setFill(GBC.HORIZONTAL));
to = new JTextField(20);
add(to, new GBC(1, 1).setFill(GBC.HORIZONTAL).setWeight(100, 0));
add(new JLabel("SMTP server:"), new GBC(0, 2).setFill(GBC.HORIZONTAL));
smtpServer = new JTextField(20);
add(smtpServer, new GBC(1, 2).setFill(GBC.HORIZONTAL).setWeight(100, 0));
message = new JTextArea();
add(new JScrollPane(message), new GBC(0, 3, 2, 1).setFill(GBC.BOTH).setWeight(100, 100));
comm = new JTextArea();
add(new JScrollPane(comm), new GBC(0, 4, 2, 1).setFill(GBC.BOTH).setWeight(100, 100));
JPanel buttonPanel = new JPanel();
add(buttonPanel, new GBC(0, 5, 2, 1));
JButton sendButton = new JButton("Send");
buttonPanel.add(sendButton);
sendButton.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
new SwingWorker<Void, Void>(){
protected Void doInBackground() throws Exception{
comm.setText("");
sendMail();
return null;
}
}.execute();
}
});
}
public void sendMail(){
try{
// Socket socket = new Socket(smtpServer.getText(), 25);
Socket socket = new Socket();
socket.connect(new InetSocketAddress(smtpServer.getText(), 25), 2000);
try{
InputStream inStream = socket.getInputStream();
OutputStream outStream = socket.getOutputStream();
in = new Scanner(inStream);
out = new PrintWriter(new OutputStreamWriter(outStream, "utf-8"), true);
String hostName = InetAddress.getLocalHost().getHostName();
receive();
send("HELO " + hostName);
receive();
send("MAIL FROM: <" + from.getText() + ">");
receive();
send("RCPT TO: <" + to.getText() + ">");
receive();
send("DATA");
receive();
send(message.getText());
send(".");
receive();
}finally{
socket.close();
}
}catch(IOException e){
comm.append("Error: " + e);
}
}
private void send(String str) throws IOException{
comm.append(str);
comm.append("\n");
out.print(str.replaceAll("\n", "\r\n"));
out.flush();
}
private void receive() {
String line = in.nextLine();
comm.append(line);
comm.append("\n");
}
}
import java.awt.GridBagConstraints;
import java.awt.Insets;
public class GBC extends GridBagConstraints{
public GBC(int gridx, int gridy){
this.gridx = gridx;
this.gridy = gridy;
}
public GBC(int gridx, int gridy, int gridwidth, int gridheight){
this.gridx = gridx;
this.gridy = gridy;
this.gridwidth = gridwidth;
this.gridheight = gridheight;
}
public GBC setAnchor(int anchor){
this.anchor = anchor;
return this;
}
public GBC setFill(int fill){
this.fill = fill;
return this;
}
public GBC setWeight(double weightx, double weighty){
this.weightx = weightx;
this.weighty = weighty;
return this;
}
public GBC setInsets(int distance){
this.insets = new Insets(distance, distance, distance, distance);
return this;
}
public GBC setInsets(int top, int left, int bottom, int right){
this.insets = new Insets(top, left, bottom, right);
return this;
}
public GBC setIpad(int ipadx, int ipady){
this.ipadx = ipadx;
this.ipady = ipady;
return this;
}
}
分享到:
相关推荐
### 发送E-mail组件与程序调试 #### 20.1 JavaMail简介 **JavaMail** 是由 Sun 公司发布的 API,它提供了一种简便的方式来处理电子邮件的发送与接收功能。尽管 JavaMail 并未集成到标准的 Java 开发工具集中,但...
如果`email`存在,则从`$_REQUEST`数组中获取邮件的各个部分(发件人邮箱、主题、消息),并通过`mail()`函数发送邮件。 ```php $email = $_REQUEST['email']; $subject = $_REQUEST['subject']; $message = $_...
在处理发送状态时,如果`$mail->send()`返回`false`,则表示发送失败,可以通过`$mail->ErrorInfo`获取错误信息;如果返回`true`,则表示发送成功。 在实际开发中,为了确保邮件发送的可靠性,通常会添加错误捕获和...
在设计E-mail程序时,我们需要了解几个关键的技术点,特别是如何使用Visual Basic 5.0(以下简称VB5)结合Microsoft MAPI (Messaging Application Programming Interface) 来实现邮件的发送与接收功能。本篇文章将...
SMTP(Simple Mail Transfer Protocol)是互联网上用于发送电子邮件的标准协议。它定义了如何在邮件服务器之间传输邮件,以及客户端如何通过服务器发送邮件。在给定的VC 6.0源代码中,我们可以推测这是一个实现SMTP...
前几天自己做程序时,因为该 程序不能有窗体,所以需要用代码发送E-mail的方法,在网上到处没找到,就自己用Sakmail加了个发送Email的单元,就一个方法,大家不要骂我传垃圾啊。 //邮箱服务器地址,用户名,用户密码...
本文将详细解析如何使用C#编写发送E-Mail的源代码,主要涉及SMTP(Simple Mail Transfer Protocol)服务和.NET Framework提供的System.Net.Mail命名空间。 首先,要发送电子邮件,我们需要了解几个关键组件: 1. *...
不过,需要注意的是,验证E-mail格式并不等同于确认该E-mail地址真实存在,后者通常需要发送验证邮件并等待用户确认。在实际应用中,结合其他验证手段,如DNS查询,可以进一步提高验证的准确性。希望这个示例可以...
【C# Asp.net编写的E-Mail发送程序】 在C#和Asp.net环境中编写一个E-Mail发送程序是一项常见的任务,这通常涉及到网络通信、SMTP(简单邮件传输协议)服务和邮件格式的理解。以下是该程序涉及的主要知识点: 1. **...
网络营销是企业借助互联网技术进行产品推广和服务的一种现代营销方式,其中e-mail营销是其重要的组成部分。E-mail营销是指通过电子邮件与潜在或现有客户建立关系、推广产品或服务、增加客户忠诚度的一种策略。这种...
本示例程序提供了详细的源代码,帮助开发者理解并实现C#中如何发送E-mail。首先,我们需要了解几个关键概念和技术: 1. **SMTP(Simple Mail Transfer Protocol)**:SMTP是互联网上用于发送电子邮件的标准协议。在...
E-mail帐号的设置是使用电子邮件服务的第一步,它允许用户通过特定的电子邮件客户端或网页界面来发送和接收邮件。正确设置E-mail帐号可以确保邮件的顺利发送和接收,同时保护用户的隐私和安全。 #### 2. 帐号设置的...
在Java编程环境中,发送普通文本格式的电子邮件是一个常见的任务,主要涉及到JavaMail API的使用。JavaMail API是一个开源库,允许开发者在Java应用程序中处理邮件的发送和接收。以下是一些关于如何使用Java发送普通...
"发送e-mail 很好用,操作直接拿过去简单"这句话强调了电子邮件的易用性和高效性。下面将详细介绍电子邮件的工作原理、常见操作以及如何确保邮件的安全性。 一、电子邮件工作原理 电子邮件系统基于SMTP(Simple ...
2. **SMTP (Simple Mail Transfer Protocol)**: SMTP 是互联网上用于发送电子邮件的标准协议。在JavaMail中,我们使用SMTP服务器来发送邮件。通过SMTP服务器,我们可以验证登录并发送邮件到指定的收件人。 3. **QQ...
### 设计E-mail程序 #### 一、概述 在信息技术领域,电子邮件系统是日常工作中不可或缺的一部分。本篇文章将深入探讨如何使用Visual Basic (VB) 开发一个简单的E-mail客户端程序。该程序基于VB技术实现,并提供了...
四、 E-mail 服务器的测试 在配置完成后,需要测试 E-mail 服务器的功能。测试的方法是使用客户端机器连接到服务器,发送和接收邮件,以验证服务器的功能是否正常。在测试过程中,需要根据实验要求设置客户端机器的...
在IT领域,网络爬虫是一种自动化程序,用于在网络上抓取大量数据,而E-mail收集插件则是这种爬虫技术的一种应用,专门针对电子邮件地址的抓取。本项目以"基于爬虫开发E-mail收集插件"为主题,旨在帮助开发者了解如何...
为此,小学信息技术课程特别安排了关于“发送电子邮件”以及“在幻灯片中插入和管理图片”的教学内容,旨在通过实践操作培养学生的动手能力与创新思维。 在这一课时的教学活动中,教师首先会通过提出问题的方式,...
这个后端接口应该处理实际的邮件发送逻辑,如使用PHP的 `mail()` 函数或SMTP服务。 在Ajax请求的 `success` 回调中,我们根据服务器返回的响应判断邮件发送是否成功,并向用户显示相应的消息。如果发生错误,`error...