(4) E-mail 보내기
Socket socket = new Socket("mail.mailserver.com", 25);
PrintWriter out = new PrintWriter(socket.getOutputStream());
2. 출력 흐름 HELO sending host MAIL FROM:
OutputStream outStream = socket.getOutputStream();
PrintWriter out = new PrintWriter(new OutputStreamWriter(outStream, "utf-8"), true);
String hostName = InetAddress.getLocalHost().getHostName();
out.print("HELO " + hostName + "\r
");
out.print("MAIL FROM: <" + from.getText() + ">\r
");
out.print("RCPT TO: <" + to.getText() + ">\r
");
out.print("DATA\r
");
out.print(("the mail message...
").replaceAll("
", "\r
"));
out.print(".\r
");
out.print("QUIT\r
"));
3. SMTP 사양(RFC 821)은 행마다\r로 한 줄 더 따라가야 한다고 규정합니다.4. 일부 SMTP 서버는 정보의 진실성을 검사하지 않고 원하는 발송자의 이름을 마음대로 작성할 수 있습니다.5. 현재 대부분의 SMTP 서버는 수신 IP를 검사합니다. 다른 서버는 "SMTP 이전 팝업"규범을 사용합니다. 즉, 메시지를 보내기 전에 전자 메일을 다운로드하고 비밀번호를 요구합니다.
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("
");
out.print(str.replaceAll("
", "\r
"));
out.flush();
}
private void receive() {
String line = in.nextLine();
comm.append(line);
comm.append("
");
}
}
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;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
React 구성 요소에서 소켓 이벤트 리스너가 여러 번 실행됩니다.기본적이지만 종종 간과되는 사이드 프로젝트를 하면서 배운 것이 있습니다. 이 프로젝트에는 단순히 두 가지 주요 부분이 포함되어 있습니다. 프런트 엔드: 반응 및 재료 UI 백엔드: Express, Typescript...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.