DOBON.NET DOBON.NETプログラミング掲示板過去ログ

SMTP-AUTHでのメール送信

環境/言語:[VB.NET 2002]
分類:[.NET]

http://dobon.net/vb/dotnet/internet/smtpmail.html
のようにすれば簡単にメールを送信できますが、
SMTPサーバがSMTP-AUTHだった場合、
認証はどのようにしたらよいのでしょうか。
■No8968に返信(smithさんの記事)
> http://dobon.net/vb/dotnet/internet/smtpmail.html
> のようにすれば簡単にメールを送信できますが、
> SMTPサーバがSMTP-AUTHだった場合、
> 認証はどのようにしたらよいのでしょうか。

SMTP-AUTHということはRFC2554ですね
http://www.puni.net/~mimori/rfc/rfc2554.txt

認証方法について書かれていますよ。
こんにちは中です。

対応して無いんじゃないかな。
使ったことが無いからわからんけど・・・

CDO SMTP-AUTHでは
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=10488&forum=7&2

こんなん引っかかりました。

ま、無難にBASP21なんてのも
http://www.hi-ho.ne.jp/babaq/basp21.html

------------------------------------------------------
中博俊 MSMVP Visual Studio C# Since 2004/04-2005/03, MCP
http://naka.wankuma.com/
http://naka.wankuma.com/blog/
naka@wankuma.com
>http://www.puni.net/~mimori/rfc/rfc2554.txt

読んでみたのですが、とてもむずかしくて意味がよく分かりませんでしたw

>http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=10488&forum=7&2

同じようにYahoo!メールで試してみました。
やはりうまく行きませんね〜。
今もいろいろ試し続けている最中ですが・・・

>http://www.hi-ho.ne.jp/babaq/basp21.html

最終的にはこんなのを使うのもよいかもしれませんが、
使わずになんとかできないものでしょうか。
探せば山ほど見つかるとは思いますが、とりあえず一つ。

The Code Project - SMTP Authentication using System.Web.Mail (CDOSYS) - .NET
http://www.codeproject.com/dotnet/SystemWeb_Mail_SMTP_AUTH.asp
> The Code Project - SMTP Authentication using System.Web.Mail (CDOSYS) - .NET
> http://www.codeproject.com/dotnet/SystemWeb_Mail_SMTP_AUTH.asp

自分ではいくら探してもまったく見つからないので困っていました。
それで、このとおりにやってみたのですが、
FieldsがeMailのメンバではないなどとエラーが出てできません。
もちろん参照設定にSystem.WebやCDOは追加してあります。

それで、そのページのリンクにあった、マイクロソフトの、
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cdosys/html/_cdosys_schema_configuration.asp
のサンプルのようにもやってみたのですが、
ItemプロパティはReadOnlyだとエラーが出てできません。

OSはXP Pro SP2です。
(OSによって異なるかもしれないような話になってきたので)
> それで、このとおりにやってみたのですが、
> FieldsがeMailのメンバではないなどとエラーが出てできません。
> もちろん参照設定にSystem.WebやCDOは追加してあります。

調べてみたところ、Fieldsは.NET Framework 1.1のみでサポートされているということです。失礼しました。

となると、やはりこの様な方法になるでしょうか。

The Code Project - SMTP Login class - C# Programming
http://www.codeproject.com/csharp/smtpauthlogin.asp
さんざん調べて実験を繰り返し続け、
ようやくPOP Before SMTPでのメール送信はできるようになりました。
ただ、POP3へのログインのタイミングが悪いのか、
できるときとできないときがあり不安定ですが・・・
SMTP-AUTHは情報も少なく、相変わらずまったく分かりません。

> 調べてみたところ、Fieldsは.NET Framework 1.1のみでサポートされているということです。失礼しました。
>
> となると、やはりこの様な方法になるでしょうか。
>
> The Code Project - SMTP Login class - C# Programming
> http://www.codeproject.com/csharp/smtpauthlogin.asp

わざわざ調べていただきありがとうございます。
それで、そのページからソースもダウンロードして見てみたのですが、
なにしろ自分が分からないC言語のプログラムである上、自分は英語が苦手で、
自動翻訳なども使ってみたのですが、理解できませんでした。
VBでやるとなるとどのような感じになるのでしょうか。
お手数をおかけしてすみません。
> SMTP-AUTHは情報も少なく、相変わらずまったく分かりません。

ということは、当然rfcはお読みですね?

多分こんな感じになるのではないかというサンプルを書いて見ました。いいかげんですので、概略だけです。

Imports System
Imports System.Net.Sockets
Imports System.Text
Imports System.Web.Mail

Public Class Smtp
Public Shared Sub Main()
Dim mail As New MailMessage
mail.From = "XXX@XXX.XXX"
mail.To = "XXX@XXX.XXX"
mail.Subject = "テスト"
mail.Body = "これはテストです。"

Smtp.SmtpServer = "XXX.XXX.XXX"
Smtp.SmtpPort = 25
Smtp.AuthUserName = "XXX@XXX.XXX"
Smtp.AuthPassword = "XXXXXX"
Smtp.Send(mail)

Console.ReadLine()
End Sub

Public Shared SmtpServer As String = ""
Public Shared SmtpPort As Integer = 25
Public Shared AuthUserName As String = ""
Public Shared AuthPassword As String = ""

Public Shared Sub Send(ByVal mail As MailMessage)
Dim soc As New TcpClient
'接続
soc.Connect(SmtpServer, SmtpPort)
Dim stream As NetworkStream = soc.GetStream()
ReceiveData(stream)

SendData(stream, "EHLO" + vbCrLf)
ReceiveData(stream)

SendData(stream, "AUTH LOGIN" + vbCrLf)
ReceiveData(stream)

SendData(stream, GetBase64String(AuthUserName) + vbCrLf)
ReceiveData(stream)

SendData(stream, GetBase64String(AuthPassword) + vbCrLf)
ReceiveData(stream)

SendData(stream, "MAIL FROM:" + mail.From + vbCrLf)
ReceiveData(stream)

SendData(stream, "RCPT TO:" + mail.To + vbCrLf)
ReceiveData(stream)

SendData(stream, "DATA" + vbCrLf)
ReceiveData(stream)

Dim data As String = ""
data += "From:" + mail.From + vbCrLf
data += "To:" + mail.To + vbCrLf
data += "Subject:=?ISO-2022-JP?B?" + _
GetBase64String(mail.Subject) + "?=" + vbCrLf
data += vbCrLf + mail.Body + vbCrLf + "." + vbCrLf
SendData(stream, data)
ReceiveData(stream)

SendData(stream, "QUIT" + vbCrLf)
ReceiveData(stream)

soc.Close()
End Sub

'データを受信する
Private Shared Function ReceiveData( _
ByVal stream As NetworkStream) As String
Dim enc As Encoding = Encoding.GetEncoding(50220)
Dim data(1024) As Byte
Dim len As Integer
Dim msg As String = ""
Dim ms As New System.IO.MemoryStream

'すべて受信する
Do
'受信
len = stream.Read(data, 0, data.Length)
ms.Write(data, 0, len)
'文字列に変換する
msg = enc.GetString(ms.ToArray())
Loop While stream.DataAvailable OrElse _
Not msg.EndsWith(vbCrLf)

ms.Close()

'表示
Console.Write(("S: " + msg))

Return msg
End Function

'データを送信する
Private Shared Sub SendData( _
ByVal stream As NetworkStream, ByVal msg As String)
Dim enc As Encoding = Encoding.GetEncoding(50220)

'byte型配列に変換
Dim data As Byte() = enc.GetBytes(msg)
'送信
stream.Write(data, 0, data.Length)

'表示
Console.Write(("C: " + msg))
End Sub

Private Shared Function GetBase64String( _
ByVal str As String) As String
Dim enc As Encoding = Encoding.GetEncoding(50220)
Return Convert.ToBase64String(enc.GetBytes(str))
End Function
End Class
おお!
とりあえず、まるごとコピーで正常に送信できました。
あとでじっくり、どのようになっているのか解析させていただきます。
ありがとうございます。

あと、まだ解析していないので何とも言えませんが、少し試した結果、
Smtp.AuthUserName = "XXX@XXX.XXX"
の項目は何が書いてあっても、むしろ空欄でも送信できてしまいます。
これはどうしてなのでしょうか。
mail.From = "XXX@XXX.XXX"
の項目を間違えると送信できないので、
サーバの仕様でユーザ名はここで認証してしまっているのかもしれませんが・・・

> ということは、当然rfcはお読みですね?

8976番の記事で、
> 読んでみたのですが、とてもむずかしくて意味がよく分かりませんでしたw
と書いたとおり、一応読みましたが、
むずかしい内容だったので意味をよく理解できていませんw
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板