java使用smtp協議傳送郵件注意的問題
公司經常遇到傳送郵件的問題,普通郵件傳送就不說了,說一下無賬號密碼傳送郵件的過程,在這裡總結一下:
smtp傳送郵件過程
這部分說明是從網上摘抄的,寫的很詳細,我就貼過來修改了一下:
使用smtp協議傳送郵件給郵件伺服器時規定了要做以下幾件事:
1、使用"ehlo"命令和連線上的smtp伺服器打聲招呼,例如:
ehlo zqz
命令格式為 “ehlo 當前計算機的hostname”; zqz即為當前計算機的主機名;
2、使用"auth login"命令登入到Smtp伺服器,登入使用的使用者名稱和密碼必須經過Base64加密,例如:
①、輸入命令:auth login
②、輸入使用Base64加密過後的使用者名稱:Z2FjbA==
③、輸入Base64加密過後的密碼:MTIzNDU2
說明:好多企業內部郵箱不需要設定使用者名稱密碼,一般都是將傳送郵件的伺服器ip列入白名單,那麼這一步就可以省略;
3、指明郵件的發件人和收件人
mail from:<
rcpt to:<[email protected]>
4、編寫要傳送的郵件內容,郵件的編寫格式是有一定的規則的,一封格式良好的郵件應該包含郵件頭和郵件的主體內容。
郵件頭使用下面的三個欄位來指明:
- from欄位用於指明郵件的傳送人
- to欄位用於指明郵件的收件人
- subject欄位用於指明郵件的主題
郵件的內容包含了這些資訊之後才是一封格式良好的郵件。
①、輸入"data"命令
data
②、編寫郵件內容
Cc:[email protected]
From:[email protected] ----郵件頭 郵件傳送者
To:[email protected] ----郵件頭 郵件接收者
Subject:hello test ----郵件頭 郵件標題
----空行
hello test ----郵件的具體內容
5、輸入一個.告訴郵件伺服器郵件內容已經寫完了。
.
6、輸入quit命令斷開與郵件伺服器的連線。
quit
以上的6個步驟就是Smtp協議規定的傳送一封Email必須要做的事情。
下面就用命令列來執行一下整個過程:
[C:\Users\Administrator]$ telnet smtp.tingyun.com 25
Host 'smtp.tingyun.com' resolved to 163.177.72.143.
Connecting to 163.177.72.143:25...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
220 smtp.qq.com Esmtp QQ Mail Server //連線成功後伺服器主動推送的訊息,220為響應程式碼,後面歡迎訊息說明伺服器的域名為smtp.qq.com ,協議為Esmtp ,伺服器名為QQ Mail Server;
ehlo localhost //此命令成功後,伺服器推送支援的認證方式
250-smtp.qq.com
250-PIPELINING
250-SIZE 73400320
250-STARTTLS
250-AUTH LOGIN PLAIN //這裡是伺服器返回的支援的驗證方式 LOGIN 和PLAIN兩種方式
250-AUTH=LOGIN
250-MAILCOMPRESS
250 8BITMIME
auth login //此命令向伺服器發起認證請求
334 VXNlcm5hbWU6 //334代表等待輸入命令 後面字串代表輸入使用者名稱
ZXRwdGVzdEB0aW5neXVuLmNvbQ== //base64的使用者名稱
334 UGFzc3dvcmQ6 //334代表等待輸入命令 後面字串代表輸入密碼
VFl1bjAxMA== //base64的密碼
235 Authentication successful //235代表驗證通過,如果驗證失敗則返回530
mail from:<[email protected]> //誰傳送的郵件
250 Ok
rcpt to:<[email protected]> //誰接收郵件
250 Ok
data //data命令代表郵件正文
354 End data with <CR><LF>.<CR><LF> //354代表可以傳送郵件正文,並提示郵件以"."結尾
From:[email protected] //傳送者
To:[email protected] //接收者
Cc:[email protected] //抄送
Subject:hello test //標題
Content-Type: text/plain
//回車空行 ,此行上面是head,下面是body
hello test. //郵件正文
. // .代表正文結束
250 Ok: queued as
以上紅色部分為我們自己需要輸入的命令列。
qq郵箱收到的郵件:
hello test |
發件人:etptest <[email protected]> |
時 間:2018年5月9日(星期三) 下午5:36 | 純文字 | |
收件人: randolpha <[email protected]> 抄 送: zhuqz <[email protected]> |
hello test.
SMTP協議中HELO和EHLO
HELO是普通SMTP,不帶身份驗證,可以偽造郵件!一般如果不關閉SMTP的話,就可以製造垃圾郵件了,這個已經沒有公司使這種方式了;
EHLO是ESMTP,帶有身份驗證,所以沒法偽造。
java中SMTP協議傳送郵件
SMTP協議傳送郵件使用的是com.sun.mail.smtp.SMTPTransport這個類,建立連線,驗證身份的邏輯在protocolConnect方法裡面;
如果不設定mail.smtp.auth 和 mail.smtp.ehlo ,預設mail.smtp.auth = false,mail.smtp.ehlo=true;
相關的程式碼邏輯在com.sun.mail.smtp.SMTPTransport.protocolConnect()的613行:
// setting mail.smtp.ehlo to false disables attempts to use EHLO
boolean useEhlo = PropUtil.getBooleanSessionProperty(session, "mail." + name + ".ehlo", true);
// setting mail.smtp.auth to true enables attempts to use AUTH
boolean useAuth = PropUtil.getBooleanSessionProperty(session, "mail." + name + ".auth", false);
判斷是否需要執行auth login操作驗證使用者名稱和密碼在第682行:
if ((useAuth || (user != null && passwd != null)) &&
(supportsExtension("AUTH") ||
supportsExtension("AUTH=LOGIN"))) {
connected = authenticate(user, passwd);
注意這裡的判斷條件 ,如果mail.smtp.auth = true 或者 使用者名稱和密碼都不為null;
也就是在以下條件都會程序login驗證:
1. mail.smtp.auth = true ;
2. mail.smtp.auth = false, 但是使用者名稱和密碼都不為null;
所以如果我們不去設定mail.smtp.auth引數(那麼它預設就是false),只要將使用者名稱和密碼設定為null或者非null,即可讓java決定是否需要執行login操作;所以建議不要設定mail.smtp.auth引數,只使用使用者名稱和密碼來控制是否執行login操作;
注意:
1. 對於不需要使用者名稱和密碼傳送郵件的情況,需要將mail.smtp.auth = false或不設定(預設就是fasle),並把userName和password設定為null;
2. 對於exchange郵箱傳送郵件,userName不要設定加@郵箱域名後面的內容,只需要@符號前的使用者名稱即可;
狀態碼查詢
500 格式錯誤,命令不可識別(此錯誤也包括命令列過長)
501 引數格式錯誤
502 命令不可實現
503 錯誤的命令序列
504 命令引數不可實現
211 系統狀態或系統幫助響應
214 幫助資訊
220 <domain> 服務就緒
221 <domain> 服務關閉傳輸通道
421 <domain> 服務未就緒,關閉傳輸通道(當必須關閉時,此應答可以作為對任何命令的響應)
250 要求的郵件操作完成
251 使用者非本地,將轉發向<forward-path>
450 要求的郵件操作未完成,郵箱不可用(例如,郵箱忙)
550 要求的郵件操作未完成,郵箱不可用(例如,郵箱未找到,或不可訪問)
451 放棄要求的操作;處理過程中出錯
551 使用者非本地,請嘗試<forward-path>
452 系統儲存不足,要求的操作未執行
552 過量的儲存分配,要求的操作未執行
553 郵箱名不可用,要求的操作未執行(例如郵箱格式錯誤)
354 開始郵件輸入,以<CRLF>.<CRLF>結束
554 操作失敗
傳送smtp郵件
下面是阿里雲禁用25埠的情況下如何使用465埠smtps協議傳送郵件
相關推薦
java使用smtp協議傳送郵件注意的問題
公司經常遇到傳送郵件的問題,普通郵件傳送就不說了,說一下無賬號密碼傳送郵件的過程,在這裡總結一下: smtp傳送郵件過程 這部分說明是從網上摘抄的,寫的很詳細,我就貼過來修改了一下: 使用smtp協議傳送郵件給郵件伺服器時規定了要做以下幾件事: 1、使用"ehlo
c語言利用SMTP協議傳送郵件
#ifdef WIN32 #include <windows.h> #include <stdio.h> #else #include <stdio.h> #include <sys/types.h> #include
C++ 使用smtp協議傳送郵件的簡單實現
心血來潮,簡單實現一個傳送郵件的小程式, 首先實現一個簡單的socket類 標頭檔案 #ifndef _CSOCKET_H_ #define _CSOCKET_H_ #include <sys/socket.h> #include <arpa/inet
C#使用SMTP協議傳送郵件(騰訊企業郵箱)
大部分郵箱都支援使用SMTP協議傳送郵件,使用這種方法可以很方便的在系統開發中傳送郵件。 在C#語言中,傳送郵件的相關類位於System.Net.Mail名稱空間下。 具體過程為建立郵件類MailM
python應用系列教程——python使用smtp協議傳送郵件:html文字郵件、圖片郵件、檔案附件郵件
全棧工程師開發手冊 (作者:欒鵬) python使用smtp協議傳送電子郵件。包含傳送html文字郵件、包含圖片附件的郵件,包含其他檔案附件的郵件。可設定郵件的收發人,主題,內容。並以163郵件為例,分別在python2.7和python3.6下進行試驗。
python通過SMTP協議傳送郵件失敗,報錯505或535
傳送失敗錯誤1:smtplib.SMTPAuthenticationError: (550, b'User has no permission') 我們使用python傳送郵件時相當於自定義客戶端
用Spring的郵件封裝類JavaMailSenderImpl傳送郵件:注意埠號不需要設定(設定了反而linux上釋出後傳送失敗)
===》###注意埠號不需要設定:》加不加埠:window都行,linux加了埠反而發不出去! 是的。配置了埠,Windows沒問題。linux就有問題了。仔細檢視錯誤資訊: 發現是 JavaMail API 程式碼問題。排除了是我的程式碼邏輯問題。 而且是埠超時問題。 看到這
阿里雲Centos7中GitLab使用smtp 163郵箱傳送郵件的注意事宜
1.修改gitlab.rb配置項目錄:/etc/gitlab/gitlab.rb修改:gitlab_rails['smtp_enable'] = truegitlab_rails['smtp_address'] = "smtp.163.com"gitlab_rails['sm
smtp協議 VC實現傳送郵件
利用VC2005實現了郵件傳送,源程式如下: //-------------------------------------------------------SmtpSendEmail.h------------------------------------ #pr
JavaMail使用SMTP協議傳送電子郵件(詳解)
package cn.outofmemory.javamail; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import j
PHPMailer 傳送郵件 gmail注意事項
gmail 注意 1.ssl 2.埠465 3.開啟IMAP https://mail.google.com/mail/u
javax.mail 傳送郵件(工具類)
前言:注意自己郵箱賬號的授權碼 傳送不成功,要設定授權碼(勿掉坑裡) 1.座標 <dependency> <groupId>javax.mail</groupId> <artifactId&
無後臺網站傳送郵件方法(formspree)
<!doctype html> <html> <head> <meta charset="utf-8"> <title>無後臺網站傳送郵件方法(formspree)開通黃金會員才能使用AJAX提交,否則只能使用form提交</titl
Linux系統使用mailx命令傳送郵件
一、環境核實以及準備。 在centos7系統中預設有安裝mailx命令進行系統郵件的傳送。如果沒有相關的命令可以自行通過yum安裝 #yum install mailx -y 使用#ss &nbs
telnet通過smtp傳送郵件
////////////////////////////////////CMD指令////////////////////////////////////////////// cmd telnet smtp.163.com 25 or &nb
註冊成功傳送郵件
前提:確認匯入了jar包:mail.jar *注:網易郵箱給網易郵箱發的較快。 MailUtils.java package com.pb.utils; import java.util.Properties; i
iOS 呼叫系統傳送郵件
第一步 匯入messageUI.framework框架 第二步 匯入標頭檔案 #import <MessageUI/MessageUI.h> 第三步 @property (nonatomic,strong) MFMailComposeViewCon
QQ 傳送郵件
之前也釋出過一篇QQ發郵件的,後來那種方法在阿里雲伺服器中報錯了,查了好久才發現,是阿里雲的伺服器把 25 埠 給封殺了。現在重新做了個功能。 public static string UserName = ""; public static string UserPas
織夢會員註冊郵箱驗證傳送郵件配置教程
環境要求 主機465埠是開啟和放行的 php擴充套件openssl是開啟的 php擴充套件sockets是開啟的 1、QQ郵箱 或者 163郵箱 126郵箱 開啟SMTP服務,拿到授權碼,根據自己的來 QQ郵箱開啟SMTP服務 和 獲取授權碼 163郵箱開啟SM
python傳送郵件給多人
親測,163郵箱不能傳送,我用的qq的 import smtplib from email.mime.text import MIMEText sender = '[email protected]' passwd = '****' receiver = ["[email