I have used the database mailing system to send the email. But i could not figure our whether the email is sent or not - sql-server

I have used the database mailing system to send the email. But i could not figure our whether the email is sent or not.
Is there any system table in sql server 2008 to insert the log whether the mail is sent or not. I want the sent 'email date from' , 'email date to' and Email Sent to. And is there any field that stores the mail sent like 'yes' or 'no'

Take a look at this article here. There are several tables in the msdb (system database) that are useful for tracking outgoing email status. From the article:
The Database Mail external program logs activity and displays the log
through the Windows Application Event Log and the sysmail_event_log
view in the msdb database. To check the status of an e-mail message,
run a query against this view. E-mail messages have one of four
possible statuses: sent, unsent, retrying, and failed.
Further, you can track additional info about the failures if you set the logging level to verbose when you configured your server for database mail.

Related

Sent status database mail with gmail

I have a problem with Database mail, which we are currently trying to change accounts for a database mail with a gmail account.
The problem is when I try to send an email with the wrong email account, the sent_status is always "Sent" in the log.
whereas before, when we used local e-mail, always showed a failed status when we tried it with the wrong e-mail.
SQL Server will just trigger the mail through SMTP, But if you wanna track the delivery status then you should check on SMTP server, which has been used in Mail configuration.

Send an email to current user in SQL Server Agent job when job fails

I have a SQL Job where I want to send an email alert if job fails. I know that for this functionalty I have to Configure Database Mail and than Adjust the properties within the SQL Server Agent. This article gives pretty good detail http://www.sherweb.com/blog/how-to-set-up-database-mail-for-sql-server-job-failures/.
What I want is, instead of setting up an email address to particular user like person1#test.com, I want to send an email to current user. This way who ever logged in to database and runs the job receives the email on job failure.
As I see, there are two benefits of this approach,
i. One particular user won't get flooded with emails. ii. Who ever is running the job can know that job has failed.
For example,
If I set person1#test.com and person2 logs in than on job failure person1 will receive an email. I don't want that. Is there any way that I can do this in SQL Server Agent Job settings. If no than how can I achieve this?
Like SELECT SYSTEM_USER or SELECT SUSER_NAME() gives me current user and use that as outgoing email address.
I think you are confused, if one user will start the job manually then you use a STORE PROCEDURE and there you can get the connected user information.
But pgAgent will run the process automatic and run using the USER you setup on the job.

Testing sp_send_dbmail

Does anyone know if there is a way to setup sql server to send all mail to one specific email address rather than what has been passed into sp_send_dbmail?
I ask as I need to verify what is going to be sent on a system that has customer email addresses and I don't want to actually send the email but rather check the contents.
The customer occasionally go onto this system to test certain things out which may trigger emails. At the moment these email are not sent out to anyone as the system is not setup for mail. I want this to stay the same but instead send all these mails to an internal email address. I don't know all the code that sends emails as there are approx. 3000 stored procedures in this system.
I have been searching on-line but can only find how to setup email.
If you're just looking to verify what will be sent, you can query the msdb.dbo.sysmail_mailitems table:
SELECT *
FROM msdb.dbo.sysmail_mailitems
This table holds the recipients, subject, body, format, query, sent_date, from_address, reply_to, and some other fields. I also suspect, though I haven't test, that if you updated that table to a new recipient email address that you could send them to the one address as you've requested above.
1)You can check mail is started or not using GUI.
2)you check email sending using following command.
Select * from msdb.dbo.sysmail_sentitems order by last_mod_date desc
enter image description here
unable to relay in Exchange Server :- Launch Exchange Server Manager and move to Administrative Groups. Select Administrative Group Name then choose Server>Server Name. Now click on Protocols and Select SMTP.
Right-click on Default SMTP Virtual Server and select Properties
In Access tab, click on Relay>only the list below
Now check the checkbox “Allow all systems to successfully authenticate to relay regardless of the list above” and close. ....check with internal team for permission.

Send automated email

I want to send automated emails to UserType( requester, assignee ,reviewer,admin) based on an insert and.or update in Database.
EX:
A remainder email send to requester, assignee ,reviewer and admin if the reviewer is not able to review the data in 7 days from the date it is assigned to him/her.
I know I can do this with SQL JOB or with Windows Services. But I ma looking for different way to do this if possible and/or does SSIS provide such functionality?
I think another option is to setup the trigger on insert/update of tables that need to be monitored then then called a stored procedure that use msdb.dbo.sp_send_dbmail to send out email.
You can look at the answer in this post for reference on how to send email using sp_send_dbmail.
Sending Email in SQL Server 2008 R2. I hope that helps.

How can I pick up the conversation_id of a message just sent or received?

This answer says:
There is a conversation_id, which is the same at both endpoints.
And there is conversation_handle, which must be different at each
endpoint.
So I thought it would be useful for troubleshooting to write the conversation_id to an audit table at each endpoint of a conversation. That way I could easily track down the audit information at each endpoint for a given conversation.
The problem is where to pick up the conversation_id from. I had originally thought I could look it up from sys.conversation_endpoints against the conversation_handle of the message just sent or received. However, the database users that send and receive messages do not have permissions to see the metadata in sys.conversation_endpoints.
I could get around that by making the users sending and receiving messages database owners but I would prefer not to for security reasons. What are the minimum permissions they would need to see the records in sys.conversation_endpoints? Alternatively, how else could I read the conversation_id of a message that had just been sent or received (from the code doing the sending or receiving, which would not have dbo or sysadmin permissions)?
Edit: I read the Books Online article about Metadata Visibility Configuration which states
the visibility of metadata is limited to securables that a user either owns or on which the user has been granted some permission
For catalog views such as sys.tables or sys.procedures it's fairly obvious what the securables are that the user needs to be granted permission to. But what are the securables listed in sys.conversation_endpoints: conversations, conversation endpoints? And how do you grant permissions to them? The user already has permission to begin a dialog or end a conversation so I would have thought it would already have adequate permission on a conversation.
The best place to get it is from sys.conversation_endpoints.
Whenever you are faced with the issue that your application requires privileges not held by the current user the best option is to leverage code signing. SQL Server allows an administrator to inspect and sign stored procedures, using certificates, and grant permissions to the signature. This allows an user to invoke the procedure and the procedure can access information not directly accessible to the user.
See signing Activated Procedures for an example.
As to why you can't see your own conversations: imho it's a bug. Running sp_helptext 'sys.conversation_endpoints' shows the permissions filter applied:
CREATE VIEW sys.conversation_endpoints AS
SELECT ce.conversation_handle,
...
FROM sys.conversation_endpoints$ ce
LEFT JOIN sys.syssingleobjrefs f
ON f.depid = ce.service_id
AND f.class = 21
AND f.depsubid = 0 -- SRC_SVCTOQUEUE
WHERE has_access('CO', f.indepid) = 1
The view shows conversations for which the user has CONTROL access over the queue of the service to which the dialog belongs (it takes some know-how about syssingleobjrefs to understand what the view condition is, but that what it translates to). The permission check should be for RECEIVE permission, because that is the permission required to BEGIN DIALOG/SEND/END messages on this service:
To begin a dialog, the current user must have RECEIVE permission on the queue for the service specified in the FROM clause of the command and REFERENCES permission for the contract specified
To send a message, the current user must have RECEIVE permission on the queue of every service that sends the message.
The MSND is actually wrong on the topic of END CONVERSATION permissions when it says 'To end an active conversation, the current user must be the owner of the conversation, a member of the sysadmin fixed server role or a member of the db_owner fixed database role'. The required permission is the same as one for SEND (this can be easily tested).
It can be easily argued that if you can manipulate a securable (and SEND, END are clearly manipulating conversations) then one should be able to see the metadata of the securable being manipulated.

Resources